Halo Esports Wiki

We are currently performing extensive maintenance to this wiki and as a result there will likely be errors. Please be patient while we work to fix all problems.

READ MORE

Halo Esports Wiki
Advertisement

To edit the documentation or categories for this module, click here.


local util = require('Module:Util')
local util_cargo = require('Module:CargoUtil')
local util_dpl = require('Module:DPLUtil')
local util_table = require('Module:TableUtil')
local util_title = require('Module:TitleUtil')
local util_text = require('Module:TextUtil')
local m_team = require('Module:Team')
local lang = mw.getLanguage('en')
local systems = mw.loadData('Module:Systems')

local p = {}

function p.main(frame)
	if frame == mw.getCurrentFrame() then
		args = require('Module:ProcessArgs').merge(true)
	else
		frame = mw.getCurrentFrame()
	end
	if frame:callParserFunction('#var','suppressorgnavbox') == 'true' then
		return ''
	end
	-- get inputs
	local settings = p.getSettings(args)
	local vars = p.getVariables(settings)
	
	return p.makeNavbox(vars, frame, settings)
end

function p.getSettings(args)
	return {
		suffix = (args.suffix == 'Yes'),
		team = args[1],
		from_player = args.useplayer,
		state = args.innerstate
	}
end

function p.getVariables(settings)
	-- gets team & suffix
	local title = util_title.titleTable()
	local tbl = {}
	local titleteam = table.remove(title,1)
	tbl.team = settings.team or titleteam
	tbl.system = title[1] and systems[title[1]] and systems[table.remove(title,1)]
	if settings.from_player then
		p.teamFromPlayer(tbl)
	end
	tbl.teamlink = util_title.concatSubpage(tbl.team, tbl.system)
	tbl.suffix = settings.suffix and next(title) and table.concat(title,'/')
	tbl.state = settings.state or 'mw-collapsed'
	return tbl
end

function p.teamFromPlayer(tbl)
	local result = util_cargo.getOneRow({
		tables = 'InfoboxPlayer',
		fields = {'Team','TeamSystem'},
		where = string.format('_pageName="%s"',tbl.team)
	})
	tbl.team = result.Team
	tbl.system = result.TeamSystem or ''
	return
end

-- below this can be called directly from a module
function p.makeNavbox(vars, frame)
	if not vars.team then return '' end
	if not frame then frame = mw.getCurrentFrame() end
	-- get data, 
	local data = p.getData(vars)
	if not data then return '' end
	p.processLinks(frame, data, vars.suffix)
	-- print data
	return p.printNavbox(frame, data, vars)
end

function p.getData(vars)
	local data = {}
	local localsettings = {}
	local thisteam = vars.team
	local thisteamlink = vars.teamlink
	if thisteamlink and mw.title.makeTitle('',thisteamlink).exists then
		if p.isActive(thisteamlink) then
			localsettings.active = true
			data.aboveFold = thisteam
			data[thisteam] = { links = {}, names = {} }
			p.getPlayers(thisteamlink, data[thisteam])
		end
	else
		localsettings.exists = false
	end
	localsettings.hasSister = p.getSisterTeamInfo(vars, data)
	return (localsettings.active or localsettings.hasSister) and data
end

function p.isActive(teamlink)
	local query = {
		tables = 'InfoboxTeam',
		fields = 'IsDisbanded',
		where = string.format('_pageName="%s"',teamlink)
	}
	local isDisbanded = util_cargo.getOneResult(query)
	return isDisbanded == 'No'
end

function p.getPlayers(thisteamlink, data)
	local result = mw.ext.cargo.query('ListplayerCurrent', 'Link,ID', {
		where = string.format('_pageName="%s" AND ID IS NOT NULL',thisteamlink),
		groupBy = 'Link',
		orderBy = 'N'
	})
	for key, row in ipairs(result) do
		data.links[key] = row.Link
		data.names[key] = row.ID
	end
end

function p.getSisterTeamInfo(vars, data)
	local row = p.sisterTeamsCargo(vars.team)
	if not row then return nil end
	data.belowFold = {
		active = (row.ActiveList ~= '') and util_text.split(row.ActiveList,'%s*,%s*'),
		inactive = (row.InactiveList ~= '') and { links = util_text.split(row.InactiveList,'%s*,%s*') }
	}
	for _, team in ipairs(data.belowFold.active or {}) do
		data.belowFold[team] = { links = {}, names = {} }
		p.getPlayers(team, data.belowFold[team])
	end
	if data.belowFold.inactive then
		data.belowFold.inactive.names = mw.clone(data.belowFold.inactive.links)
	end
	return true
end

function p.sisterTeamsCargo(team)
	local fieldstable = {
		"Status=Status",
		"CONCAT(_pageName)=Pagename",
		"ActiveList=ActiveList",
		"InactiveList=InactiveList"
	}
	local cargoresult = mw.ext.cargo.query(
		"CCSisterTeams",
		table.concat(fieldstable, ","),
		{ where = 'Team="' .. team .. '"' }
	)
	return cargoresult[1]
