mNo edit summary |
mNo edit summary |
||
(27 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 DotaMatch = {} | local DotaMatch = {} | ||
local heroesData = mw.loadData('Module:Data/Dota/Heroes') | local heroesData = mw.loadData('Module:Data/Dota/Heroes') | ||
local VariablesLua = mw.ext.VariablesLua | 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' | |||
hover:node( | |||
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('details-picks') | local p1picks = mw.html.create('div'):addClass(dire == '1' and 'details-picks dire' or 'details-picks radiant') | ||
local p2picks = mw.html.create('div'):addClass('details-picks') | local p2picks = mw.html.create('div'):addClass(dire == '2' and 'details-picks dire' or 'details-picks radiant') | ||
local iconSize = ' | 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 .. '|' .. | p1picks:node(mw.html.create('div'):wikitext('[[File:' .. hero .. '.png|' .. iconSize .. '|' .. title .. '|link=]]')) | ||
end | end | ||
end | end | ||
Line 27: | Line 40: | ||
local duration = mw.html.create('div'):addClass('details-duration') | 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.winner == '1' and 'W' or '')) | ||
:node(mw.html.create('div'):wikitext(map.duration)) | :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 '')) | :node(mw.html.create('div'):wikitext(map.winner == '2' and 'W' or '')) | ||
Line 33: | 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 .. '|' .. | 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)) | ||
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') | 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') | 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 | -- Loop through first teams bans | ||
Line 52: | 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 62: | 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( | |||
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 '' | ||
end | end | ||
function DotaMatch.picksBans( | function DotaMatch.picksBans(maps, p1_api, p2_api, hover, results, frame) | ||
if | if #maps > 0 then | ||
local | local isNotTranscluded = not VariablesLua.varexists('transclude') or VariablesLua.var('transclude') == '0' | ||
for i = 1, #maps do | |||
local | 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 | 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 | end | ||
DotaMatch.main(map, hover, i) | |||
end | end | ||
end | end | ||
return map | |||
end | end | ||
Line 169: | Line 121: | ||
map[var] = map[var] .. getHero(mw.text.trim(split[i])) .. ',' | map[var] = map[var] .. getHero(mw.text.trim(split[i])) .. ',' | ||
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