Module:STikiLeaderboard

From blackwiki
Revision as of 23:46, 23 December 2015 by 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)
Jump to navigation Jump to search

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
})