Fortnite Esports Wiki
Ispoonz (talk | contribs)
No edit summary
Ispoonz (talk | contribs)
No edit summary
Line 183: Line 183:
 
self:initializeToggleData()
 
self:initializeToggleData()
 
self:printQuery(args)
 
self:printQuery(args)
  +
util_vars.log(self:printQuery(args))
 
local tbl = mw.html.create('table')
 
local tbl = mw.html.create('table')
 
:addClass('wikitable sortable')
 
:addClass('wikitable sortable')

Revision as of 19:51, 24 August 2021

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

local util_args = require('Module:ArgsUtil')
local util_cargo = require('Module:CargoUtil')
local util_html = require('Module:HtmlUtil')
local util_map = require('Module:MapUtil')
local util_pr = require("Module:PrUtil")
local util_sort = require('Module:SortUtil')
local util_table = require('Module:TableUtil')
local util_text = require('Module:TextUtil')
local util_toggle = require('Module:ToggleUtil')
local util_vars = require('Module:VarsUtil')
local i18n = require('Module:I18nUtil')

local Country = require('Module:Country')
local CountryList = require('Module:CountryList')
local m_team = require('Module:Team')

local h = {}
local p = require('Module:LuaClassSystem').class.abstract()

function p:init(queryType)
	i18n.init('PowerRankings')
	self.TOGGLES = {
		class = 'PR_toggle%s',
	}
	self.MAX_SHOWN = 5
	self.HIDDEN = false
	self.DISABLE_HIDDEN_RESULTS = false
	self.COLUMNS = { 'index', 'Team', 'Player', 'Points', 'Gold', 'Silver', 'Bronze', 'Copper' }
end

function p:run(args)
	h.castArgs(args)
	self:setTogglePreferences(args)
	local query = self:getQuery(args)
	local result = util_cargo.queryAndCast(query)
	util_map.selfRowsInPlace(self, result, self.formatOneRow)
	return self:makeOutput(result, args)
end

function h.castArgs(args)
	args.country = CountryList(args.country)
end

function p:setTogglePreferences(args)
	if not args.country:exists() then
		self.MAX_SHOWN = -1
	end
	if args.max_shown then
		self.MAX_SHOWN = args.max_shown
	end
	self.DISABLE_HIDDEN_RESULTS = args.disable_hidden_results
end

function p:getQuery(args)
	local query = {
		tables = self:getTables(args),
		fields = self:getFields(),
		join = self:getJoin(args),
		where = self:getWhere(args),
		limit = self:getLimit(args),
		orderBy = 'SUM(Res.PRPoints) DESC',
		offset = self:getOffset(args),
		groupBy = 'PR._pageName',
	}
	util_cargo.logQuery(query)
	return query
end

function p:getTables(args)
	if not args.country:exists() then
		return {
			'Tournaments=T',
			'TournamentResults=Res',
			'TournamentResults__RosterLinks=RL',
			'PlayerRedirects=PR',
			'Players=P',
		}
	else
		return {
			'Tournaments=T',
			'TournamentResults=Res',
			'TournamentResults__RosterLinks=RL',
			'PlayerRedirects=PR',
			'Players=P',
			'Countries=C'
		}
	end
end

function p:getJoin(args)
	if not args.country:exists() then
		return {
			'T._pageName = Res.OverviewPage',
			'Res._ID=RL._rowID',
			'RL._value=PR.AllName',
			'PR._pageName=P._pageName',
		}
	else
		return {
			'T._pageName = Res.OverviewPage',
			'Res._ID=RL._rowID',
			'RL._value=PR.AllName',
			'PR._pageName=P._pageName',
			'T.PrRegion=C.Region'
		}
	end
end

function p:getFields()
	local fields = {
		'P.ID=Player',
		'PR._pageName=Link',
		'SUM(Res.PRPoints)=Points',
		'P.Team=Team',
		--'PR.Squad=Squad',
		'P.Nationality=Country[country]',
		'SUM(Res.Gold)=Gold',
		'SUM(Res.Silver)=Silver',
		'SUM(Res.Bronze)=Bronze',
		'SUM(Res.Copper)=Copper',
		'P.TeamLast=TeamLast',
	}
	return fields
