Module:Infobox/Tournament

local lang = mw.getLanguage('en') local Currency = require('Module:Currency') 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 util_vars = require("Module:VarsUtil") 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', 'Social Media & Links', 'Results' }, contents = { { 'Organizer', 'Rulebook', 'Sponsor', 'Format', 'PrizePool','ParticipantNumber', 'Type', 'Tier', 'Mode', 'Platform', 'Links' }, { 'Region', 'EventType', 'Country', 'Address', 'Venue', 'StartDate', 'EndDate', 'Date', }, { 'Casters', 'Streams', 'Schedule' }, { 'social', social = 'wide' }, { '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', ' '), Rulebook = args.rulebook and util_text.link(args.rulebook, 'Rulebook'), Sponsor = args.sponsor, Server = args.server, Tier = args.tier, Mode = args.mode, Platform = args.platform, Region = args.region:flair, EventType = processed.type, Country = args.country:flair, Address = args.address, Venue = args.venue, Format = args.format, PrizePool = h.getPrizePool(args), ParticipantNumber = args.participantnumber, 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 ' Full List' or '')), Schedule = h.makeSchedule(processed.pagename), }	return Infobox.mergeDisplay(display, tbl) end

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

function h.getPrizePool(args) if not args.currency:exists 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 Calendar Export]'):format(util_form.fullURL(FORM_INFO.MCE, { pagename })), }		return util_table.concat(links, ' ') end return nil 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, PrRegion = h.getPrRegion(args), Prizepool = args.prizepool, Platform = args.platform, TeamSize = args.teamsize, Tier = args.tier, Mode = args.mode, Server = args.server, Currency = args.currency, Country = args.country, Rulebook = args.rulebook, EventType = processed.type, Links = args.web or args.website, Sponsors = args.sponsors, Organizer = args.organizer, ParticipantNumber = args.participantnumber, FortniteTracker = args.fnt, OverviewPage = mw.title.getCurrentTitle.text, Split = args.split, SplitNumber = args.split_number, StandardName_Redirect = args.CM_StandardName and args.CM_StandardName:gsub('%#',''), SuppressTopSchedule = util_args.castAsBool(args.no_topschedule), ScrapeLink = args.scrape_link, AlternativeNames = h.getAlternativeNames(args), }	}	for _, param in ipairs(CCMT_PARAMS) do tbl[1][param] = args['CM_' .. param] end return util_table.mergeArrays(cargo, tbl) end

function h.getPrRegion(args) if args.region:name == "North America East" or args.region:name == "North America West" then prregion = "North America" elseif args.region:name == "Brazil" then prregion = "South America" else prregion = args.region:name end return prregion end

function h.getAlternativeNames(args) if not args.league:exists then return end local nameVars = { league = args.league:get('short'), split = args.split, year = args.CM_Year, playoffs = h.getPlayoffsName(args), }	local orderCheck = { 'league', 'year', 'split', 'playoffs' } local orderOutput = { 'league', 'split', 'year', 'playoffs' } util_vars.log(h.concatAlternativeName(nameVars, orderOutput)) if h.concatAlternativeName(nameVars, orderCheck) ~= args.name then return end return h.concatAlternativeName(nameVars, orderOutput) end

function h.getPlayoffsName(args) if util_args.castAsBool(args.CM_IsPlayoffs) then return 'Playoffs' end return nil end

function h.concatAlternativeName(nameVars, order) local tbl = {} for _, param in ipairs(order) do		tbl[#tbl+1] = nameVars[param] end return table.concat(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.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(' ') 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 Name'] = processed.name, ['Event Region'] = args.region:get, }	return util_table.merge(variables, tbl) end

return p