Documentation for this module may be created at Module:Match/Dota/doc
local getArgs = require('Module:Arguments').getArgs local cargo = mw.ext.cargo local html = require('Module:MatchHTML') local DotaMatch = {} local heroesData = mw.loadData('Module:Data/Dota/Heroes') local VariablesLua = mw.ext.VariablesLua function DotaMatch.main(map, hover, i) -- add picks/bans to hover hover:node(mw.html.create('div'):wikitext('Map ' .. i .. ' picks')) local picks = mw.html.create('div'):addClass('details-game') local p1picks = mw.html.create('div'):addClass('details-picks') local p2picks = mw.html.create('div'):addClass('details-picks') local iconSize = '25px' -- Loop through first teams picks if map.p1picks then local p1picksSplit = mw.text.split(map.p1picks, ',') for j = 1, #p1picksSplit do local hero = getHero(mw.text.trim(p1picksSplit[j])) --p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]') p1picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]')) end end -- create the duration/winner part local duration = mw.html.create('div'):addClass('details-duration') :node(mw.html.create('div'):wikitext(map.winner == '1' and 'W' or '')) :node(mw.html.create('div'):wikitext(map.duration)) :node(mw.html.create('div'):wikitext(map.winner == '2' and 'W' or '')) -- Loop through second teams picks if map.p2picks then local p2picksSplit = mw.text.split(map.p2picks, ',') for j = 1, #p2picksSplit do local hero = getHero(mw.text.trim(p2picksSplit[j])) --p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]') p2picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]')) end end hover:node(picks:node(p1picks):node(duration):node(p2picks)) hover:node(mw.html.create('div'):wikitext('Map ' .. i .. ' bans')) local bans = mw.html.create('div'):addClass('details-game') local p1bans = mw.html.create('div'):addClass('details-picks') local p2bans = mw.html.create('div'):addClass('details-picks') -- Loop through first teams bans if map.p1bans then local p1bansSplit = mw.text.split(map.p1bans, ',') for j = 1, #p1bansSplit do local hero = getHero(mw.text.trim(p1bansSplit[j])) --p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]') p1bans:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]')) end end -- Loop through second teams bans if map.p2bans then local p2bansSplit = mw.text.split(map.p2bans, ',') for j = 1, #p2bansSplit do local hero = getHero(mw.text.trim(p2bansSplit[j])) --p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]') p2bans:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]')) end end hover:node(bans:node(p1bans):node(p2bans)) -- VODs etc hover:node(mw.html.create('div'):wikitext('VOD links etc')) return '' end function DotaMatch.picksBans(map, p1_api, p2_api) if map.id and map.winner and not map.p1picks and not map.p1bans then local tables = 'Maps_Dota' local fields = 'winner, p1picks, p2picks, p1bans, p2bans, dire, fp, p1kills, p2kills, duration' local whereStr = 'api_id="' .. map.id .. '" AND winner IS NOT NULL' local cargoArgs = { where = whereStr } local results = cargo.query(tables, fields, cargoArgs) if #results == 0 then local mapData = mw.ext.externaldata.getWebData({ format = 'json', url = 'https://api.opendota.com/api/matches/' .. map.id }) if mapData.__json.picks_bans then local pickBans = mapData.__json.picks_bans map.p1picks = '' map.p2picks = '' map.p1bans = '' map.p2bans = '' local fp = nil for j = 1, #pickBans do local selection = pickBans[j] if j == 1 then fp = selection.team end if selection.is_pick then map['p' .. selection.team + 1 .. 'picks'] = map['p' .. selection.team + 1 .. 'picks'] .. getHero(selection.hero_id) .. ',' else map['p' .. selection.team + 1 .. 'bans'] = map['p' .. selection.team + 1 .. 'bans'] .. getHero(selection.hero_id) .. ',' end end map.p1picks = removeEndComma(map.p1picks) map.p2picks = removeEndComma(map.p2picks) map.p1bans = removeEndComma(map.p1bans) map.p2bans = removeEndComma(map.p2bans) local dire_id = mapData.__json.dire_team_id local dire = dire_id == p1_api and 1 or dire_id == p2_api and 2 or nil if not map.dire and dire then map.dire = dire end if not map.fp and fp ~= nil then if fp == 0 then map.fp = dire == 1 and 2 or 1 else map.fp = dire end end local radiantKills = mapData.__json.radiant_score local direKills = mapData.__json.dire_score if not map.p1kills then map.p1kills = dire == 1 and direKills or radiantKills end if not map.p2kills then map.p2kills = dire == 2 and direKills or radiantKills end local duration = mapData.__json.duration local seconds = duration % 60 local minutes = (duration - seconds) / 60 if seconds < 10 then seconds = "0" .. tostring(seconds) end map.duration = minutes .. ':' .. seconds end else map.p1picks = results[1].p1picks map.p2picks = results[1].p2picks map.p1bans = results[1].p1bans map.p2bans = results[1].p2bans map.dire = results[1].dire map.fp = results[1].fp map.p1kills = results[1].p1kills map.p2kills = results[1].p2kills map.duration = results[1].duration end else -- Go through normal picks and bans and turn them into proper hero names if map.p1picks then listToNames(map, map.p1picks, "p1picks")end if map.p2picks then listToNames(map, map.p2picks, "p2picks")end if map.p1bans then listToNames(map, map.p1bans, "p1bans")end if map.p2bans then listToNames(map, map.p2bans, "p2bans")end end return map end function listToNames(map, list, var) local split = mw.text.split(list, ',') map[var] = '' for i = 1, #split do map[var] = map[var] .. getHero(mw.text.trim(split[i])) .. ',' map[var] = removeEndComma(map[var]) end end function getHero(idOrName) if type(idOrName) == "string" then idOrName = string.lower(idOrName) end for _, hero in ipairs(heroesData) do if hero.id == idOrName then return hero.localized_name else for _, name in ipairs(hero.names) do if name == idOrName then return hero.localized_name end end end end return "Hero not found " .. idOrName end function removeEndComma(inputString) -- Use the string.match function to check if the string ends with a comma if inputString:match(",$") then -- If it does, use string.sub to remove the last character (the comma) return inputString:sub(1, -2) else -- If not, return the input string as it is return inputString end end return DotaMatch