Module:RankedWars

From NPOWiki
Revision as of 14:20, 17 October 2025 by Bobogoobo (talk | contribs) (add disambig in file name, display war note)
Jump to navigation Jump to search

Documentation [edit]

This page is a stub - it only covers the very basics of its subject. More information should be added to make the page informative and useful. If no more information is available, the page should be considered for a merge, redirect, or deletion.

Details: documentation to be written

If you can correct the issue, please edit the page to do so, then remove this notice.

Please see Template:Ranked war for usage information. Use the template rather than invoking the module. Data for this module is imported from Module:RankedWars/data and Module:RankedWars/data.json.

For how to update data, please see Module:RankedWars/data/doc.

The above documentation is transcluded from Module:RankedWars/doc.

--todo:
--	Handle ongoing wars (end = 0)
--	War lookup without faction (special case for internal) - remember to use faction name not shell name.
--	Use "clear" template (need to make it)
--	Fix "1 hours"/"1 wars"
--local data = mw.loadData('Module:RankedWars/data')
local jsonData = mw.loadJsonData('Module:RankedWars/data.json')

local p = {}

local function factionName(facKey)
	return mw.ustring.upper(mw.ustring.sub(facKey, 1, 1)) .. mw.ustring.sub(facKey, 2)
end

local function displayFactionStats(faction)
	local capName = factionName(faction)
	local overall = jsonData.wars.overall[faction]
		
	return table.concat({
		'NPO - ' .. capName,
		'has participated in',
		overall.wars,
		'ranked wars, winning',
		overall.wins,
		'(' .. overall.termedWins .. ' termed)',
		'and losing',
		overall.losses,
		'(' .. overall.termedLosses .. ' termed).',
	}, ' ')
end

local function displayWarData(faction, warId)
	local capName = factionName(faction)
	local warData = jsonData.wars[faction][warId]
		
	local outcome = 'fought'
	if warData.win then
		outcome = 'won against'
	else
		outcome = 'lost to'
	end
	local terms = 'war'
	if warData.termed then
		terms = 'termed war'
	end
	local opponent = mw.getCurrentFrame():expandTemplate({
		title = 'Tornp',
		args = { warData.oppName }
	})
	
	return mw.text.trim(table.concat({
		'NPO - ' .. capName,
		outcome,
		opponent,
		'in a',
		terms,
		'that started at',
		os.date('!%F %T TCT', warData.start),
		'and lasted',
		string.format('%.0f', (warData['end'] - warData['start']) / 3600),
		'hours. With a lead target of',
		warData.target .. ',',
		capName,
		'scored',
		warData.ourScore,
		'while the opponent scored',
		warData.oppScore .. '.',
		warData.note or '',
	}, ' '))
end

local function displayWarHistory(faction, args)
	local warIDs = {}
	local repeats = {}
	local wars = jsonData.wars[faction]
	local out = ''
	
	--The JSON sorts the wars numerically and pairs is random, we want newest first
	for warID, warData in pairs(wars) do
		table.insert(warIDs, 1, warID)
		if repeats[warData.oppName] then
			repeats[warData.oppName] = repeats[warData.oppName] + 1
		else
			repeats[warData.oppName] = 1
		end
	end
	table.sort(warIDs, function(wa, wb)
		return wb < wa
	end)
	
	for _, id in ipairs(warIDs) do
		local warData = wars[id]

		local heading = warData.oppName
		local disambig
		if repeats[warData.oppName] > 1 then
			disambig = os.date('!%b %Y', warData.start)
			heading = heading .. ' (' .. disambig .. ')'
		end
		out = out .. '===' .. heading .. '===\n'
		
		local filename = faction .. ' vs ' .. warData.oppName
		if disambig then
			filename = filename .. ' (' .. disambig .. ')'
		end
		filename = filename .. ' ranked war graph.png'
		out = out .. '[' .. '[' .. 'File:' .. filename .. '|right|400px|alt=Ranked war graph]]\n'
		
		local warpage
		if mw.ustring.find(args['has page'], ',' .. warData.id .. ',', 1, true) then
			warpage = warData.oppName .. ' Ranked War'
			if disambig then
				warpage = warpage .. ' (' .. disambig .. ')'
			end
		end
		if warpage then
			out = out .. mw.getCurrentFrame():expandTemplate({
				title = 'main',
				args = { warpage }
			}) .. '\n'
		end
		
		out = out .. displayWarData(faction, warData.id) .. '\n'
		local blurb = args[tostring(warData.id)]
		if blurb then
			out = out .. '\n' .. blurb .. '\n'
		end
		out = out .. '*[https://www.torn.com/war.php?step=rankreport&rankID=' .. warData.id .. ' War report on Torn]\n'
		out = out .. '<br style="clear:both;" />\n'
		out = out .. '\n'
	end
	
	return out
end

function p.main(frame)
	return p.call(frame:getParent().args)
end

function p.call(args)
	local faction, war, mode
	
	if args[1] then
		faction = mw.ustring.lower(args[1])
	end
	if args[2] then
		war = tonumber(args[2])
	end
	mode = args.mode
	args['has page'] = mw.ustring.gsub(
		',' .. (args['has page'] or '') .. ',',
		' ',
		''
	)
	
	if not faction then
		return '<span class="error">faction is currently required</span>'
	end
	
	if faction and not jsonData.factions[faction] then
		return '<span class="error">incorrect faction name</span>'
	end
	if faction and war and not jsonData.wars[faction][war] then
		return '<span class="error">specified war not found for the given faction</span>'
	end
	
	if mode == 'history' then
		return displayWarHistory(faction,  args)
	elseif mode == 'overall' then
		return displayFactionStats(faction)
	elseif mode == 'war' then
		if not war then
			return '<span class="error">war id must be specified for war lookup</span>'
		end
		return displayWarData(faction, war)
	else
		return '<span class="error">mode is currently required</span>'
	end
end

return p