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 -- add picks/bans to hover function DotaMatch.main(map, hover, i) local mapHeader = mw.html.create('div'):wikitext('Map ' .. i .. ' '):attr('style', 'font-size: 0.9rem;') -- VODs etc if map.yt then mapHeader:wikitext('[[File:Youtube.png|20x20px|https://www.youtube.com/watch?v=' .. map.yt .. ']]') end if map.id then mapHeader:wikitext('[[File:Dotabuff.png|20x20px|https://www.dotabuff.com/matches/' .. map.id .. ']]') mapHeader:wikitext('[[File:Datdota.png|20x20px|https://www.datdota.com/matches/' .. map.id .. ']]') mapHeader:wikitext('[[File:Stratz.png|20x20px|https://stratz.com/matches/' .. map.id .. ']]') end hover:node(mapHeader) local dire = map.dire or 'unknown' local picks = mw.html.create('div'):addClass('details-game') local p1picks = mw.html.create('div'):addClass(dire == '1' and 'details-picks dire' or 'details-picks radiant') local p2picks = mw.html.create('div'):addClass(dire == '2' and 'details-picks dire' or 'details-picks radiant') local iconSize = '28px' -- Loop through first teams picks if map.p1picks then local p1picksSplit = mw.text.split(map.p1picks, ',') local p1playersSplit = map.p1players and mw.text.split(map.p1players, ',') or {} for j = 1, #p1picksSplit do local hero = getHero(mw.text.trim(p1picksSplit[j])) local title = hero if p1playersSplit[j] then title = title .. ' - ' .. (string.find(p1playersSplit[j], 'People/') and string.gsub(p1playersSplit[j], 'People/', '') or 'Api ID: ' .. p1playersSplit[j]) end --p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]') p1picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. title .. ']]')) 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'):node(mw.html.create('abbr'):attr('title', 'Map duration'):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, ',') local p2playersSplit = map.p2players and mw.text.split(map.p2players, ',') or {} for j = 1, #p2picksSplit do local hero = getHero(mw.text.trim(p2picksSplit[j])) local title = hero if p2playersSplit[j] then title = title .. ' - ' .. (string.find(p2playersSplit[j], 'People/') and string.gsub(p2playersSplit[j], 'People/', '') or 'Api ID: ' .. p2playersSplit[j]) end --p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]') p2picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. title .. ']]')) end end hover:node(picks:node(p1picks):node(duration):node(p2picks)) local bans = mw.html.create('div'):addClass('details-game') local p1bans = mw.html.create('div'):addClass('details-picks'):addClass( dire == '1' and 'details-picks dire' or 'details-picks radiant') local p2bans = mw.html.create('div'):addClass('details-picks'):addClass( dire == '2' and 'details-picks dire' or 'details-picks radiant') -- 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(mw.html.create('div'):addClass('w-100'):wikitext('Bans')):node(mw.html.create('div'):addClass('w-100'):node(p1bans):node(p2bans))) return '' end function DotaMatch.picksBans(maps, p1_api, p2_api, hover, results, frame) if #maps > 0 then local isNotTranscluded = not VariablesLua.varexists('transclude') or VariablesLua.var('transclude') == '0' for i = 1, #maps do local map = maps[i] -- 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 -- Only enter to db if page is not being transcluded if isNotTranscluded and results then frame:callParserFunction{name = '#cargo_store:', args = {_table = 'Maps_Dota', map=i, api_id = map.id, matchID = results[1]._ID, duration = map.duration, p1picks = map.p1picks, p1players = map.p1players, p2picks = map.p2picks, p2players = map.p2players, p1bans = map.p1bans, p2bans = map.p2bans, dire = map.dire, fp = map.fp, winner = map.winner, p1kills = map.p1kills, p2kills = map.p2kills, yt = map.yt, vod = map.vod}} end DotaMatch.main(map, hover, i) 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])) .. ',' end map[var] = removeEndComma(map[var]) 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