<?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%3AService_award_progress</id>
	<title>Module:Service award progress - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AService_award_progress"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Service_award_progress&amp;action=history"/>
	<updated>2026-05-27T11:45:05Z</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:Service_award_progress&amp;diff=146727&amp;oldid=prev</id>
		<title>imported&gt;MusikBot II: Protected &quot;Module:Service award progress&quot;: High-risk template or module (more info) ([Edit=Require autoconfirmed or confirmed access] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Service_award_progress&amp;diff=146727&amp;oldid=prev"/>
		<updated>2021-06-28T18:00:15Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/research/Module:Service_award_progress&quot; title=&quot;Module:Service award progress&quot;&gt;Module:Service award progress&lt;/a&gt;&amp;quot;: &lt;a href=&quot;https://en.wikipedia.org/wiki/High-risk_templates&quot; class=&quot;extiw&quot; title=&quot;wikipedia:High-risk templates&quot;&gt;High-risk template or module&lt;/a&gt; (&lt;a href=&quot;/index.php?title=User:MusikBot_II/TemplateProtector&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:MusikBot II/TemplateProtector (page does not exist)&quot;&gt;more info&lt;/a&gt;) ([Edit=Require autoconfirmed or confirmed access] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local navbar = require(&amp;#039;Module:Navbar&amp;#039;)._navbar&lt;br /&gt;
local mm = require(&amp;#039;Module:Math&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function stripToNil(text)&lt;br /&gt;
	-- If text is a string, return its trimmed content, or nil if empty.&lt;br /&gt;
	-- Otherwise return text (which may, for example, be nil).&lt;br /&gt;
	if type(text) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		text = text:match(&amp;#039;(%S.-)%s*$&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
local function progressBar(current, total)&lt;br /&gt;
	local percentDone = mm._round(current / total * 100, 1)&lt;br /&gt;
	local leftBar = &amp;#039;&amp;#039;&lt;br /&gt;
	local rightBar = &amp;#039;&amp;#039;&lt;br /&gt;
	if percentDone &amp;gt;= 100 then&lt;br /&gt;
		leftBar = 100&lt;br /&gt;
		rightBar = 0&lt;br /&gt;
	else&lt;br /&gt;
		leftBar = current / total * 100&lt;br /&gt;
		rightBar = (100-current) / total * 100&lt;br /&gt;
	end&lt;br /&gt;
	local progBarText = &amp;#039;&amp;lt;div style=&amp;quot;width:75%; margin:auto; text-align:center;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: 120%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;#039; .. percentDone .. &amp;#039;%&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt; completed&amp;lt;/p&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;lt;p style=&amp;quot;border:1px solid #c8ccd1; padding:1px; overflow:hidden;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;lt;span style=&amp;quot;width: &amp;#039; .. leftBar .. &amp;#039;%; height: 2px; background:#00af32; float:left;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;lt;span style=&amp;quot;width: &amp;#039; .. rightBar .. &amp;#039;%; height: 2px; background:#eaecf0; float:left;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	return progBarText&lt;br /&gt;
end&lt;br /&gt;
local levelNames = {&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Ultimate Vanguard Editor (or Cardinal Gom, the August Togneme of the Encyclopedia)|Ultimate Vanguard Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Senior Vanguard Editor (or Supreme Gom, the Most Exalted Togneme of the Encyclopedia)|Senior Vanguard Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Vanguard Editor (or Lord Gom, the Highest Togneme of the Encyclopedia)|Vanguard Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Grandmaster Editor First-Class (or Lord High Togneme Laureate)|Grandmaster Editor First-Class]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Grandmaster Editor (or Lord High Togneme Vicarus)|Grandmaster Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Master Editor IV (or Looshpah Laureate of the Encyclopedia)|Master Editor IV]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Master Editor III (or Most Plusquamperfect Looshpah Laureate)|Master Editor III]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Master Editor II (or Auspicious Looshpah)|Master Editor II]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Master Editor (or Illustrious Looshpah)|Master Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Senior Editor III (or Labutnum of the Encyclopedia)|Senior Editor III]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Senior Editor II (or Most Pluperfect Labutnum)|Senior Editor II]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Senior Editor (or Labutnum)|Senior Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Veteran Editor IV (or Tutnum of the Encyclopedia)|Veteran Editor IV]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Veteran Editor III (or Most Perfect Tutnum)|Veteran Editor III]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Veteran Editor II (or Grand Tutnum)|Veteran Editor II]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Veteran Editor (or Tutnum)|Veteran Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Experienced Editor (or Grognard Mirabilaire)|Experienced Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 4]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 3]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 2]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 4]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 3]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 2]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 4]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 3]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 2]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 4]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 3]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 2]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 4]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 3]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 2]]&amp;#039;,&lt;br /&gt;
	&amp;#039;[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor]]&amp;#039;,&lt;br /&gt;
	&amp;#039;Wikipedian&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
