<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/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://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AService_award_progress"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Service_award_progress&amp;action=history"/>
	<updated>2026-06-13T19:04:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Service_award_progress&amp;diff=479414&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Service_award_progress&amp;diff=479414&amp;oldid=prev"/>
		<updated>2021-07-16T05:56:28Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local navbar = require('Module:Navbar')._navbar&lt;br /&gt;
local mm = require('Module:Math')&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) == 'string' then&lt;br /&gt;
		text = text:match('(%S.-)%s*$')&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 = ''&lt;br /&gt;
	local rightBar = ''&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;lt;div style=&amp;quot;width:75%; margin:auto; text-align:center;&amp;quot;&amp;gt;' ..&lt;br /&gt;
			'&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: 120%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;' .. percentDone .. '%&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt; completed&amp;lt;/p&amp;gt;' ..&lt;br /&gt;
			'&amp;lt;p style=&amp;quot;border:1px solid #c8ccd1; padding:1px; overflow:hidden;&amp;quot;&amp;gt;' ..&lt;br /&gt;
			'&amp;lt;span style=&amp;quot;width: ' .. leftBar .. '%; height: 2px; background:#00af32; float:left;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;' ..&lt;br /&gt;
			'&amp;lt;span style=&amp;quot;width: ' .. rightBar .. '%; height: 2px; background:#eaecf0; float:left;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;' ..&lt;br /&gt;
			'&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;'&lt;br /&gt;
	&lt;br /&gt;
	return progBarText&lt;br /&gt;
end&lt;br /&gt;
local levelNames = {&lt;br /&gt;
	'[[Wikipedia:Service awards#Ultimate Vanguard Editor (or Cardinal Gom, the August Togneme of the Encyclopedia)|Ultimate Vanguard Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Senior Vanguard Editor (or Supreme Gom, the Most Exalted Togneme of the Encyclopedia)|Senior Vanguard Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Vanguard Editor (or Lord Gom, the Highest Togneme of the Encyclopedia)|Vanguard Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Grandmaster Editor First-Class (or Lord High Togneme Laureate)|Grandmaster Editor First-Class]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Grandmaster Editor (or Lord High Togneme Vicarus)|Grandmaster Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Master Editor IV (or Looshpah Laureate of the Encyclopedia)|Master Editor IV]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Master Editor III (or Most Plusquamperfect Looshpah Laureate)|Master Editor III]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Master Editor II (or Auspicious Looshpah)|Master Editor II]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Master Editor (or Illustrious Looshpah)|Master Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Senior Editor III (or Labutnum of the Encyclopedia)|Senior Editor III]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Senior Editor II (or Most Pluperfect Labutnum)|Senior Editor II]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Senior Editor (or Labutnum)|Senior Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Veteran Editor IV (or Tutnum of the Encyclopedia)|Veteran Editor IV]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Veteran Editor III (or Most Perfect Tutnum)|Veteran Editor III]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Veteran Editor II (or Grand Tutnum)|Veteran Editor II]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Veteran Editor (or Tutnum)|Veteran Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Experienced Editor (or Grognard Mirabilaire)|Experienced Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 4]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 3]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 2]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 4]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 3]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 2]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 4]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 3]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 2]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 4]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 3]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 2]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 4]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 3]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 2]]',&lt;br /&gt;
	'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor]]',&lt;br /&gt;
	'Wikipedian',&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 = '' -- Level associated with time&lt;br /&gt;
	local editLevel = '' -- Level associated with edits&lt;br /&gt;
	local userLevel = '' -- Full name of current user level&lt;br /&gt;
	local lowEdits = '' -- Minimum number of edits for current user level&lt;br /&gt;
	local lowTime = '' -- Minimum amount of time for current user level&lt;br /&gt;
	local highEdits = '' -- Max number of edits for current user level&lt;br /&gt;
	local highTime = '' -- Max amount of time for current user level&lt;br /&gt;
	local nextLevel = '' -- Full name of next user level&lt;br /&gt;
	local fullMessage = '&amp;lt;div style=&amp;quot;' -- 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) == 'yes' 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;quot;&amp;gt;' ..&lt;br /&gt;
					navbar({&amp;quot;Template:Service award progress&amp;quot;,style=&amp;quot;float:right&amp;quot;,mini=1}) ..&lt;br /&gt;
					'Currently, this editor has earned the &amp;lt;b&amp;gt;' .. userLevel .. '&amp;lt;/b&amp;gt; service award.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'&lt;br /&gt;
	if topLevel then&lt;br /&gt;
		fullMessage = fullMessage .. '&amp;lt;div&amp;gt;This is the highest level achievable by an editor!&amp;lt;/div&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		fullMessage = fullMessage .. '&amp;lt;div&amp;gt;To get to the next level, ' .. nextLevel .. ', ' .. genderoverride .. ' to meet the '&lt;br /&gt;
		if needsBoth then&lt;br /&gt;
			fullMessage = fullMessage .. '&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;'&lt;br /&gt;
		elseif needsEdits then&lt;br /&gt;
			fullMessage = fullMessage .. '&amp;lt;b&amp;gt;editing&amp;lt;/b&amp;gt; requirement.&amp;lt;/div&amp;gt;'&lt;br /&gt;
		else&lt;br /&gt;
			fullMessage = fullMessage .. '&amp;lt;b&amp;gt;time&amp;lt;/b&amp;gt; requirement.&amp;lt;/div&amp;gt;'&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 .. 'Progress towards the next level (by edits): [&amp;amp;nbsp;' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. url .. ' ' ..&lt;br /&gt;
							(edits - lowEdits) .. ']&amp;lt;/span&amp;gt;&amp;amp;nbsp;/&amp;amp;nbsp;' ..&lt;br /&gt;
							(highEdits - lowEdits) .. '&amp;amp;nbsp;]'&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 .. 'Progress towards the next level (by time): [&amp;amp;nbsp;' ..&lt;br /&gt;
							(editorTime - lowTime) .. '&amp;amp;nbsp;days&amp;amp;nbsp;/&amp;amp;nbsp;' ..&lt;br /&gt;
							(highTime - lowTime) .. '&amp;amp;nbsp;days&amp;amp;nbsp;]'&lt;br /&gt;
			fullMessage = fullMessage .. progressBar(editorTime - lowTime, highTime - lowTime)&lt;br /&gt;
		end&lt;br /&gt;
		fullMessage = fullMessage .. '&amp;lt;/div&amp;gt;'&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>Zoran</name></author>
	</entry>
</feed>