Call of Duty Esports Wiki
Register
Advertisement

To edit the documentation or categories for this module, click here. This module has an i18n file. Click here to edit it.


local lang = mw.getLanguage('en')
local Currency = require('Module:Currency')
local m_team = require('Module:Team')
local teamhist = require('Module:Infobox/TeamHist')
local util_args = require('Module:ArgsUtil')
local util_infobox = require('Module:InfoboxUtil')
local util_html = require('Module:HtmlUtil')
local util_cargo = require('Module:CargoUtil')
local util_table = require('Module:TableUtil')
local util_time = require('Module:TimeUtil')
local util_form = require('Module:FormUtil')
local util_text = require('Module:TextUtil')
local i18n = require('Module:i18nUtil')

local Country = require('Module:Country')
local League = require('Module:League')
local Region = require('Module:Region')

local NOIMAGE = 'Unknown Infobox Image - Tournament.png'

local Infobox = require('Module:Infobox'):extends()

Infobox.LAYOUT = {
	sections = { 'Tournament Information', 'Location & Dates', 'Broadcast', 'Results' },
	contents = {
		{ 'Organizer', 'Host', 'Rulebook', 'Sponsor', 'Format', 'PrizePool','NumberofTeams', 'Links' },
		{ 'Server', 'Type', 'Game', 'Tier', 'Mode', 'Platform', 'Country', 'Location', 'Venue', 'StartDate', 'EndDate', 'Date', },
		{ 'Casters', 'Streams', 'Schedule' },
		{ 'Winner', 'Second', 'Third', 'Fourth', 'Qualified',  },
	},
}
Infobox.type = 'Tournament'

local FORM_INFO = {
	SFS = { form = 'SpoilerFreeSchedule', template = 'SFS' },
	MCE = { form = 'MatchCalendarExport', template = 'MCE' }
}

local CCMT_PARAMS = { 'StandardName', 'TournamentLevel', 'IsQualifier', 'IsPlayoffs', 'IsOfficial', 'Year', 'LeagueIconKey' }

local ALLOWED_TIMEZONES = { 'PST', 'KST', 'CET' }

local h = {}
local p = {}

function p.main(frame)
	local args = util_args.merge()
	return Infobox(args):run()
end

function Infobox:validateArgs(args)
	if args.closest_timezone and not util_table.keyOf(ALLOWED_TIMEZONES, args.closest_timezone) then
		-- error(i18n.print('error_invalidTimezone'))
	end
end

function Infobox:castArgs(args)
	args.league = League(args.CM_StandardLeague or args.league)
	args.region = Region(args.region)
	args.country = Country(args.country)
	args.currency = Currency(args.currency)
end

function Infobox:getProcessed(args)
	local tbl = {
		pagename = args.pagename or mw.title.getCurrentTitle().text,
		name = args.CM_StandardName or args.storedname or args.name,
		type = util_text.ucfirst(args.type),
	}
	return tbl
end

function Infobox:getDisplay(args, processed)
	local display = self:super('getDisplay', args, processed)
	local tbl = {
		title = args.name,
		image = util_infobox.getFile(args.image, NOIMAGE),
		notice = args.rednotice,
		
		Organizer = args.organizer and util_table.concatFromArgs(args, 'organizer', '<br>'),
		Rulebook = args.rulebook and ('[%s Rulebook]'):format(args.rulebook),
		Sponsor = args.sponsor,
		Server = args.server,
		Type = args.type,
		Game = args.game and ('[[%s]]'):format(args.game),
		Tier = args.tier,
		Mode = args.mode,
		Platform = args.platform,
		Region = args.region:flair(),
		EventType = processed.type,
		Country = args.country:flair(),
		Location = args.location,
		Venue = args.venue,
		Format = args.format,
		PrizePool = args.prizepool,
		NumberofTeams = args.numberofteams,
		Date = args.date,
		StartDate = args.sdate,
		EndDate = args.edate,
		Links = h.getLinks(args),
		Casters = args.caster or args.casters,
		Streams = args.streams and (args.streams .. (args.linkstreams and '<br>[[#Streams|Full List]]' or '')),
		Schedule = h.makeSchedule(processed.pagename),
		Host = h.getHost(args),
	}
	h.addResults(tbl, args)
	return Infobox.mergeDisplay(display, tbl)
end

function h.getHost(args)
	if args.host then
		return m_team.plainlinked(args.host)
	end
