Module:Service award progress

local navbar = require('Module:Navbar')._navbar local mm = require('Module:Math') local p = {}

local function stripToNil(text) -- If text is a string, return its trimmed content, or nil if empty. -- Otherwise return text (which may, for example, be nil). if type(text) == 'string' then text = text:match('(%S.-)%s*$') end return text end local function progressBar(current, total) local percentDone = mm._round(current / total * 100, 1) local leftBar = '' local rightBar = '' if percentDone >= 100 then leftBar = 100 rightBar = 0 else leftBar = current / total * 100 rightBar = (100-current) / total * 100 end local progBarText = ' ' .. '  .. percentDone .. '%''' completed ' .. '' .. ' ' ..			' ' ..			' '	return progBarText end local levelNames = { 'Sagacious Editor', 'Ultimate Vanguard Editor', 'Senior Vanguard Editor', 'Vanguard Editor', 'Grandmaster Editor First-Class', 'Grandmaster Editor', 'Master Editor IV', 'Master Editor III', 'Master Editor II', 'Master Editor', 'Senior Editor III', 'Senior Editor II', 'Senior Editor', 'Veteran Editor IV', 'Veteran Editor III', 'Veteran Editor II', 'Veteran Editor', 'Experienced Editor', 'Yeoman Editor, level 4', 'Yeoman Editor, level 3', 'Yeoman Editor, level 2', 'Yeoman Editor', 'Journeyman Editor, level 4', 'Journeyman Editor, level 3', 'Journeyman Editor, level 2', 'Journeyman Editor', 'Apprentice Editor, level 4', 'Apprentice Editor, level 3', 'Apprentice Editor, level 2', 'Apprentice Editor', 'Novice Editor, level 4', 'Novice Editor, level 3', 'Novice Editor, level 2', 'Novice Editor', 'Registered Editor, level 4', 'Registered Editor, level 3', 'Registered Editor, level 2', 'Registered Editor', 'Wikipedian', } local levelTime = { 8035.5, 7305, 6574.5, 5844, 5113.5, 4383, 3652.4, 2922, 2556.7, 2191.5, 1826.2, 1643.6, 	1461, 1278.4, 1095.7, 913.1, 730.5, 547.9, 501.75, 456.25, 410.75, 365.25, 	319.1, 273.6, 228.1, 182.6, 160.3, 137.3, 114.3, 91.3, 75.5, 60.5, 45.5, 30.5, 	24, 16, 8, 1, 0, } local levelEdits = { 205000, 175000, 150000, 132000, 114000, 96000, 78000, 60000, 51000, 42000, 33000, 28500,	24000, 20000, 16000, 12000, 8000, 6000, 5500, 5000, 4500, 4000, 3500, 3000, 2500, 	2000, 1750, 1500, 1250, 1000, 800, 600, 400, 200, 150, 100, 50, 1, 0, } function p.serviceLevel(args) --Inputs local editorTime = tonumber(stripToNil(args.editorTime)) local edits = tonumber(stripToNil(args.edits)) local styleoverride = stripToNil(args.styleoverride) local genderoverride = stripToNil(args.genderoverride) local url = stripToNil(args.url) -- Other Variables local timeLevel = '' -- Level associated with time local editLevel = '' -- Level associated with edits local userLevel = '' -- Full name of current user level local lowEdits = '' -- Minimum number of edits for current user level local lowTime = '' -- Minimum amount of time for current user level local highEdits = '' -- Max number of edits for current user level local highTime = '' -- Max amount of time for current user level local nextLevel = '' -- Full name of next user level local fullMessage = '= levelTime[x] then			timeLevel = x			break		end	end	-- Fine "level" of editor based on edits	for y = 1, 39, 1 do		if edits >= levelEdits[y] then			editLevel = y			break		end	end	-- Set user level and the next level up	if timeLevel == editLevel then		if timeLevel == 1 then			userLevel = levelNames[1]			topLevel = true		else			userLevel = levelNames[editLevel]			nextLevel = levelNames[editLevel-1]			lowEdits = levelEdits[editLevel]			highEdits = levelEdits[editLevel-1]			lowTime = levelTime[editLevel]			highTime = levelTime[editLevel-1]			needsBoth = true		end	elseif timeLevel < editLevel then userLevel = levelNames[editLevel] nextLevel = levelNames[editLevel-1] lowEdits = levelEdits[editLevel] highEdits = levelEdits[editLevel-1] lowTime = levelTime[editLevel] highTime = levelTime[editLevel-1] needsEdits = true else userLevel = levelNames[timeLevel] nextLevel = levelNames[timeLevel-1] lowEdits = levelEdits[timeLevel] highEdits = levelEdits[timeLevel-1] lowTime = levelTime[timeLevel] highTime = levelTime[timeLevel-1] needsTime = true end -- Build notice -- First paragraph fullMessage = fullMessage .. styleoverride .. '">' ..					navbar({"Template:Service award progress",style="float:right",mini=1}) ..					'Currently, this editor has earned the ' .. userLevel .. ' service award. '	if topLevel then		fullMessage = fullMessage .. ' This is the highest level achievable by an editor! '	else		fullMessage = fullMessage .. ' To get to the next level, ' .. nextLevel .. ', ' .. genderoverride .. ' to meet the '		if needsBoth then			fullMessage = fullMessage .. 'editing and the time requirement. '		elseif needsEdits then			fullMessage = fullMessage .. 'editing requirement. '		else			fullMessage = fullMessage .. 'time requirement. '		end		-- Second paragra / progress bars		if displayall or needsBoth or needsEdits then			fullMessage = fullMessage .. 'Progress towards the next level (by edits): [ ' ..							' [' .. url .. ' ' ..							(edits - lowEdits) .. '] / ' ..							(highEdits - lowEdits) .. ' ]'			fullMessage = fullMessage .. progressBar(edits - lowEdits, highEdits - lowEdits) end if displayall or needsBoth or needsTime then fullMessage = fullMessage .. 'Progress towards the next level (by time): [ ' .. (editorTime - lowTime) .. ' days / ' .. (highTime - lowTime) .. ' days ]' fullMessage = fullMessage .. progressBar(editorTime - lowTime, highTime - lowTime) end fullMessage = fullMessage .. ' '	end return fullMessage end

function p.main(frame) return p.serviceLevel(frame.args) end

return p