Module:Match/Dota: Difference between revisions

From TwogPedia
mNo edit summary
mNo edit summary
 
(20 intermediate revisions by the same user not shown)
Line 1: Line 1:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local cargo = mw.ext.cargo
local cargo = mw.ext.cargo
local html = require('Module:MatchHTML')
local DotaMatch = {}
local DotaMatch = {}
local heroesData = mw.loadData('Module:Data/Dota/Heroes')
local heroesData = mw.loadData('Module:Data/Dota/Heroes')
Line 22: Line 21:
local dire = map.dire or 'unknown'
local dire = map.dire or 'unknown'
local picks = mw.html.create('div'):addClass('details-game')
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 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 p2picks = mw.html.create('div'):addClass(dire == '2' and 'details-picks dire' or 'details-picks radiant')
local iconSize = '25px'
local iconSize = '28px'
-- Loop through first teams picks
-- Loop through first teams picks
if map.p1picks then
if map.p1picks then
local p1picksSplit = mw.text.split(map.p1picks, ',')
local p1picksSplit = mw.text.split(map.p1picks, ',')
local p1playersSplit = map.p1players and mw.text.split(map.p1players, ',') or {}
for j = 1, #p1picksSplit do
for j = 1, #p1picksSplit do
local hero = getHero(mw.text.trim(p1picksSplit[j]))
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:wikitext('[[File:' .. w .. '-icon.png|20px]]')
p1picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]'))
p1picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. title .. '|link=]]'))
end
end
end
end
Line 44: Line 46:
if map.p2picks then
if map.p2picks then
local p2picksSplit = mw.text.split(map.p2picks, ',')
local p2picksSplit = mw.text.split(map.p2picks, ',')
local p2playersSplit = map.p2players and mw.text.split(map.p2players, ',') or {}
for j = 1, #p2picksSplit do
for j = 1, #p2picksSplit do
local hero = getHero(mw.text.trim(p2picksSplit[j]))
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]]')
--p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]')
p2picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]'))
p2picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. title .. '|link=]]'))
end
end
end
end
hover:node(picks:node(p1picks):node(duration):node(p2picks))
hover:node(picks:node(p1picks):node(duration):node(p2picks))
 
hover:node(mw.html.create('div'):wikitext('Map ' .. i .. ' bans'))
    if map.p1bans or map.p2bans then
local bans = mw.html.create('div'):addClass('details-game')
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 p1bans = mw.html.create('div'):addClass('details-picks'):addClass( dire == '1' and 'details-picks dire' or 'details-picks radiant')
Line 63: Line 68:
local hero = getHero(mw.text.trim(p1bansSplit[j]))
local hero = getHero(mw.text.trim(p1bansSplit[j]))
--p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]')
--p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]')
p1bans:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]'))
p1bans:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. '|link=]]'))
end
end
end
end
Line 73: Line 78:
local hero = getHero(mw.text.trim(p2bansSplit[j]))
local hero = getHero(mw.text.trim(p2bansSplit[j]))
--p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]')
--p1picks:wikitext('[[File:' .. w .. '-icon.png|20px]]')
p2bans:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. ']]'))
p2bans:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. hero .. '|link=]]'))
end
end
end
end
hover:node(bans:node(p1bans):node(p2bans))
   
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)))
end
return ''
return ''
Line 85: Line 91:
function DotaMatch.picksBans(maps, p1_api, p2_api, hover, results, frame)
function DotaMatch.picksBans(maps, p1_api, p2_api, hover, results, frame)
if #maps > 0 then
if #maps > 0 then
local isNotTranscluded = not VariablesLua.varexists('transclude') or VariablesLua.var('transclude') == '0'
for i = 1, #maps do
for i = 1, #maps do
local map = maps[i]
local map = maps[i]
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 = {
-- Go through normal picks and bans and turn them into proper hero names
where = whereStr
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
local results = cargo.query(tables, fields, cargoArgs)
if map.p2bans then listToNames(map, map.p2bans, "p2bans") end
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
-- Only enter to db if page is not being transcluded
local pickBans = mapData.__json.picks_bans
if isNotTranscluded and #results > 0 then
map.p1picks = ''
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}}
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
end
 
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, p2picks = map.p2picks, 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}}
DotaMatch.main(map, hover, i)
DotaMatch.main(map, hover, i, results)
end
end
    
    
Line 188: Line 120:
for i = 1, #split do  
for i = 1, #split do  
map[var] = map[var] .. getHero(mw.text.trim(split[i])) .. ','
map[var] = map[var] .. getHero(mw.text.trim(split[i])) .. ','
        map[var] = removeEndComma(map[var])
end
end
map[var] = removeEndComma(map[var])
end
end



Latest revision as of 19:26, 11 March 2024

Documentation for this module may be created at Module:Match/Dota/doc

local getArgs = require('Module:Arguments').getArgs
local cargo = mw.ext.cargo
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 .. '|link=]]'))
		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 .. '|link=]]'))
		end
	end
	hover:node(picks:node(p1picks):node(duration):node(p2picks))

    if map.p1bans or map.p2bans then
	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 .. '|link=]]'))
		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 .. '|link=]]'))
		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)))
	end
	
	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 > 0 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