local levelTime = {&lt;br /&gt;
	7305, 6574.5, 5844, 5113.5, 4383, 3652.4, 2922, 2556.7, 2191.5, 1826.2, 1643.6, &lt;br /&gt;
	1461, 1278.4, 1095.7, 913.1, 730.5, 547.9, 501.75, 456.25, 410.75, 365.25, &lt;br /&gt;
	319.1, 273.6, 228.1, 182.6, 160.3, 137.3, 114.3, 91.3, 75.5, 60.5, 45.5, 30.5, &lt;br /&gt;
	24, 16, 8, 1, 0,&lt;br /&gt;
}&lt;br /&gt;
local levelEdits = {&lt;br /&gt;
	175000, 150000, 132000, 114000, 96000, 78000, 60000, 51000, 42000, 33000, 28500,&lt;br /&gt;
	24000, 20000, 16000, 12000, 8000, 6000, 5500, 5000, 4500, 4000, 3500, 3000, 2500, &lt;br /&gt;
	2000, 1750, 1500, 1250, 1000, 800, 600, 400, 200, 150, 100, 50, 1, 0,&lt;br /&gt;
}&lt;br /&gt;
function p.serviceLevel(args)&lt;br /&gt;
	--Inputs&lt;br /&gt;
	local editorTime = tonumber(stripToNil(args.editorTime))&lt;br /&gt;
	local edits = tonumber(stripToNil(args.edits))&lt;br /&gt;
	local styleoverride = stripToNil(args.styleoverride)&lt;br /&gt;
	local genderoverride = stripToNil(args.genderoverride)&lt;br /&gt;
	local url = stripToNil(args.url)&lt;br /&gt;
	&lt;br /&gt;
	-- Other Variables&lt;br /&gt;
	local timeLevel = &amp;#039;&amp;#039; -- Level associated with time&lt;br /&gt;
	local editLevel = &amp;#039;&amp;#039; -- Level associated with edits&lt;br /&gt;
	local userLevel = &amp;#039;&amp;#039; -- Full name of current user level&lt;br /&gt;
	local lowEdits = &amp;#039;&amp;#039; -- Minimum number of edits for current user level&lt;br /&gt;
	local lowTime = &amp;#039;&amp;#039; -- Minimum amount of time for current user level&lt;br /&gt;
	local highEdits = &amp;#039;&amp;#039; -- Max number of edits for current user level&lt;br /&gt;
	local highTime = &amp;#039;&amp;#039; -- Max amount of time for current user level&lt;br /&gt;
	local nextLevel = &amp;#039;&amp;#039; -- Full name of next user level&lt;br /&gt;
	local fullMessage = &amp;#039;&amp;lt;div style=&amp;quot;&amp;#039; -- Output seed&lt;br /&gt;
	local topLevel = false&lt;br /&gt;
	local needsEdits = false&lt;br /&gt;
	local needsTime = false&lt;br /&gt;
	local needsBoth = false&lt;br /&gt;
	local displayall = false&lt;br /&gt;
	if stripToNil(args.displayall) == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		displayall = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Find &amp;quot;level&amp;quot; of editor based on time&lt;br /&gt;
	for x = 1, 38, 1 do&lt;br /&gt;
		if editorTime &amp;gt;= levelTime[x] then&lt;br /&gt;
			timeLevel = x&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Fine &amp;quot;level&amp;quot; of editor based on edits&lt;br /&gt;
	for y = 1, 38, 1 do&lt;br /&gt;
		if edits &amp;gt;= levelEdits[y] then&lt;br /&gt;
			editLevel = y&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Set user level and the next level up&lt;br /&gt;
	if timeLevel == editLevel then&lt;br /&gt;
		if timeLevel == 1 then&lt;br /&gt;
			userLevel = levelNames[1]&lt;br /&gt;
			topLevel = true&lt;br /&gt;
		else&lt;br /&gt;
			userLevel = levelNames[editLevel]&lt;br /&gt;
			nextLevel = levelNames[editLevel-1]&lt;br /&gt;
			lowEdits = levelEdits[editLevel]&lt;br /&gt;
			highEdits = levelEdits[editLevel-1]&lt;br /&gt;
			lowTime = levelTime[editLevel]&lt;br /&gt;
			highTime = levelTime[editLevel-1]&lt;br /&gt;
			needsBoth = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif timeLevel &amp;lt; editLevel then&lt;br /&gt;
		userLevel = levelNames[editLevel]&lt;br /&gt;
		nextLevel = levelNames[editLevel-1]&lt;br /&gt;
		lowEdits = levelEdits[editLevel]&lt;br /&gt;
		highEdits = levelEdits[editLevel-1]&lt;br /&gt;
		lowTime = levelTime[editLevel]&lt;br /&gt;
		highTime = levelTime[editLevel-1]&lt;br /&gt;
		needsEdits = true&lt;br /&gt;
	else&lt;br /&gt;
		userLevel = levelNames[timeLevel]&lt;br /&gt;
		nextLevel = levelNames[timeLevel-1]&lt;br /&gt;
		lowEdits = levelEdits[timeLevel]&lt;br /&gt;
		highEdits = levelEdits[timeLevel-1]&lt;br /&gt;
		lowTime = levelTime[timeLevel]&lt;br /&gt;
		highTime = levelTime[timeLevel-1]&lt;br /&gt;
		needsTime = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Build notice&lt;br /&gt;
	-- First paragraph&lt;br /&gt;
	fullMessage = fullMessage .. styleoverride .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
					navbar({&amp;quot;Template:Service award progress&amp;quot;,style=&amp;quot;float:right&amp;quot;,mini=1}) ..&lt;br /&gt;
					&amp;#039;Currently, this editor has earned the &amp;lt;b&amp;gt;&amp;#039; .. userLevel .. &amp;#039;&amp;lt;/b&amp;gt; service award.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
	if topLevel then&lt;br /&gt;
		fullMessage = fullMessage .. &amp;#039;&amp;lt;div&amp;gt;This is the highest level achievable by an editor!&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		fullMessage = fullMessage .. &amp;#039;&amp;lt;div&amp;gt;To get to the next level, &amp;#039; .. nextLevel .. &amp;#039;, &amp;#039; .. genderoverride .. &amp;#039; to meet the &amp;#039;&lt;br /&gt;
		if needsBoth then&lt;br /&gt;
			fullMessage = fullMessage .. &amp;#039;&amp;lt;b&amp;gt;editing&amp;lt;/b&amp;gt; and the &amp;lt;b&amp;gt;time&amp;lt;/b&amp;gt; requirement.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		elseif needsEdits then&lt;br /&gt;
			fullMessage = fullMessage .. &amp;#039;&amp;lt;b&amp;gt;editing&amp;lt;/b&amp;gt; requirement.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			fullMessage = fullMessage .. &amp;#039;&amp;lt;b&amp;gt;time&amp;lt;/b&amp;gt; requirement.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		-- Second paragra / progress bars&lt;br /&gt;
		if displayall or needsBoth or needsEdits then&lt;br /&gt;
			fullMessage = fullMessage .. &amp;#039;Progress towards the next level (by edits): [&amp;amp;nbsp;&amp;#039; ..&lt;br /&gt;
							&amp;#039;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[&amp;#039; .. url .. &amp;#039; &amp;#039; ..&lt;br /&gt;
							(edits - lowEdits) .. &amp;#039;]&amp;lt;/span&amp;gt;&amp;amp;nbsp;/&amp;amp;nbsp;&amp;#039; ..&lt;br /&gt;
							(highEdits - lowEdits) .. &amp;#039;&amp;amp;nbsp;]&amp;#039;&lt;br /&gt;
			fullMessage = fullMessage .. progressBar(edits - lowEdits, highEdits - lowEdits)&lt;br /&gt;
		end&lt;br /&gt;
		if displayall or needsBoth or needsTime then&lt;br /&gt;
			fullMessage = fullMessage .. &amp;#039;Progress towards the next level (by time): [&amp;amp;nbsp;&amp;#039; ..&lt;br /&gt;
							(editorTime - lowTime) .. &amp;#039;&amp;amp;nbsp;days&amp;amp;nbsp;/&amp;amp;nbsp;&amp;#039; ..&lt;br /&gt;
							(highTime - lowTime) .. &amp;#039;&amp;amp;nbsp;days&amp;amp;nbsp;]&amp;#039;&lt;br /&gt;
			fullMessage = fullMessage .. progressBar(editorTime - lowTime, highTime - lowTime)&lt;br /&gt;
		end&lt;br /&gt;
		fullMessage = fullMessage .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return fullMessage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return p.serviceLevel(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;MusikBot II</name></author>
	</entry>
</feed>