Leaguepedia | League of Legends Esports Wiki
Advertisement

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

local util_args = require('Module:ArgsUtil')
local util_cargo = require("Module:CargoUtil")
local util_esports = require("Module:EsportsUtil")
local util_html = require("Module:HtmlUtil")
local util_map = require("Module:MapUtil")
local util_sort = require("Module:SortUtil")
local util_table = require("Module:TableUtil")
local util_text = require("Module:TextUtil")
local util_vars = require("Module:VarsUtil")
local i18n = require('Module:i18nUtil')

local m_team = require('Module:Team')
local RoleList = require('Module:RoleList')
local RegionList = require('Module:RegionList')
local CountryList = require('Module:CountryList')

local Socials = require('Module:Infobox/Social').makeSocialSection

local COLUMNS = { 'TeamDisplay', 'Socials', 'Roster' }

local h = {}

local p = {}
function p.main(frame)
	local args = util_args.merge()
	i18n.init('ListOfTeams')
	h.castArgs(args)
	local data = h.makeAndRunTeamsQuery(args)
	h.getTeamRosters(data)
	h.formatRows(data)
	return h.makeOutput(data)
end

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

function h.makeAndRunTeamsQuery(args)
	return util_cargo.queryAndCast(h.makeTeamsQuery(args))
end

function h.makeTeamsQuery(args)
	local query = {
		tables = {
			'Teams=T',
			'TeamsWithAutoRosters=TWAR',
		},
		join = {
			'T._pageName=TWAR._pageName',
		},
		fields = {
			'T._pageName=Team',
			'T.Twitter=twitter',
			-- 'T.Youtube=youtube',
			'T.Facebook=facebook',
			'T.Instagram=instagram',
			'T.Vk=vk',
			'TWAR._pageName=hasTWAR',
		},
		where = {
			util_cargo.whereFromCompoundEntity('T.Region="%s"', args.region),
			util_cargo.whereFromCompoundEntity('T.Location="%s"', args.country),
			'T.IsDisbanded="0"',
			'T.RenamedTo IS NULL',
		},
		orderBy = 'T._pageName ASC',
		groupBy = ('T._pageName'),
	}
	return query
end

function h.getTeamRosters(data)
	util_map.rowsInPlace(data, h.getOneTeamRoster)
end

function h.getOneTeamRoster(row)
	local rosterResult = util_cargo.queryAndCast(h.makeRosterQuery(row))
	row.Players = rosterResult
end

function h.makeRosterQuery(row)
	local query = {}
	if not row.hasTWAR then
		query.tables = { 'ListplayerCurrent=LPC' }
		query.fields = {
			'LPC.Role=Role',
			'LPC.Link=Player',
			'LPC.IsSubstitute [boolean]',
			'LPC.IsTrainee [boolean]',
		}
		query.groupBy = 'LPC.Link'
		query.where = { ('LPC.Team = "%s"'):format(row.Team) }
	else
		query.tables = { 'Tenures=Ten', 'RosterChanges=RCJ', 'PlayerRedirects=PR' }
		query.fields = { 
			'RCJ.Role=Role',
			'RCJ.RoleModifier',
			'Ten.Player=Player',
			'PR.OverviewPage=PlayerOverview',
		}
		query.join = { 'Ten.RosterChangeIdJoin=RCJ.RosterChangeId', 'Ten.Player=PR.AllName' }
		query.where = {
			('Ten.Team = "%s"'):format(row.Team),
			'Ten.IsCurrent="1"', 
			'RCJ.RolesIngame__FULL IS NOT NULL',
			'RCJ.RoleModifier IS NULL OR RCJ.RoleModifier != "Trainee"',
		}
		query.groupBy = 'Ten.Player'
	end
	return query
end

function h.formatRows(data)
	util_map.rowsInPlace(data, h.formatOneRow)
end

function h.formatOneRow(row)
	util_map.rowsInPlace(row.Players, h.formatOnePlayer, row.hasTWAR)
	util_sort.tablesByKeys(row.Players, 'SortKeyRole', true)
	row.Roster = util_table.concat(row.Players, ' • ', h.linkPlayer)
	row.TeamDisplay = m_team.rightmediumlinked(row.Team)
	row.Socials = table.concat(Socials(row))
end

function h.formatOnePlayer(playerRow, hasTWAR)
	if not hasTWAR then
		playerRow.RoleModifier = h.getRoleModifier(playerRow)
	end
	playerRow.Player = playerRow.PlayerOverview or playerRow.Player
	playerRow.roleObj = RoleList(playerRow.Role, { modifier = playerRow.RoleModifier })
	playerRow.SortKeyRole = playerRow.roleObj:sortnumber()
end

function h.getRoleModifier(playerRow)
	if playerRow.IsSubstitute then return 'Sub' end
	if playerRow.IsTrainee then return 'Trainee' end
	return nil
end

function h.linkPlayer(playerRow)
	-- return (playerRow.RoleModifier or '') .. playerRow.Player
	return util_esports.playerWithRole({ player = playerRow.Player, role = playerRow.roleObj })
end

function h.makeOutput(data)
	local output = mw.html.create()
	local tbl = output:tag('table')
		:addClass('wikitable')
		:addClass('sortable')
	util_html.printHeaderFromI18n(tbl, COLUMNS)
	util_html.printRowsByList(tbl, data, COLUMNS)
	return output
end

return p
Advertisement