Difference between revisions of "Module:STikiLeaderboard"

From blackwiki
Jump to navigation Jump to search
blackwiki>Mr. Stradivarius
(fix bug for usernames containing magic characters)
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)
Line 7: Line 7:
 
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 = mw.ustring.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
Line 19: Line 19:
 
end
 
end
  
-- Get the username from #invoke and return the rank using findLeaderboardData().
+
-- Expose the data values to wikitext
local function makeWrapper(dfield)
+
return setmetatable({}, {
    return function (frame)
+
__index = function (t, key)
        -- Get username, filter bad input, trim whitespace, and capitalise first letter.
+
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
 +
        return findLeaderboardData(key, username)
 
         end
 
         end
        return findLeaderboardData(dfield, username)
 
 
     end
 
     end
end
+
})
 
 
return {
 
    rank  = makeWrapper('rank'),
 
    uses  = makeWrapper('uses'),
 
    vand  = makeWrapper('vand'),
 
    agf    = makeWrapper('agf'),
 
    queue  = makeWrapper('queue'),
 
    first  = makeWrapper('first'),
 
    last  = makeWrapper('last'),
 
    avg    = makeWrapper('avg'),
 
    yest  = makeWrapper('yest'),
 
    last30 = makeWrapper('last30'),
 
}
 

Revision as of 23:46, 23 December 2015

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