Module:Match/Dota: Difference between revisions

From TwogPedia
mNo edit summary
mNo edit summary
Line 74: Line 74:
end
end


function DotaMatch.picksBans(map)
function DotaMatch.picksBans(map, p1_api, p2_api)
if map.id and map.winner and not map.p1picks and not map.p1bans then
if map.id and map.winner and not map.p1picks and not map.p1bans then
local tables = 'Maps_Dota'
local tables = 'Maps_Dota'
local fields = 'winner, p1picks, p2picks, p1bans, p2bans, duration'
local fields = 'winner, p1picks, p2picks, p1bans, p2bans, dire, fp, p1kills, p2kills, duration'
local whereStr = 'api_id="' .. map.id .. '" AND winner IS NOT NULL'
local whereStr = 'api_id="' .. map.id .. '" AND winner IS NOT NULL'
Line 98: Line 98:
map.p1bans = ''
map.p1bans = ''
map.p2bans = ''
map.p2bans = ''
local fp = nil
for j = 1, #pickBans do
for j = 1, #pickBans do
local selection = pickBans[j]
local selection = pickBans[j]
if j == 1 then fp = selection.team end
if selection.is_pick then  
if selection.is_pick then  
map['p' .. selection.team + 1 .. 'picks'] = map['p' .. selection.team + 1 .. 'picks'] .. getHero(selection.hero_id) .. ','
map['p' .. selection.team + 1 .. 'picks'] = map['p' .. selection.team + 1 .. 'picks'] .. getHero(selection.hero_id) .. ','
Line 111: Line 113:
                 map.p1bans = removeEndComma(map.p1bans)
                 map.p1bans = removeEndComma(map.p1bans)
                 map.p2bans = removeEndComma(map.p2bans)
                 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 duration = mapData.__json.duration
local seconds = duration % 60
local seconds = duration % 60
Line 124: Line 147:
map.p1bans = results[1].p1bans
map.p1bans = results[1].p1bans
map.p2bans = results[1].p2bans
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
map.duration = results[1].duration
end
end

Revision as of 06:46, 14 October 2023

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
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
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