end

function p:getWhere(args)
	local where = {
		args.region and ('P.Residency="%s"'):format(args.region),
		args.region and ('T.Region="%s"'):format(args.region),
		h.getFreeAgentWhereCondition(args),
		util_cargo.whereFromCompoundEntity('P.Nationality="%s"', args.country),
		args.country and util_cargo.whereFromCompoundEntity('C.Country="%s"', args.country),
		h.getRetiredWhereCondition(args.include_retired),
		'(P.IsInactive="0" OR P.IsInactive IS NULL)',
		self:getWhereCondition(args),
	}
	return where
end

function p:getWhereCondition(args) end

function p:getLimit(args)
	return args.limit or 9999	
end

function p:getOffset(args) return args.offset end

function h.getRetiredWhereCondition(include_retired)
	-- if util_args.castAsBool(include_retired) then return nil end
	-- return '(P.IsRetired="No" OR P.IsRetired IS NULL)'
end

function h.getFreeAgentWhereCondition(args)
	-- if args.fa == 'only' then
	-- 	return ('P.Team IS NULL')
	-- elseif not util_args.castAsBool(args.fa) then
	-- 	return ('P.Team IS NOT NULL')
	-- else
	-- 	return nil
	-- end
end

-- format row
function p:formatOneRow(row)
	row.Team = m_team.onlyimagelinked(row.Team)
	row.Player = self:formatPlayer(row)
end

function p:formatPlayer(row)
	if not row.Country:exists() or row.Country.unknown then
		return self:makePlayerOnly(row)
	end
	local image = row.Country:image()
	return image .. ' ' .. self:makePlayerOnly(row)
end

function p:makePlayerOnly(row)
	return util_text.intLink(row.Link, row.Player)
end

-- make output
function p:makeOutput(result, args)
	self:initializeToggleData()
	self:printQuery(args)
	util_vars.log(self:printQuery(args))
	local tbl = mw.html.create('table')
		:addClass('wikitable sortable')
		:addClass('hoverable-rows')
	self:printHeader(tbl, result, args.country:flairs())
	self:printRows(tbl, result)
	return tbl
end

function p:printQuery(args) end

function p:initializeToggleData()
	local i = util_vars.setGlobalIndex('PR_i')
	self.TOGGLES.class = self.TOGGLES.class:format(i)
end

function p:printHeader(tbl, result, countryList)
	self:printColspanHeader(tbl, result, countryList)
	util_html.printHeaderFromI18n(tbl, self.COLUMNS)
	util_html.printEmptySortRow(tbl, #self.COLUMNS)
end

function p:printColspanHeader(tbl, result, countryList)
	if not country then return end
	util_html.printColspanHeader(tbl, countryList, #self.COLUMNS)
end

function p:printRows(tbl, result)
	for i, row in ipairs(result) do
		self:printRow(tbl, row, i == self.MAX_SHOWN and i < #result)
	end
	if self.HIDDEN then
		self:endHiddenResults(tbl)
	end
end

function p:printRow(tbl, row, isHidden)
	if isHidden and self.DISABLE_HIDDEN_RESULTS then return end
	local tr = tbl:tag('tr')
	for _, col in ipairs(self.COLUMNS) do
		tr:tag('td'):wikitext(row[col])
	end
	if self.HIDDEN then
		util_toggle.sepCellClasses(tr, self.TOGGLES)
	end
	if isHidden then
		self.HIDDEN = true
		self:printShowButton(tbl)
	end
end

function p:printShowButton(tbl)
	local tr = tbl:tag('tr')
	local th = tr:tag('th')
		:attr('colspan', #self.COLUMNS)
	util_toggle.printSepToggler(th, self.TOGGLES)
	util_toggle.sepCellClasses(tr, self.TOGGLES, true)
end

function p:endHiddenResults(tbl)
	local tr = tbl:tag('tr')
	local th = tr:tag('th')
		:attr('colspan', #self.COLUMNS)
	util_toggle.sepCellClasses(tr, self.TOGGLES, false)
	util_toggle.printSepToggler(th, self.TOGGLES, true)
end

return p