Module:AllResults

From TwogPedia
Revision as of 20:11, 12 November 2023 by Couchor (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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