Halo Esports Wiki
Advertisement

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


local util_args = require('Module:ArgsUtil')
local util_map = require('Module:MapUtil')
local util_math = require('Module:MathUtil')
local util_table = require('Module:TableUtil')
local util_text = require('Module:TextUtil')
local util_title = require('Module:TitleUtil')
local util_vars = require('Module:VarsUtil')
local m_country = require('Module:Country')
local m_team = require('Module:Team')
local m_role = require('Module:Role')
--local ListOfRoles = require('Module:ListOfRoles')

local p = {}
local h = {}

p.outcomes = {
	w = 'Win',
	win = 'Win',
	l = 'Loss',
	loss = 'Loss',
	lost = 'Loss'
}

function p.getOutcomeName(str)
	if not str then return nil end
	if not p.outcomes[str:lower()] then
		error('Invalid outcome of ' .. str)
	end
	return p.outcomes[str:lower()]
end

function p.getOverviewPage(str)
	if str then
		return util_title.target(str)
	else
		local var = util_vars.getVar('overviewpage')
		return var or mw.title.getCurrentTitle().text
	end
end

function p.otherTeamN(n)
	-- teams are Team1 and Team2
	-- returns 2 if 1 is input, returns 1 if 2 is input
	local num = tonumber(n)
	return 3 - num
end

function p.makeLinks(links, display)
	if not links then links = display end
	local tbl = {}
	for k, v in ipairs(display) do
		if not links[k] or links[k] == '' then
			tbl[k] = ('[[%s]]'):format(v)
		else
			tbl[k] = ('[[%s|%s]]'):format(links[k], v)
		end
	end
	return tbl
end

function p.concatLinks(links, display, sep)
	if not links then links = display end
	return table.concat(p.makeLinks(links, display), sep or ',')
end

function p.concatLinksFromStrings(links, display, sep1, sep2)
	if not links and not display then
		return nil
	end
	if not links then links = display end
	local links_tbl = util_text.split(links, sep1)
	local display_tbl = util_text.split(display, sep1)
	return p.concatLinks(links_tbl, display_tbl, sep2 or ', ')
end

function p.ucfirstLink(link, display)
	if not link and not display then return nil end
	local lang = mw.getLanguage('en')
	link = link or display
	return lang:ucfirst(link)
end

function p.ucfirstLinks(links, displays, sep)
	if not links and not displays then return nil end
	local lang = mw.getLanguage('en')
	links = links or displays
	local tbl = util_text.split(links, sep)
	for k, v in ipairs(tbl) do
		tbl[k] = lang:ucfirst(v)
	end
	return table.concat(tbl, ',')
end

function p.winrate(w, l, round)
	if w + l == 0 then
		return 0
	end
	if round then
		return util_math.roundnum(w / (w + l) * 100, round)
	else
		return 100 * w / (w + l)
	end
end	

function p.winrateRanked(w, l, round)
	return (w - l) * 100 + (w + l)
end

function p.addTeamHighlighter(tbl, team)
	if team == 'TBD' then return end
	tbl:addClass('teamhighlight')
		:addClass('teamhighlighter')
		:attr('data-teamhighlight',team)
end

function p.calculateKDA(k, d, a, round)
	k = tonumber(k)
	d = tonumber(d)
	a = tonumber(a)
	if not (k and d and a) then
		error('Attempting to calculate KDA, missing value')
	end
	if d == 0 then
		return k + a
	end
	return util_math.roundnum((k + a) / d, round or .01)
end

function p.KDA(k, d, a)
	return ('%s/%s/%s'):format(k or '', d or '', a or '')
end

function p.roundedGold(gold)
	if not gold then return nil end
	gold = tonumber(gold)
	local output = util_math.roundnum(gold / 1000, .1)
	return ('%sk'):format(output)
end

function p.standingsClass(str)
	return 'standings-' .. str
end

function p.standingsClasses(str)
	return util_map.splitAndConcat(str, ' ', p.standingsClass, ' ')
end

function p.placementIcon(str)
	local deserialized = util_math.deserializeRangeToTable(str)
	if not deserialized[1] then
		return str
	end
	if deserialized[1] < 4 then
		return ('[[File:PlacementIcon%s.png|25px|link=]] %s'):format(
			deserialized[1] or '',
			table.concat(deserialized,'-')
		)
	else
		return table.concat(deserialized,'-')
	end
end

function p.playerMarkup(settings)
	local tbl = {
		settings.flag and m_country.onlyimage(settings.flag),
		settings.team and m_team.onlyimagelinkedshort(settings.team),
		settings.player and p.playerLinked(settings.player) or 'TBD',
	}
	util_table.removeFalseEntries(tbl, 3)
	return util_table.concat(tbl, '')
end
	
