Module:TeamScheduleH2H

From Leaguepedia | League of Legends Esports Wiki
Jump to: navigation, search

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

local util_args = require('Module:ArgsUtil')
local util_cargo = require('Module:CargoUtil')
local util_html = require('Module:HTMLUtil')
local util_time = require('Module:TimeUtil')
local m_team = require('Module:Team')

local COLUMNS = { 'Date', 'Event', 'Round', 'Team 1', 'Team 2', 'Score' }
local SIDES = { [0] = 'Blue', [1] = 'Red' }

local h = {}

function h.query(team1, team2, limit)
	local tbl = {
		tables = 'MatchSchedule',
		fields = {
			'Team1',
			'Team2',
			'DateTime_UTC=UTC',
			'OverviewPage',
			'Winner',
			'Tab',
			'ShownRound',
			'Round',
			'Team1Score',
			'Team2Score',
			'ShownName'
		},
		where = ('((Team1="%s" AND Team2="%s") OR (Team1="%s" AND Team2="%s")) AND Winner IS NOT NULL'):format(
			team1,
			team2,
			team2,
			team1
		),
		orderBy = 'DateTime_UTC DESC',
		limit = limit or 200,
		types = {
			Team1Score = 'number',
			Team2Score = 'number'
		}
	}
	return tbl
end

function h.processData(result, team1, team2)
	local processed = {
		totals = {
			[team1] = { games = 0, series = 0 },
			[team2] = { games = 0, series = 0 }
		}
	}
	for i, row in ipairs(result) do
		processed[i] = h.processRow(row, team1, team2)
		h.getTotals(processed.totals, row, processed[i].Blue, processed[i].Red)
	end
	return processed
end

function h.processRow(row, team1, team2)
	local blue_link = m_team.teamlinkname(row.Team1)
	local red_link = m_team.teamlinkname(row.Team2)
	local blue_color = blue_link == team1 and 'th2h-team0win' or 'th2h-team1win'
	local red_color = red_link == team1 and 'th2h-team0win' or 'th2h-team1win'
	local tbl = {
		Blue = blue_link,
		Red = red_link,
		Date = util_time.dateInLocal(row.UTC),
		Event = ('[[%s|%s]]'):format(row.OverviewPage, row.ShownName or ''),
		Round = row.ShownRound or row.Tab or row.Round or '',
		['Team 1'] = m_team.rightmediumlinked(row.Team1),
		['Team 2'] = m_team.rightmediumlinked(row.Team2),
		Score = ('%s - %s'):format(row.Team1Score, row.Team2Score),
		classes = {
			['Team 1'] = row.Winner == '1' and blue_color or '',
			['Team 2'] = row.Winner == '2' and red_color or ''
		}
	}
	return tbl
end

function h.getTotals(totals, row, blue, red)
	totals[blue].games = totals[blue].games + row.Team1Score
	totals[red].games = totals[red].games + row.Team2Score
	totals[blue].series = totals[blue].series + (row.Winner == '1' and 1 or 0)
	totals[red].series = totals[red].series + (row.Winner == '2' and 1 or 0)
end

function h.makeOutput(processed, team1, team2)
	local output = mw.html.create()
	h.printTable(output, processed, team1, team2)
	return output
end

function h.printTable(output, processed, team1, team2)
	local tbl = output:tag('table')
		:addClass('wikitable')
		:attr('id', 'teamschedule-history-table')
	h.addTotals(tbl, processed.totals, team1, team2)
	util_html.makeColspanHeader(tbl, 'Head-to-Head History', #COLUMNS)
	h.addHeading(tbl)
	for _, row in ipairs(processed) do
		local tr = tbl:tag('tr')
		for _, class in ipairs(row.classes) do
			tr:addClass(class)
		end
		for _, col in ipairs(COLUMNS) do
			tr:tag('td')
				:wikitext(row[col])
				:addClass(row.classes[col])
		end
	end
end

function h.addTotals(tbl, totals, team1, team2)
	util_html.makeColspanHeader(tbl, 'Series Totals', #COLUMNS, 'small-heading')
	h.addtotalRecord(tbl, team1, team2, totals[team1].series, totals[team2].series)
	util_html.makeColspanHeader(tbl, 'Game Totals', #COLUMNS, 'small-heading')
	h.addtotalRecord(tbl, team1, team2, totals[team1].games, totals[team2].games)
end

function h.addtotalRecord(tbl, team1, team2, score1, score2)
	local tr = tbl:tag('tr')
	local td = tbl:tag('td'):attr('colspan', #COLUMNS)
	td:node(util_html.vsAlign(m_team.leftmedium(team1), m_team.rightmedium(team2), h.formatTotalScore(score1, score2)))
end

function h.formatTotalScore(score1, score2)
	return ('%s - %s'):format(score1, score2)
end

function h.addHeading(tbl)
	local tr = tbl:tag('tr')
	for _, col in ipairs(COLUMNS) do
		tbl:tag('th'):wikitext(col)
	end
	return
end

local p = {}
function p.main(frame)
	local args = util_args.merge(true)
	local team1, team2 = m_team.teamlinkname(args[1]), m_team.teamlinkname(args[2])
	local query = h.query(team1, team2, args.limit)
	local result = util_cargo.queryAndCast(query)
	local processed = h.processData(result, team1, team2)
	return h.makeOutput(processed, team1, team2)
end
return p