Module:RFX report
Jump to navigation
Jump to search
This Lua module is used in system messages, and on approximately 5,900 pages. Changes to it can cause immediate changes to the Wikipedia user interface. To avoid major disruption, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them. |
This module depends on the following other modules: |
Replaces User:Cyberpower678/RfX Report. Used in {{RFX report}}.
Output of the print function:
Lua error at line 164: attempt to get length of local 'rfas' (a nil value).
-- This module is a replacement for the RfX report bot.
local rfx = require( 'Module:Rfx' )
local colours = mw.loadData( 'Module:RFX report/colour' )
local p = {}
local function getTableLength(tbl)
local length = 0
for _ in pairs(tbl) do
length = length + 1
end
return length
end
local function getRfxes()
-- Get the title object for [[Wikipedia:Requests for adminship]].
local noError, rfa = pcall( mw.title.new, 'Wikipedia:Requests for adminship' )
if not noError or ( noError and not rfa ) then
return nil
end
local rfaText = rfa:getContent()
if not rfaText then
return nil
end
-- Return a table with a list of pages transcluded from
-- [[Wikipedia:Requests for adminship]], minus the exceptions
-- which are always transcluded there.
local t = {}
local exceptions = { 'Front matter', 'Header', 'bureaucratship' }
for rfxPage, rfxSubpage in mw.ustring.gmatch( rfaText, '{{[ _]*([wW]ikipedia:[rR]equests for %w+/([^{}]-))[ _]*}}' ) do
local isException = false
for _, v in ipairs( exceptions ) do
if rfxSubpage == v then
isException = true
end
end
if not isException then
table.insert( t, rfxPage )
end
end
return t
end
local function makeRow( rfxObject )
if not ( type( rfxObject ) == 'table' and rfxObject.getTitleObject and rfxObject.getSupportUsers ) then
return nil
end
local style = ''
local styleInline = ''
local status = rfxObject:getStatus()
if status == 'pending closure' then
style = ' style="background: #f8cdc6;" |'
styleInline = ' background: #f8cdc6;'
end
local page = rfxObject:getTitleObject().prefixedText
local user = rfxObject.user or rfxObject:getTitleObject().subpageText
local supports = rfxObject.supports
local opposes = rfxObject.opposes
local neutrals = rfxObject.neutrals
local percent = rfxObject.percent
local colour
if percent then
colour = colours[ rfxObject.type ][ percent ]
end
colour = colour or ''
local votes
if supports and opposes and neutrals and percent then
votes = mw.ustring.format( [==[
| style="text-align: right;%s" | [[%s#Support|%d]]
| style="text-align: right;%s" | [[%s#Oppose|%d]]
| style="text-align: right;%s" | [[%s#Neutral|%d]]
| style="text-align: right; background: #%s;" | %d]==],
styleInline, page, supports,
styleInline, page, opposes,
styleInline, page, neutrals,
colour, percent
)
else
votes = '\n| colspan="4" style="background: #f8cdc6;" | Error parsing votes'
end
if status then
status = mw.language.getContentLanguage():ucfirst( status )
if status == 'Pending closure' then
status = 'Pending closure...'
end
status = mw.ustring.format( '\n| %s %s', style, status )
else
status = '\n| style="background: #f8cdc6;" | Error getting status'
end
local endTime = rfxObject.endTime
local secondsLeft = rfxObject:getSecondsLeft()
local timeLeft = rfxObject:getTimeLeft()
local time
if endTime and timeLeft then
time = mw.ustring.format( '\n| %s %s\n| %s %s', style, endTime, style, timeLeft )
else
time = '\n| colspan="2" style="background: #f8cdc6;" | Error parsing end time'
end
local dupes = rfxObject:dupesExist()
if dupes then
dupes = "'''yes'''"
elseif dupes == false then
dupes = 'no'
else
dupes = '--'
end
local report = rfxObject:getReport()
if report then
report = mw.ustring.format( '\n|%s [%s report]', style, tostring( report ) )
else
report = '\n| style="background: #f8cdc6;" | Report not found'
end
return mw.ustring.format(
'\n|-\n|%s [[%s|%s]]%s%s%s\n| style="text-align: center;%s" | %s%s',
style, page, user, votes, status, time, styleInline, dupes, report
)
end
local function makeHeading( rfxType )
local frame = mw.getCurrentFrame()
local rfxCaps
if rfxType == 'rfa' then
rfxCaps = 'RfA'
elseif rfxType == 'rfb' then
rfxCaps = 'RfB'
else
return nil
end
return mw.ustring.format(
'\n|-\n! %s candidate !! <abbr title="Support">S</abbr> !! <abbr title="Oppose">O</abbr> !! <abbr title="Neutral">N</abbr> !! <abbr title="%% Support">S %%</abbr> !! Status !! Ending (UTC) !! Time left !! <abbr title="Has duplicate votes?">Dups?</abbr> !! Report',
rfxCaps
)
end
local function getRfasRfbsSeparate()
local rfxes = getRfxes()
if not rfxes then
return nil
end
-- Get RfX objects and separate RfAs and RfBs.
local rfas = {}
local rfbs = {}
for i, rfxPage in ipairs( rfxes ) do
local rfxObject = rfx.new( rfxPage )
if rfxObject then
if rfxObject.type == 'rfa' then
table.insert( rfas, rfxObject )
elseif rfxObject.type == 'rfb' then
table.insert( rfbs, rfxObject )
end
end
end
return rfas, rfbs
end
local function makeReportRows()
local rfas, rfbs = getRfasRfbsSeparate()
local ret = {}
if #rfas > 0 then
table.insert( ret, makeHeading( 'rfa' ) )
for i, rfaObject in ipairs( rfas ) do
table.insert( ret, makeRow( rfaObject ) )
end
end
if #rfbs > 0 then
table.insert( ret, makeHeading( 'rfb' ) )
for i, rfbObject in ipairs( rfbs ) do
table.insert( ret, makeRow( rfbObject ) )
end
end
return table.concat( ret )
end
local function makeReport( args )
local purgeLink = mw.title.getCurrentTitle():fullUrl( 'action=purge' )
local header = mw.ustring.format(
'\n|+ Requests for [[Wikipedia:Requests for adminship|adminship]] and [[Wikipedia:Requests for bureaucratship|bureaucratship]]<span class="plainlinks" style="float: right;"><small>[%s update]</small></span>',
purgeLink
)
local rows = makeReportRows() or ''
if rows == '' then
rows = '\n|-\n| colspan="10" | No current discussions. <small>Recent RfAs: ([[Wikipedia:Successful requests for adminship|successful]], [[Wikipedia:Unsuccessful adminship candidacies (Chronological)|unsuccessful]]) Recent RfBs: ([[Wikipedia:Successful bureaucratship candidacies|successful]], [[Wikipedia:Unsuccessful bureaucratship candidacies|unsuccessful]])</small>'
end
local style = args.style
if not style then
local float = args.float or args.align or 'right'
local clear = args.clear or 'left'
style = mw.ustring.format(
'style="white-space:wrap; clear: %s; margin-top: 0em; margin-bottom: .5em; float: %s; padding: .5em 0em 0em 1.4em; background: #ffffff; border-collapse: collapse; border-spacing: 0;"',
clear, float
)
end
return mw.ustring.format( '\n{| class="wikitable" %s%s%s\n|-\n|}', style, header, rows )
end
function p.countRfas()
local rfas, rfbs = getRfasRfbsSeparate()
return getTableLength(rfas)
end
function p.main( frame )
-- Process the arguments.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs( frame.args ) do
args = frame.args
break
end
else
args = frame
end
return makeReport( args )
end
return p