function p.flagPlayerMandatory(settings)
	local tbl = {
		m_country.onlyimage(settings.flag),
		settings.team and m_team.onlyimagelinkedshort(settings.team),
		settings.player and p.playerLinked(settings.player) or 'TBD',
	}
	util_table.removeFalseEntries(tbl, 3)
	return util_table.concat(tbl, '')
end

function p.teamPlayerMandatory(settings)
	local tbl = {
		settings.flag and m_country.onlyimage(settings.flag),
		m_team.onlyimagelinkedshort(settings.team),
		settings.player and p.playerLinked(settings.player) or 'TBD',
	}
	util_table.removeFalseEntries(tbl, 3)
	return util_table.concat(tbl, '')
end

function p.teamFlagPlayerMandatory(settings)
	local tbl = {
		m_country.onlyimage(settings.flag),
		m_team.onlyimagelinked(settings.team),
		settings.player and p.playerLinked(settings.player) or 'TBD',
	}
	return util_table.concat(tbl, '')
end

function p.printDiff(td, diff)
	if diff == 0 then
		td:tag('span'):addClass('stat-diff diff-neutral'):wikitext('▬')
	elseif diff > 0 then
		td:tag('span'):addClass('stat-diff diff-up'):wikitext('▲')
		td:wikitext(diff)
	else
		td:tag('span'):addClass('stat-diff diff-down'):wikitext('▼')
		td:wikitext(diff * -1)
	end
end

function p.diff(diff)
	local td = mw.html.create('span')
	p.printDiff(td, diff)
	return tostring(td)
end

function p.calendarLink(link)
	return util_text.link(link, '<span class="calendar-icon"></span>')
end

function p.calendarIntLink(link)
	return util_text.intLink(link, '<span class="calendar-icon"></span>')
end

function p.calendarExtLink(link)
	return util_text.extLink(link, '<span class="calendar-icon"></span>')
end

function p.playerDisplay(str)
	-- don't return second values
	local ret = str:gsub('_', ' '):gsub('%s*%(.*%)','')
	return ret
end

function p.playersDisplay(str, sep)
	return util_map.splitAndConcat(str, sep, p.playerDisplay)
end

function p.escapeLink(str)
	return str
		:gsub('^_+','')
		:gsub('_+$','')
		:gsub('_+', ' ')
		:gsub(' +', ' ')
end

function p.playersLink(str, sep)
	if not str then return nil end
	return util_text.ucfirstMap(p.escapeLink(str), sep)
end

function p.playerLink(str)
	if not str then return nil end
	return util_text.ucfirst(p.escapeLink(str))
end

function p.playerLinked(str)
	if not str then return nil end
	return util_text.intLink(p.escapeLink(str), p.playerDisplay(str))
end

function p.playerUnlinked(str)
	-- if we want a person specifically NOT linked because they are support staff
	-- then print the name in a span with a class indicating it's a name
	if not str then return nil end
	local output = mw.html.create('span')
		:addClass('player-name')
		:wikitext(p.playerDisplay(str))
	return tostring(output)
end

function p.playerMaybeUnlinked(str, isUnlinked)
	if isUnlinked then return p.playerUnlinked(str) end
	return p.playerLinked(str)
end

function p.playersLinked(str, sep)
	if not str then return nil end
	return util_map.splitAndConcat(str, sep, p.playerLinked, ', ')
end

function p.playerWithRole(tbl)
	if not tbl then error('Nil player table sent to EsportsUtil.playerWithRole') end
	if not tbl.role then
		return p.playerMaybeUnlinked(tbl.player, tbl.unlinked)
	end
	local role = m_role.mediumname(tbl.role)
	if not role then
		return p.playerMaybeUnlinked(tbl.player, tbl.unlinked)
	end
	if not ListOfRoles.hash_display[role] then
		return p.playerMaybeUnlinked(
			tbl.player,
			tbl.unlinked
		) .. (' (%s)'):format(
			p.splitRoleDisplay(tbl.role, tbl)
		)
	end
	local output = {
		m_role.onlyimage(tbl.role, {sub=tbl.sub, trainee=tbl.trainee, size='14px'}),
		p.playerMaybeUnlinked(tbl.player, tbl.unlinked)
	}
	return util_table.concat(output, '')
end

function p.splitRoleDisplay(role, tbl)
	local medium = util_map.splitAndConcat(
		role,
		'/',
		m_role.medium,
		'/',
		{
			sub = tbl.sub,
			trainee = tbl.trainee,
		}
	)
	if medium == '' then return role end
	return medium
end

function p.placeNumber(str)
	if str == 'DNS' then
		return 9999
	end
	return util_math.deserialize(str)
end

function p.boldLinksToThisPlayer(str, player, page)
	page = page or mw.title.getCurrentTitle().text
	str = str
		:gsub('%[%[' .. player .. '%|', '[[' .. page .. '|')
		:gsub('%[%[' .. player .. '%]%]', util_text.intLink(page, player))
	return str
end

return p
Advertisement