mNo edit summary |
mNo edit summary |
||
(One intermediate revision by the same user not shown) | |||
Line 5: | Line 5: | ||
local stringifyDate = Func.stringifyDate | local stringifyDate = Func.stringifyDate | ||
local prizeToString = Func.prizeToString | local prizeToString = Func.prizeToString | ||
local getTeamDisplaytitle = Func.getTeamDisplaytitle | |||
local Flags = require('Module:Flags') | local Flags = require('Module:Flags') | ||
Line 13: | Line 14: | ||
function p.main(frame) | function p.main(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
local currentTitle = mw.title.getCurrentTitle().text | |||
local | local split = mw.text.split(currentTitle, '/') | ||
local | local currentPage = split[1] .. '/' .. split[2] | ||
local | local parentDT = mw.ext.displaytitle.get(currentPage) | ||
local newDT = parentDT .. ' - Results' | |||
local | local seoArgs = { | ||
local | title_mode = 'replace', | ||
title = newDT .. ' {{!}} TwogPedia', | |||
description = 'Detailed results of tournaments and matches for ' .. parentDT, | |||
keywords = parentDT .. ',results,matches, placements' | |||
} | } | ||
mw.ext.displaytitle.set(newDT) | |||
local | local team = split[1] ~= 'People' and currentPage or nil | ||
return container | -- If a player page, then check if | ||
local soloResults = nil | |||
local types = 0 | |||
if not team then | |||
-- Check if participated in solo tournaments | |||
local tables = 'Participants, Tournaments' | |||
local fields = 'Participants.team=team, Tournaments._pageName=_pageName, Tournaments.type=type, Tournaments.start=start, Tournaments.end=end, Tournaments.prize=prize, Tournaments.country=country, Tournaments.participants=participants, Tournaments.formatFilter=formatFilter, Tournaments.logoAll=logoAll, Tournaments.logoLight=logoLight, Tournaments.logoDark=logoDark, Tournaments.iconAll=iconAll, Tournaments.iconLight=iconLight, Tournaments.iconDark=iconDark' | |||
local cargoArgs = { | |||
join = 'Participants._pageName=Tournaments._pageName', | |||
where = 'Participants.players HOLDS "' .. currentPage .. '" AND team IS NULL', | |||
orderBy = 'Tournaments.end desc' | |||
} | |||
local results = cargo.query(tables, fields, cargoArgs) | |||
if #results > 0 then | |||
types = types + 1 | |||
soloResults = mw.html.create('div') | |||
createTable(results, soloResults, currentPage) | |||
end | |||
-- Check for all tournaments where player is part of a team | |||
local teamResults = nil | |||
cargoArgs.where = 'Participants.players HOLDS "' .. currentPage .. '" AND team IS NOT NULL' | |||
results = cargo.query(tables, fields, cargoArgs) | |||
if #results > 0 then | |||
teamResults = mw.html.create('div') | |||
types = types + 1 | |||
createTable(results, teamResults, results[1]._pageName, true) | |||
end | |||
if types > 1 then | |||
local str = '<tabber>' | |||
if soloResults then | |||
str = str .. '|-|Solo tournaments=' .. tostring(soloResults) | |||
end | |||
if teamResults then | |||
str = str .. '|-|Team tournaments=' .. tostring(teamResults) | |||
end | |||
str = str .. '</tabber>' | |||
return mw.html.create('div'):node(frame:preprocess(str)) | |||
else | |||
local container = mw.html.create('div') | |||
if soloResults then | |||
container:node(soloResults) | |||
end | |||
if teamResults then | |||
container:node(teamResults) | |||
end | |||
return container | |||
end | |||
else | |||
local tables = 'Participants, Tournaments' | |||
local fields = 'Tournaments._pageName=_pageName, Tournaments.type=type, Tournaments.start=start, Tournaments.end=end, Tournaments.prize=prize, Tournaments.country=country, Tournaments.participants=participants, Tournaments.formatFilter=formatFilter, Tournaments.logoAll=logoAll, Tournaments.logoLight=logoLight, Tournaments.logoDark=logoDark, Tournaments.iconAll=iconAll, Tournaments.iconLight=iconLight, Tournaments.iconDark=iconDark' | |||
local cargoArgs = { | |||
join = 'Participants._pageName=Tournaments._pageName', | |||
where = 'Participants.team="' .. currentPage .. '"', | |||
orderBy = 'Tournaments.end desc' | |||
} | |||
local results = cargo.query(tables, fields, cargoArgs) | |||
if #results > 0 then | |||
local tournament = results[1] | |||
local icon = tournament.iconAll or tournament.iconLight or tournament.iconDark or tournament.logoAll or tournament.logoDark or tournament.logoLight | |||
local container = mw.html.create('div') | |||
createTable(results, container, currentPage, team) | |||
return container | |||
end | |||
end | end | ||
Line 57: | Line 125: | ||
for i = 1, #results do | for i = 1, #results do | ||
local result = results[i] | local result = results[i] | ||
if team and result.team then | |||
page = result.team | |||
game = mw.text.split(page, '/')[1] | |||
end | |||
local icon = result.iconAll ~= '' and result.iconAll or result.iconLight ~= '' and result.iconLight or result.iconDark ~= '' and result.iconDark or result.logoAll ~= '' and result.logoAll or result.logoDark ~= '' and result.logoDark or result.logoLight ~= '' and result.logoLight | local icon = result.iconAll ~= '' and result.iconAll or result.iconLight ~= '' and result.iconLight or result.iconDark ~= '' and result.iconDark or result.logoAll ~= '' and result.logoAll or result.logoDark ~= '' and result.logoDark or result.logoLight ~= '' and result.logoLight | ||
if not icon then icon = 'Tournament_placeholder.png' end | if not icon then icon = 'Tournament_placeholder.png' end | ||
Line 69: | Line 141: | ||
local placementTd = mw.html.create('td') | local placementTd = mw.html.create('td') | ||
local tournamentType = result.type and mw.text.split(result.type, ',') | local tournamentType = result.type and mw.text.split(result.type, ',') or {} | ||
for j = 1, #tournamentType do | for j = 1, #tournamentType do | ||
typeTd:node(mw.html.create('div'):wikitext(tournamentType[j])) | typeTd:node(mw.html.create('div'):wikitext(tournamentType[j])) | ||
Line 201: | Line 273: | ||
local dateTd = mw.html.create('td'):wikitext(stringifyDate(result.date) .. ' '):node(mw.html.create('abbr'):attr('title', 'Coordinated Universal Time'):wikitext('UTC')) | local dateTd = mw.html.create('td'):wikitext(stringifyDate(result.date) .. ' '):node(mw.html.create('abbr'):attr('title', 'Coordinated Universal Time'):wikitext('UTC')) | ||
local scoreTd = mw.html.create('td'):addClass('tc'):wikitext(score .. ':' .. opponentScore) | local scoreTd = mw.html.create('td'):addClass('tc'):wikitext(score .. ':' .. opponentScore) | ||
local vsTd = mw.html.create('td | local vsTd = mw.html.create('td') | ||
if team then vsTd:node(mw.html.create('div'):attr('style', 'display: flex; gap: 0.2rem; align-items: center;'):node(getTeamLogo(opponent, game, '20x20px')):wikitext('[[' .. opponent .. ']]')) else vsTd:wikitext('[[' .. opponent .. ']]') end | if team then vsTd:node(mw.html.create('div'):attr('style', 'display: flex; gap: 0.2rem; align-items: center; justify-content: center;'):node(getTeamLogo(opponent, game, '20x20px')):wikitext('[[' .. opponent .. '|' .. getTeamDisplaytitle(opponent, result.date) ..']]')) else vsTd:wikitext('[[' .. opponent .. ']]') end | ||
local vodTd = mw.html.create('td') | local vodTd = mw.html.create('td') | ||
local resultRow = mw.html.create('tr'):addClass('bodyRow'):node(dateTd):node(scoreTd):node(vsTd):node(vodTd) | local resultRow = mw.html.create('tr'):addClass('bodyRow'):node(dateTd):node(scoreTd):node(vsTd):node(vodTd) | ||
Line 221: | Line 293: | ||
local vod = vods[j] | local vod = vods[j] | ||
if vod.yt then | if vod.yt then | ||
vodTd:wikitext('[[File:Youtube.png|20x20px|https://www.youtube.com/watch?v=' .. vod.yt .. '|Map ' .. j .. ']]') | vodTd:wikitext('[[File:Youtube.png|20x20px|link=https://www.youtube.com/watch?v=' .. vod.yt .. '|Map ' .. j .. ']]') | ||
end | end | ||
end | end |
Latest revision as of 20:11, 12 November 2023
Documentation for this module may be created at Module:AllResults/doc
local getArgs = require('Module:Arguments').getArgs local cargo = mw.ext.cargo local Func = require('Module:Functions') local getTeamLogo = Func.getTeamLogo local stringifyDate = Func.stringifyDate local prizeToString = Func.prizeToString local getTeamDisplaytitle = Func.getTeamDisplaytitle local Flags = require('Module:Flags') local p = {} local currentDate = os.date('%Y-%m-%d') function p.main(frame) local args = getArgs(frame) local currentTitle = mw.title.getCurrentTitle().text local split = mw.text.split(currentTitle, '/') local currentPage = split[1] .. '/' .. split[2] local parentDT = mw.ext.displaytitle.get(currentPage) local newDT = parentDT .. ' - Results' local seoArgs = { title_mode = 'replace', title = newDT .. ' {{!}} TwogPedia', description = 'Detailed results of tournaments and matches for ' .. parentDT, keywords = parentDT .. ',results,matches, placements' } mw.ext.displaytitle.set(newDT) local team = split[1] ~= 'People' and currentPage or nil -- If a player page, then check if local soloResults = nil local types = 0 if not team then -- Check if participated in solo tournaments local tables = 'Participants, Tournaments' local fields = 'Participants.team=team, Tournaments._pageName=_pageName, Tournaments.type=type, Tournaments.start=start, Tournaments.end=end, Tournaments.prize=prize, Tournaments.country=country, Tournaments.participants=participants, Tournaments.formatFilter=formatFilter, Tournaments.logoAll=logoAll, Tournaments.logoLight=logoLight, Tournaments.logoDark=logoDark, Tournaments.iconAll=iconAll, Tournaments.iconLight=iconLight, Tournaments.iconDark=iconDark' local cargoArgs = { join = 'Participants._pageName=Tournaments._pageName', where = 'Participants.players HOLDS "' .. currentPage .. '" AND team IS NULL', orderBy = 'Tournaments.end desc' } local results = cargo.query(tables, fields, cargoArgs) if #results > 0 then types = types + 1 soloResults = mw.html.create('div') createTable(results, soloResults, currentPage) end -- Check for all tournaments where player is part of a team local teamResults = nil cargoArgs.where = 'Participants.players HOLDS "' .. currentPage .. '" AND team IS NOT NULL' results = cargo.query(tables, fields, cargoArgs) if #results > 0 then teamResults = mw.html.create('div') types = types + 1 createTable(results, teamResults, results[1]._pageName, true) end if types > 1 then local str = '<tabber>' if soloResults then str = str .. '|-|Solo tournaments=' .. tostring(soloResults) end if teamResults then str = str .. '|-|Team tournaments=' .. tostring(teamResults) end str = str .. '</tabber>' return mw.html.create('div'):node(frame:preprocess(str)) else local container = mw.html.create('div') if soloResults then container:node(soloResults) end if teamResults then container:node(teamResults) end return container end else local tables = 'Participants, Tournaments' local fields = 'Tournaments._pageName=_pageName, Tournaments.type=type, Tournaments.start=start, Tournaments.end=end, Tournaments.prize=prize, Tournaments.country=country, Tournaments.participants=participants, Tournaments.formatFilter=formatFilter, Tournaments.logoAll=logoAll, Tournaments.logoLight=logoLight, Tournaments.logoDark=logoDark, Tournaments.iconAll=iconAll, Tournaments.iconLight=iconLight, Tournaments.iconDark=iconDark' local cargoArgs = { join = 'Participants._pageName=Tournaments._pageName', where = 'Participants.team="' .. currentPage .. '"', orderBy = 'Tournaments.end desc' } local results = cargo.query(tables, fields, cargoArgs) if #results > 0 then local tournament = results[1] local icon = tournament.iconAll or tournament.iconLight or tournament.iconDark or tournament.logoAll or tournament.logoDark or tournament.logoLight local container = mw.html.create('div') createTable(results, container, currentPage, team) return container end end end function createTable(results, container, page, team) local game = mw.text.split(page, '/')[1] if #results > 0 then local monthNames = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} local typeTh = mw.html.create('th'):wikitext('Type') local nameTh = mw.html.create('th'):wikitext('Name') local dateTh = mw.html.create('th'):wikitext('Date') local prizeTh = mw.html.create('th'):wikitext('Prize') local locationTh = mw.html.create('th'):wikitext('Location') local participantsTh = mw.html.create('th'):wikitext('Participants') local formatTh = mw.html.create('th'):wikitext('Format') local placementTh = mw.html.create('th'):wikitext('Placement') local tableHeader = mw.html.create('tr'):addClass('tournament__header'):node(typeTh):node(nameTh):node(dateTh):node(prizeTh):node(locationTh):node(participantsTh):node(formatTh):node(placementTh) local listTable = mw.html.create('table'):addClass('tournament__table'):node(tableHeader) container:node(listTable) for i = 1, #results do local result = results[i] if team and result.team then page = result.team game = mw.text.split(page, '/')[1] end local icon = result.iconAll ~= '' and result.iconAll or result.iconLight ~= '' and result.iconLight or result.iconDark ~= '' and result.iconDark or result.logoAll ~= '' and result.logoAll or result.logoDark ~= '' and result.logoDark or result.logoLight ~= '' and result.logoLight if not icon then icon = 'Tournament_placeholder.png' end local typeTd = mw.html.create('td') local nameTd = mw.html.create('td'):node(mw.html.create('div'):addClass('tournament__name'):wikitext('[[File:' .. icon .. '|25px]]'):wikitext('[[' .. result._pageName .. ']]')) local dateTd = mw.html.create('td') local prizeTd = mw.html.create('td'):wikitext('$' .. prizeToString(result.prize)) local locationTd = mw.html.create('td') local participantsTd = mw.html.create('td'):wikitext(result.participants) local formatTd = mw.html.create('td') local placementTd = mw.html.create('td') local tournamentType = result.type and mw.text.split(result.type, ',') or {} for j = 1, #tournamentType do typeTd:node(mw.html.create('div'):wikitext(tournamentType[j])) end local formatList = result.formatFilter and mw.text.split(result.formatFilter, ',') or {} for j = 1, #formatList do formatTd:node(mw.html.create('div'):wikitext(formatList[j])) end local startDate = 'TBD' if result.start then local year, month, day = result.start:match("(%d+)-(%d+)-(%d+)") local monthName = monthNames[tonumber(month)] startDate = monthName .. " " .. day .. ", " .. year end local endDate = 'TBD' if result['end'] then year, month, day = result['end']:match("(%d+)-(%d+)-(%d+)") monthName = monthNames[tonumber(month)] endDate = monthName .. " " .. day .. ", " .. year end dateTd:node(mw.html.create('div'):wikitext(startDate)):node(mw.html.create('div'):wikitext('-')):node(mw.html.create('div'):wikitext(endDate)) local tournamentRow = mw.html.create('tr'):node(typeTd):node(nameTd):node(dateTd):node(prizeTd):node(locationTd):node(participantsTd):node(formatTd):node(placementTd) local currentTime = os.time() if result.country then locationTd:node(mw.html.create('div'):addClass('tournament__location'):node(Flags.icon(result.country)):node(mw.html.create('div'):wikitext(Flags.CountryName(result.country)))) end local startTime = nil if result.start then startTime = mw.ustring.gsub(result.start, '(%d+)-(%d+)-(%d+)', function(year, month, day) return os.time({year=tonumber(year), month=tonumber(month), day=tonumber(day)}) end) end local endTime = nil if result['end'] then endTime = mw.ustring.gsub(result['end'], '(%d+)-(%d+)-(%d+)', function(year, month, day) return os.time({year=tonumber(year), month=tonumber(month), day=tonumber(day)}) end) end local date = mw.html.create('div') -- If live if (startTime ~= nil and os.difftime(currentTime, startTime) > 0) and (endTime == nil or os.difftime(currentTime, endTime) <= 0) then date:wikitext('LIVE') else local startDate = 'TBD' if result.start then local year, month, day = result.start:match("(%d+)-(%d+)-(%d+)") local monthName = monthNames[tonumber(month)] startDate = monthName .. " " .. day .. ", " .. year end local endDate = 'TBD' if result['end'] then year, month, day = result['end']:match("(%d+)-(%d+)-(%d+)") monthName = monthNames[tonumber(month)] endDate = monthName .. " " .. day .. ", " .. year end date:wikitext(startDate .. ' - ' .. endDate) end -- Get placement of team/player tables = "Prizes" fields = "placement, players, teams" where = team and 'teams HOLDS "' .. page .. '"' or 'players HOLDS "' .. page .. '"' cargoArgs = { where = where } local prizeResults = cargo.query(tables, fields, cargoArgs) if #prizeResults > 0 then placementTd:wikitext(prizeResults[1].placement) else placementTd:wikitext('TBD') end listTable:node(tournamentRow) -- Get matches of tournament local matches = tournamentMatches(page, result._pageName, team) if matches then local matchesTd = mw.html.create('td'):attr('colspan', 10):node(matches) local matchesRow = mw.html.create('tr'):node(matchesTd) listTable:node(matchesRow) end end return container:node(tournamentContainer) end end function tournamentMatches(page, tournament, team) local game = mw.text.split(tournament, '/')[1] local tables = 'AllMatches' local fields = '_ID, _pageName, p1, p2, p1score, p2score, winner, date, bestof, stage' local cargoArgs = { where = '_pageName LIKE "' .. tournament .. '%" AND (p1 = "' .. page .. '" OR p2="' .. page .. '") AND winner IS NOT NULL AND winner != "0"', limit = 1000, orderBy = 'date desc' } local results = cargo.query(tables, fields, cargoArgs) if #results > 0 then local dateTh = mw.html.create('th'):wikitext('Date') local scoreTh = mw.html.create('th'):wikitext('Score') local vsTh = mw.html.create('th'):wikitext('Opponent') local vodTh = mw.html.create('th'):wikitext('VODs') local headerRow = mw.html.create('tr'):addClass('headerRow'):node(dateTh):node(scoreTh):node(vsTh):node(vodTh) local tbl = mw.html.create('table'):addClass('striped-table w-100'):node(headerRow) for i = 1, #results do local result = results[i] local opponent local score local opponentScore if result.p1 == page then score = result.p1score opponentScore = result.p2score opponent = result.p2 else score = result.p2score opponentScore = result.p1score opponent = result.p1 end local dateTd = mw.html.create('td'):wikitext(stringifyDate(result.date) .. ' '):node(mw.html.create('abbr'):attr('title', 'Coordinated Universal Time'):wikitext('UTC')) local scoreTd = mw.html.create('td'):addClass('tc'):wikitext(score .. ':' .. opponentScore) local vsTd = mw.html.create('td') if team then vsTd:node(mw.html.create('div'):attr('style', 'display: flex; gap: 0.2rem; align-items: center; justify-content: center;'):node(getTeamLogo(opponent, game, '20x20px')):wikitext('[[' .. opponent .. '|' .. getTeamDisplaytitle(opponent, result.date) ..']]')) else vsTd:wikitext('[[' .. opponent .. ']]') end local vodTd = mw.html.create('td') local resultRow = mw.html.create('tr'):addClass('bodyRow'):node(dateTd):node(scoreTd):node(vsTd):node(vodTd) -- Get VODs if game == 'Dota2' then tables = 'Maps_Dota' fields = 'yt, vod' cargoArgs = { where = 'matchID ="' .. result._ID .. '"', orderBy = 'map' } local vods = cargo.query(tables, fields, cargoArgs) if #vods > 0 then for j = 1, #vods do local vod = vods[j] if vod.yt then vodTd:wikitext('[[File:Youtube.png|20x20px|link=https://www.youtube.com/watch?v=' .. vod.yt .. '|Map ' .. j .. ']]') end end end end tbl:node(resultRow) end return tbl else return nil end end return p