<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ANLL_game_log</id>
	<title>Module:NLL game log - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ANLL_game_log"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:NLL_game_log&amp;action=history"/>
	<updated>2026-05-26T02:02:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:NLL_game_log&amp;diff=144034&amp;oldid=prev</id>
		<title>imported&gt;Pppery: Pppery moved page Module:NLLGameLog to Module:NLL game log without leaving a redirect</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:NLL_game_log&amp;diff=144034&amp;oldid=prev"/>
		<updated>2019-11-05T19:13:24Z</updated>

		<summary type="html">&lt;p&gt;Pppery moved page &lt;a href=&quot;/index.php?title=Module:NLLGameLog&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:NLLGameLog (page does not exist)&quot;&gt;Module:NLLGameLog&lt;/a&gt; to &lt;a href=&quot;/research/Module:NLL_game_log&quot; title=&quot;Module:NLL game log&quot;&gt;Module:NLL game log&lt;/a&gt; without leaving a redirect&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements [[Template:NLLGameLog]].&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Game class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Game = {}&lt;br /&gt;
Game.__index = Game&lt;br /&gt;
&lt;br /&gt;
Game.keys = {&lt;br /&gt;
	&amp;#039;opp&amp;#039;,&lt;br /&gt;
	&amp;#039;opp_link&amp;#039;,&lt;br /&gt;
	&amp;#039;team_score&amp;#039;,&lt;br /&gt;
	&amp;#039;opp_score&amp;#039;,&lt;br /&gt;
	&amp;#039;num&amp;#039;,&lt;br /&gt;
	&amp;#039;date&amp;#039;,&lt;br /&gt;
	&amp;#039;road_game&amp;#039;,&lt;br /&gt;
	&amp;#039;loc&amp;#039;,&lt;br /&gt;
	&amp;#039;loc_link&amp;#039;,&lt;br /&gt;
	&amp;#039;ot&amp;#039;,&lt;br /&gt;
	&amp;#039;attendance&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Game.new(data)&lt;br /&gt;
	local self = setmetatable({}, Game)&lt;br /&gt;
	local args = data.args&lt;br /&gt;
&lt;br /&gt;
	-- Set properties from arguments&lt;br /&gt;
	self.id = data.id&lt;br /&gt;
	do&lt;br /&gt;
		local prefix = &amp;#039;game&amp;#039; .. self.id .. &amp;#039;_&amp;#039;&lt;br /&gt;
		for i, key in ipairs(Game.keys) do&lt;br /&gt;
			self[key] = args[prefix .. key]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set other properties&lt;br /&gt;
	self.arena = args.arena&lt;br /&gt;
	self.arena_link = args.arena_link&lt;br /&gt;
&lt;br /&gt;
	-- Abort if we don&amp;#039;t have required fields&lt;br /&gt;
	if not self.opp and not self.opp_link then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set wins and losses&lt;br /&gt;
	self.total_wins = data.previous_wins&lt;br /&gt;
	self.total_losses = data.previous_losses&lt;br /&gt;
	if self:is_win() then&lt;br /&gt;
		self.total_wins = self.total_wins + 1&lt;br /&gt;
	else&lt;br /&gt;
		self.total_losses = self.total_losses + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Do some simple data preprocessing&lt;br /&gt;
	self.road_game = yesno(self.road_game) or false&lt;br /&gt;
&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:get_number()&lt;br /&gt;
	return self.num or self.id&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:get_total_wins()&lt;br /&gt;
	return self.total_wins&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:get_total_losses()&lt;br /&gt;
	return self.total_losses&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:get_team_score()&lt;br /&gt;
	return tonumber(self.team_score) or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:get_opponent_score()&lt;br /&gt;
	return tonumber(self.opp_score) or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:has_valid_score()&lt;br /&gt;
	return self:get_team_score() + self:get_opponent_score() &amp;gt; 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:is_win()&lt;br /&gt;
	-- Only record win/loss, as there are no draws in box lacrosse&lt;br /&gt;
	return self:get_team_score() - self:get_opponent_score() &amp;gt; 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:get_date()&lt;br /&gt;
	-- TODO: Convert [[Template:Date]] to Lua and call the module from here.&lt;br /&gt;
	local date = self.date or string.format(&amp;#039;{{{game%d_date}}}&amp;#039;, self.id)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	return frame:expandTemplate{title = &amp;#039;Date&amp;#039;, args = {date, &amp;#039;mdy&amp;#039;}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:make_link(page, display)&lt;br /&gt;
	if display and page then&lt;br /&gt;
		return string.format(&amp;#039;[[%s|%s]]&amp;#039;, page, display)&lt;br /&gt;
	elseif display then&lt;br /&gt;
		return display&lt;br /&gt;
	elseif page then&lt;br /&gt;
		return string.format(&amp;#039;[[%s]]&amp;#039;, page)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:make_opponent_text()&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	if self.road_game then&lt;br /&gt;
		ret = ret .. &amp;#039;@ &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. self:make_link(self.opp_link, self.opp)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:make_location_text()&lt;br /&gt;
	if self.road_game then&lt;br /&gt;
		return self:make_link(self.loc_link, self.loc)&lt;br /&gt;
	else&lt;br /&gt;
		return self:make_link(self.arena_link, self.arena)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:make_score_text()&lt;br /&gt;
	local team = self:get_team_score()&lt;br /&gt;
	local opp = self:get_opponent_score()&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	if self:is_win() then&lt;br /&gt;
		ret = ret .. &amp;#039;W&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;#039;L&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret .. &amp;#039; &amp;#039; .. team .. &amp;#039;&amp;amp;ndash;&amp;#039; .. opp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:make_overtime_text()&lt;br /&gt;
	local ot = tonumber(self.ot) or 0&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	if ot &amp;gt; 0 then&lt;br /&gt;
		if ot &amp;gt; 1 then&lt;br /&gt;
			ret = ret .. ot&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. &amp;#039;OT&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:make_attendance_text()&lt;br /&gt;
	local att = tonumber(self.attendance) or 0&lt;br /&gt;
	return lang:formatNum(att)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:make_record()&lt;br /&gt;
	-- The record of the wins and losses so far in the game log.&lt;br /&gt;
	return self:get_total_wins() .. &amp;#039;&amp;amp;ndash;&amp;#039; .. self:get_total_losses()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Game:render_html()&lt;br /&gt;
	local row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Row color&lt;br /&gt;
	if self:has_valid_score() then&lt;br /&gt;
		row:css(&amp;#039;background-color&amp;#039;, self:is_win() and &amp;#039;#ccffcc&amp;#039; or &amp;#039;#ffbbbb&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function addCell(content)&lt;br /&gt;
		if content then&lt;br /&gt;
			row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
				:wikitext(content)&lt;br /&gt;
		else&lt;br /&gt;
			row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	addCell(self:get_number())&lt;br /&gt;
	addCell(self:get_date())&lt;br /&gt;
	addCell(self:make_opponent_text())&lt;br /&gt;
	addCell(self:make_location_text())&lt;br /&gt;
&lt;br /&gt;
	if self:has_valid_score() then&lt;br /&gt;
		addCell(self:make_score_text())&lt;br /&gt;
		addCell(self:make_overtime_text())&lt;br /&gt;
		addCell(self:make_attendance_text())&lt;br /&gt;
		addCell(self:make_record())&lt;br /&gt;
	else&lt;br /&gt;
		for i = 1, 4 do&lt;br /&gt;
			addCell()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return row&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- GameLog class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local GameLog = {}&lt;br /&gt;
GameLog.__index = GameLog&lt;br /&gt;
&lt;br /&gt;
function GameLog.new(args)&lt;br /&gt;
	local self = setmetatable({}, GameLog)&lt;br /&gt;
&lt;br /&gt;
	-- Set game objects&lt;br /&gt;
	self.games = {}&lt;br /&gt;
	local i = 0&lt;br /&gt;
	local wins = 0&lt;br /&gt;
	local losses = 0&lt;br /&gt;
	while true do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		local game = Game.new{&lt;br /&gt;
			id = i,&lt;br /&gt;
			args = args,&lt;br /&gt;
			previous_wins = wins,&lt;br /&gt;
			previous_losses = losses,&lt;br /&gt;
		}&lt;br /&gt;
		if game then&lt;br /&gt;
			wins = game:get_total_wins()&lt;br /&gt;
			losses = game:get_total_losses()&lt;br /&gt;
			self.games[i] = game&lt;br /&gt;
		else&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function GameLog:get_game(id)&lt;br /&gt;
	return self.games[id]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function GameLog:__tostring()&lt;br /&gt;
	local root = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
	root&lt;br /&gt;
		:addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;width&amp;#039;, &amp;#039;85%&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Headers&lt;br /&gt;
	do&lt;br /&gt;
		local headerRow = root:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		local function addHeader(header, width)&lt;br /&gt;
			headerRow&lt;br /&gt;
				:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;width&amp;#039;, width .. &amp;#039;%&amp;#039;)&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		addHeader(&amp;#039;Game&amp;#039;, 5)&lt;br /&gt;
		addHeader(&amp;#039;Date&amp;#039;, 15)&lt;br /&gt;
		addHeader(&amp;#039;Opponent&amp;#039;, 25)&lt;br /&gt;
		addHeader(&amp;#039;Location&amp;#039;, 30)&lt;br /&gt;
		addHeader(&amp;#039;Score&amp;#039;, 10)&lt;br /&gt;
		addHeader(&amp;#039;OT&amp;#039;, 5)&lt;br /&gt;
		addHeader(&amp;#039;Attendance&amp;#039;, 5)&lt;br /&gt;
		addHeader(&amp;#039;Record&amp;#039;, 5)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Data&lt;br /&gt;
	local i = 0&lt;br /&gt;
	while true do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		local game = self:get_game(i)&lt;br /&gt;
		if game then&lt;br /&gt;
			root:node(game:render_html())&lt;br /&gt;
		else&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	return tostring(GameLog.new(args))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = &amp;#039;Template:NLL game log&amp;#039;&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Pppery</name></author>
	</entry>
</feed>