end

function h.getHostForCargo(args)
	if args.host then
		return m_team.teamname(args.host)
	end
end

function h.getLinks(args)
	if not args.bracket then
		return args.web and ('[%s Website]'):format(args.web)
	elseif not args.web then
		return args.bracket and ('[%s Bracket]'):format(args.bracket)
	else
		local links = { 
			args.web and ('[%s Website]'):format(args.web),
			args.bracket and ('[%s Bracket]'):format(args.bracket),
		}
		return util_table.concat(links, '<br>')
	end
end

function h.getPrizePool(args)
	if not args.currency then
		return args.prizepool
	end
	return args.currency:short(args.prizepool)
end

function h.makeSchedule(pagename)
	if util_cargo.getOneResult({ tables = 'MatchSchedule', fields = 'OverviewPage', where = ('OverviewPage="%s"'):format(pagename) }) then
		local links = {
			('[%s Spoiler-Free Schedule]'):format(util_form.fullURL(FORM_INFO.SFS, { pagename })),
			('[%s Export to Google Calendar]'):format(util_form.fullURL(FORM_INFO.MCE, { pagename })),
		}
		return util_table.concat(links, '<br>')
	end
	return nil
end

function h.addResults(tbl, args)
	local format = not args.freeedit
	local places = { first = 'Winner', second = 'Second', third = 'Third', fourth = 'Fourth' }
	for k, v in pairs(places) do
		if args[k] then
			tbl[v] = format and m_team.rightmediumlinked(args[k]) or args[k]
		end
	end
	if args.third1 or args.third2 then
		tbl.Third = util_table.concatFromArgs(args, 'third', '<br>', format and m_team.rightmediumlinked)
	end
	tbl.Qualified = args.qual1 and util_table.concatFromArgs(args, 'qual', '<br>', format and m_team.rightmediumlinked)
	return
end

function Infobox:getCargo(args, processed)
	local cargo = self:super('getCargo', args, processed)
	if util_args.castAsBool(args.nocargo) then return cargo end
	local tbl = {
		{
			_table = 'Tournaments',
			Name = processed.name,
			DateStart = util_time.strToDateStr(args.sdate or args.date or '') or '',
			DateStartFuzzy = util_time.strToDateStrAllowYearOnly(args.sdate or args.date or '') or '',
			Date = util_time.strToDateStr(args.edate or args.date or '') or '',
			ClosestTimezone = args.closest_timezone,
			League = args.league,
			StandardLeague = args.league,
			Region = args.region,
			Prizepool = args.prizepool,
			Currency = args.currency,
			Country = args.country,
			Location = args.location,
			Rulebook = args.rulebook,
			Platform = args.platform,
			Type = args.type,
			Game = args.game,
			Tier = args.tier,
			Mode = args.mode,
			EventType = processed.type,
			Links = args.web,
			Sponsors = args.sponsors,
			Organizer = args.organizer,
			NumberofTeams = args.numberofteams,
			First = args.first,
			Second = args.second,
			Host = h.getHostForCargo(args),
			SuppressTopSchedule = util_args.castAsBool(args.no_topschedule),
			OverviewPage = mw.title.getCurrentTitle().text,
		}
	}
	for _, param in ipairs(CCMT_PARAMS) do
		tbl[1][param] = args['CM_' .. param]
	end
	return util_table.mergeArrays(cargo, tbl)
end

function Infobox:getCategories(args, processed)
	local tbl = {
		args.country:exists() and ('%s Tournaments'):format(args.country:get('adjective')),
		not args.region:exists() and 'Tournaments Without Region',
		args.game and args.game .. ' Tournaments',
		args.tier and args.tier .. ' Tournaments',
		args.type and args.type .. ' Tournaments',
		args.mode and args.mode .. ' Tournaments',
		args.platform and args.platform .. ' Tournaments',
		'Tournaments',
		processed.name:find('<br>') and 'Tournaments with br In Stored Name',
	}
	return tbl
end

function Infobox:getVariables(args, processed)
	local variables = self:super('getVariables', args, processed)
	local tbl = {
		['Event Date'] = args.edate or args.date,
		['Event Tier'] = processed.type,
		['Event Prizepool'] = args.prizepool,
		['Event Name'] = processed.name,
		['Event League'] = processed.league,
		['Event Region'] = args.region:get(),
	}
	return util_table.merge(variables, tbl)
end

return p
Advertisement