Difference between revisions of "Module:STikiLeaderboard"

From blackwiki
Jump to navigation Jump to search
blackwiki>Mr. Stradivarius
(avoid defining ten different output functions by using a metatable; and use string.match rather than mw.ustring.match as it works for this pattern, and it is faster)
m (16 revisions imported)
 
(3 intermediate revisions by 3 users not shown)
Line 6: Line 6:
 
local function findLeaderboardData(dfield, username)
 
local function findLeaderboardData(dfield, username)
 
username = username:gsub('%p', '%%%0')
 
username = username:gsub('%p', '%%%0')
    local r = {}
+
local r = {}
    r.rank, r.uses, r.vand, r.agf, r.queue, r.first, r.last, r.avg, r.yest, r.last30 = string.match(
+
r.rank, r.uses, r.vand, r.agf, r.queue, r.first, r.last, r.avg, r.yest, r.last30 = string.match(
        lbtext,
+
lbtext,
        '\n| align=center | (%d+) || align=left | %[%[User:' .. username .. '|' .. username
+
'\n| align=center | (%d+) || align=left | %[%[User:' .. username .. '|' .. username ..
        .. '%]%] %(%[%[User_Talk:' .. username .. '|talk%]%] | %[%[Special:Contributions/'
+
'%]%] %(%[%[User_Talk:' .. username .. '|talk%]%] | %[%[Special:Contributions/' ..
        .. username .. '|contribs%]%]%) || align=right | (%d+) || align=right | ([%d%.]+)%% '
+
username .. '|contribs%]%]%) || align=right | (%d+) || align=right | ([%d%.]+)%% ' ..
        .. '|| align=right | ([%d%.]+)%% || align=center | (%S+) || align=right '
+
'|| align=right | ([%d%.]+)%% || align=center | (%S+) || align=right ' ..
        .. '| {{ntsh|%d+}} (%d+) days ago || align=right | {{ntsh|%d+}} (%d+) days ago || align=right '
+
'| {{ntsh|%d+}} (%d+) days ago || align=right | {{ntsh|%d+}} (%d+) days ago || align=right ' ..
        .. '| {{ntsh|[%d%.]+}} ([%d%.]+) edits || align=right | (%d+) || align=right | (%d+)'
+
'| {{ntsh|[%d%.]+}} ([%d%.]+) edits || align=right | (%d+) || align=right | (%d+)'
    )
+
)
    return r[dfield]
+
return r[dfield]
 
end
 
end
  
Line 23: Line 23:
 
__index = function (t, key)
 
__index = function (t, key)
 
return function (frame)
 
return function (frame)
        local username = frame.args[1] or ''
+
local username = frame.args[1] or ''
        username = mw.getContentLanguage():ucfirst(mw.text.trim(username))
+
username = mw.getContentLanguage():ucfirst(mw.text.trim(username))
        if username == '' then
+
if username == '' then
            error('No username specified')
+
error('No username specified')
        end
+
end
        return findLeaderboardData(key, username)
+
return findLeaderboardData(key, username)
        end
+
end
    end
+
end
 
})
 
})

Latest revision as of 09:12, 27 September 2020

This module displays statistics about a given editor's use of the STiki anti-vandalism tool. It reads the information from Wikipedia:STiki/leaderboard.

Usage

{{#invoke:STikiLeaderboard|<!-- code -->|<!--username-->}}
Leaderboard data field Code
Rank rank
Uses uses
Percentage of edits tagged as vandalism vand
Percentage of edits reverted while assuming good faith agf
Favourite queue queue
First use first
Last use last
Average daily edits avg
Uses yesterday yest
Uses in the last 30 days last30

Examples

Input Output
{{#invoke:STikiLeaderboard|rank|West.andrew.g}} Lua error at line 3: Could not find the leaderboard text.
{{#invoke:STikiLeaderboard|uses|West.andrew.g}} Lua error at line 3: Could not find the leaderboard text.
{{#invoke:STikiLeaderboard|queue|Fraggle81}} Lua error at line 3: Could not find the leaderboard text.
{{#invoke:STikiLeaderboard|first|Widr}} Lua error at line 3: Could not find the leaderboard text.

-- Get the raw leaderboard content.
local lb = mw.title.new('Wikipedia:STiki/leaderboard')
local lbtext = (lb and lb:getContent()) or error('Could not find the leaderboard text')

-- Get a specific data value for a given username.
local function findLeaderboardData(dfield, username)
	username = username:gsub('%p', '%%%0')
	local r = {}
	r.rank, r.uses, r.vand, r.agf, r.queue, r.first, r.last, r.avg, r.yest, r.last30 = string.match(
		lbtext,
		'\n| align=center | (%d+) || align=left | %[%[User:' .. username .. '|' .. username ..
		'%]%] %(%[%[User_Talk:' .. username .. '|talk%]%] | %[%[Special:Contributions/' ..
		username .. '|contribs%]%]%) || align=right | (%d+) || align=right | ([%d%.]+)%% ' ..
		'|| align=right | ([%d%.]+)%% || align=center | (%S+) || align=right ' ..
		'| {{ntsh|%d+}} (%d+) days ago || align=right | {{ntsh|%d+}} (%d+) days ago || align=right ' ..
		'| {{ntsh|[%d%.]+}} ([%d%.]+) edits || align=right | (%d+) || align=right | (%d+)'
	)
	return r[dfield]
end

-- Expose the data values to wikitext
return setmetatable({}, {
	__index = function (t, key)
		return function (frame)
			local username = frame.args[1] or ''
			username = mw.getContentLanguage():ucfirst(mw.text.trim(username))
			if username == '' then
				error('No username specified')
			end
			return findLeaderboardData(key, username)
		end
	end
})