end

-- process links

-- need to figure out how to deal with different systems & links
-- but i think that will be handled with team links / sister team concepts
function p.processLinks(frame, data, suffix)
	local links = p.getLinksListFromData(data)
	util_title.concatSubpages(links, suffix)
	local whatExists = util_table.lookup(util_dpl.whichPagesExist(links, frame))
	p.processLinksInData(data, whatExists, suffix)
	return
end

function p.getLinksListFromData(data)
	local links = {}
	if data.aboveFold then
		links[#links+1] = data.aboveFold
		links[#links+1] = util_title.concatSubpageSystem(data.aboveFold, data.system)
		util_table.mergeArrays(links,data[data.aboveFold].links)
	end
	if data.belowFold then
		if data.belowFold.inactive then
			util_table.mergeArrays(links,data.belowFold.inactive.links)
		end
		for k, v in ipairs(data.belowFold.active or {}) do
			links[#links+1] = v
			util_table.mergeArrays(links,data.belowFold[v].links)
		end
	end
	return links
end

function p.processLinksInData(data, whatExists, suffix)
	p.linkLists(data[data.aboveFold], whatExists, suffix)
	data.aboveFold = p.linkToObject(data.aboveFold, whatExists, suffix)
	if data.belowFold then
		for key, team in ipairs(data.belowFold.active or {}) do
			p.linkLists(data.belowFold[team], whatExists, suffix)
			data.belowFold.active[key] = p.linkToObject(team, whatExists, suffix)
		end
		p.linkLists(data.belowFold.inactive, whatExists, suffix)
	end
	return
end

function p.linkToObject(link, whatExists, suffix)
	if not link then return nil end
	local newlink = util_title.concatSubpage(link, suffix)
	local exists = whatExists[lang:ucfirst(newlink)]
	return {
		name = link,
		exists = exists,
		link = exists and newlink or link
	}
end

function p.linkLists(list, lookup, suffix)
	if not list then return end
	if not list.exists then list.exists = {} end
	for k, v in ipairs(list.links) do
		newlink = util_title.concatSubpage(v, suffix)
		list.exists[k] = lookup[lang:ucfirst(newlink)]
		list.links[k] = list.exists[k] and newlink or v
	end
	return
end

-- below is printing only
function p.printNavbox(frame, data, settings)
	local thisteam = data.aboveFold
	local navboxargs = {
		name = 'OrgNavbox',
		state = 'mw-collapsible'
	}
	local i = 1
	if thisteam then
		navboxargs.group1 = p.makeOutput(
			util_title.concatSubpageSystem(thisteam.link,settings.system),
			m_team.teammediumname(thisteam.name),
			(not settings.suffix) or thisteam.exists
		)
		navboxargs.list1 = p.makeListOutput(data[thisteam.name], settings.suffix)
		i = i + 1
		navboxargs.title = p.makeNavboxTitle(thisteam.name, settings.suffix, settings.system, 'Roster')
	else
		navboxargs.title = p.makeNavboxTitle(settings.team, settings.suffix, settings.system, 'Organization')
	end
	
	if data.belowFold then
		navboxargs['list' .. i] = p.afterFold(frame, data.belowFold, settings)
	end
	return frame:expandTemplate{ title = 'Navbox', args = navboxargs }
end

function p.makeNavboxTitle(thisteam, suffix, system, defaulttext)
	return string.format(
		'<span class="%s">%s</span> %s',
		suffix and 'no-subpage' or '',
		m_team.rightlonglinked(thisteam, { system = system, size = 45 }),
		suffix and ('- ' .. suffix) or defaulttext
	)
end

function p.afterFold(frame, data, settings)
	local navboxargs = {
		'child',
		title = 'Other Teams In Organization (Click [Show] to the Right)',
		state = settings.state
	}
	for k, v in ipairs(data.active or {}) do
		navboxargs['group' .. k] = p.makeOutput(
			util_title.concatSubpageSystem(v.link,settings.system),
			v.name,
			(not settings.suffix) or v.exists
		)
		navboxargs['list' .. k] = p.makeListOutput(data[v.name], settings.suffix)
	end
	if data.inactive then
		navboxargs.below = p.makeListOutput(data.inactive, settings.suffix)
	end
	return frame:expandTemplate{ title = 'Navbox', args = navboxargs }
end

function p.makeListOutput(list, suffix)
	local tbl = {}
	for k, link in ipairs(list.links or {}) do
		tbl[k] = p.makeOutput(link, list.names[k], (not suffix) or list.exists[k])
	end
	local output = table.concat(tbl,' &#8226; ')
	return output
end

function p.makeOutput(link, name, exists)
	if exists then
		return string.format('[[%s|%s]]',link,name)
	else
		return string.format(
			'<span class="no-subpage">[[%s|%s]]</span>',
			link,
			name
		)
	end
end	

return p
Advertisement