Fortnite Esports Wiki

Power Rankings of Brazil and Oceania at the moment are not updated to the last two competitive seasons, so the current positions of the players are not 100% accurate.

READ MORE

Fortnite Esports Wiki
Advertisement

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

local util_args = require('Module:ArgsUtil')
local util_cargo = require("Module:CargoUtil")
local util_esports = require("Module:EsportsUtil")
local util_map = require("Module:MapUtil")
local util_sort = require("Module:SortUtil")
local util_text = require("Module:TextUtil")

local h = {}

local p = {}
function p.main(team, settings)
	if h.hasAutoTeams(team) then
		return h.getTeamMembers(team, settings)
	end
	return h.getListplayerCurrent(team, settings)
end

function h.hasAutoTeams(teamlink)
	local query = {
		tables = 'TeamsWithAutoRosters',
		fields = 'OverviewPage',
		where = string.format('OverviewPage="%s"',teamlink),
	}
	return util_cargo.getOneResult(query)
end

function h.getTeamMembers(team, settings)
	if not settings then settings = {} end
	local query = {
		tables = {
			'Tenures=Ten',
			'PlayerRedirects=PR',
			'Players=P',
			'RosterChanges=RCJ',
			'Alphabets=A',
		},
		join = {
			'Ten.Player=PR.AllName',
			'PR.OverviewPage=P._pageName',
			'Ten.RosterChangeIdJoin=RCJ.RosterChangeId',
			'P.NameAlphabet=A.Alphabet',
		},
		fields = {
			'P.Player=Link',
			'P.ID',
			'P.Name',
			'CONCAT(CASE WHEN A.IsTransliterated="1" THEN P.NameFull ELSE P.Name END)=NameFull',
			'COALESCE(P.NationalityPrimary, P.Country)=Country [country]',
			'P.Residency [region]',
			'RCJ.Roles',
			'RCJ.RoleModifier',
		},
		complexTypes = {
			RoleList = {
				type = 'RoleList',
				args = {
					'Roles',
					modifier = 'RoleModifier',
				}
			}
		},
		where = {
			'Ten.IsCurrent="1"',
			('Ten.Team="%s"'):format(team),
			settings.hideTrainees and 'RCJ.RoleModifier IS NULL OR RCJ.RoleModifier != "Trainee"',
		},
	}
	util_cargo.logQuery(query)
	local result = util_cargo.queryAndCast(query)
	
	-- should replace this with having a pre-store is_ingame check
	for i = #result, 1, -1 do
		if not result[i].RoleList:hasIngame() then
			table.remove(result, i)
		end
	end
	
	util_map.rowsInPlace(result, h.formatOneTeamMemberRow)
	util_sort.tablesByKeys(result, { 'SortKeyRole', 'SortKeyName' }, { true, true })
	
	return result
end

function h.formatOneTeamMemberRow(row)
	row.SortKeyRole = row.RoleList:sortnumber()
	if row.Link then
		row.SortKeyName = mw.ustring.lower(row.Link)
	end
end

function h.getListplayerCurrent(team, settings)
	if not settings then settings = {} end
	local query = {
		tables = { 'ListplayerCurrent=LPC', '_pageData=_pD' },
		join = 'LPC.Link=_pD._pageName',
		fields = {
			'_pD._pageName=Exists [boolean]',
			'LPC.Link',
			'LPC.ID',
			'LPC.Name',
			'LPC.Country [country]',
			'LPC.Residency [region]',
			'LPC.Role',
			'LPC.IsSubstitute [boolean]',
			'LPC.IsTrainee [boolean]',
		},
		where = h.getLpcWhere(team, settings),
		groupBy = 'LPC.Link',
		orderBy = 'LPC.N',
		complexTypes = {
			RoleList = {
				type = 'RoleList',
				args = {
					'Role',
					
					-- these were previously cast as boolean
					sub = 'IsSubstitute',
					trainee = 'IsTrainee',
				}
			}
		}
	}
	local result = util_cargo.queryAndCast(query)
	util_map.rowsInPlace(result, h.formatOneRowLPC)
	util_sort.tablesByKeys(result, { 'SortKeyRole', 'SortKeyName' }, { true, true })
	return result
end

function h.getLpcWhere(team, settings)
	local where = {
		('LPC._pageName="%s" AND ID IS NOT NULL'):format(team),
	}
	return where
end

function h.formatOneRowLPC(row)
	row.ID = util_esports.playerDisplay(row.ID)
	row.NameFull = row.Name
	h.formatOneTeamMemberRow(row)
end

return p
Advertisement