<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ARFX_report</id>
	<title>Module:RFX report - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ARFX_report"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:RFX_report&amp;action=history"/>
	<updated>2026-04-09T12:50:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:RFX_report&amp;diff=144552&amp;oldid=prev</id>
		<title>imported&gt;Enterprisey: change &quot;recent RfAs&quot; link to WP:Requests for adminship by year as it&#039;s much more useful than the individual pages</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:RFX_report&amp;diff=144552&amp;oldid=prev"/>
		<updated>2022-09-20T22:44:44Z</updated>

		<summary type="html">&lt;p&gt;change &amp;quot;recent RfAs&amp;quot; link to &lt;a href=&quot;/index.php?title=WP:Requests_for_adminship_by_year&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;WP:Requests for adminship by year (page does not exist)&quot;&gt;WP:Requests for adminship by year&lt;/a&gt; as it&amp;#039;s much more useful than the individual pages&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module is a replacement for the RfX report bot.&lt;br /&gt;
&lt;br /&gt;
local rfx = require( &amp;#039;Module:Rfx&amp;#039; )&lt;br /&gt;
local colours = mw.loadData( &amp;#039;Module:RFX report/colour&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function getTableLength(tbl)&lt;br /&gt;
	local length = 0&lt;br /&gt;
	for _ in pairs(tbl) do&lt;br /&gt;
		length = length + 1&lt;br /&gt;
	end&lt;br /&gt;
	return length&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getRfxes()&lt;br /&gt;
    -- Get the title object for [[Wikipedia:Requests for adminship]].&lt;br /&gt;
    local noError, rfa = pcall( mw.title.new, &amp;#039;Wikipedia:Requests for adminship&amp;#039; )&lt;br /&gt;
    if not noError or ( noError and not rfa ) then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    local rfaText = rfa:getContent()&lt;br /&gt;
    if not rfaText then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Return a table with a list of pages transcluded from&lt;br /&gt;
    -- [[Wikipedia:Requests for adminship]], minus the exceptions&lt;br /&gt;
    -- which are always transcluded there.&lt;br /&gt;
    local t = {}&lt;br /&gt;
    local exceptions = { &amp;#039;Front matter&amp;#039;, &amp;#039;Header&amp;#039;, &amp;#039;bureaucratship&amp;#039; }&lt;br /&gt;
    for rfxPage, rfxSubpage in mw.ustring.gmatch( rfaText, &amp;#039;{{[ _]*([wW]ikipedia:[rR]equests for %w+/([^{}]-))[ _]*}}&amp;#039; ) do&lt;br /&gt;
        local isException = false&lt;br /&gt;
        for _, v in ipairs( exceptions ) do&lt;br /&gt;
            if rfxSubpage == v then&lt;br /&gt;
                isException = true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not isException then&lt;br /&gt;
            table.insert( t, rfxPage )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRow( rfxObject )&lt;br /&gt;
    if not ( type( rfxObject ) == &amp;#039;table&amp;#039; and rfxObject.getTitleObject and rfxObject.getSupportUsers ) then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    local style = &amp;#039;&amp;#039;&lt;br /&gt;
    local styleInline = &amp;#039;&amp;#039;&lt;br /&gt;
    local status = rfxObject:getStatus()&lt;br /&gt;
    if status == &amp;#039;pending closure&amp;#039; then&lt;br /&gt;
        style = &amp;#039; style=&amp;quot;background: #f8cdc6;&amp;quot; |&amp;#039;&lt;br /&gt;
        styleInline = &amp;#039; background: #f8cdc6;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local page = rfxObject:getTitleObject().prefixedText&lt;br /&gt;
    local user = rfxObject.user or rfxObject:getTitleObject().subpageText&lt;br /&gt;
    local supports = rfxObject.supports&lt;br /&gt;
    local opposes = rfxObject.opposes&lt;br /&gt;
    local neutrals = rfxObject.neutrals&lt;br /&gt;
    local percent = rfxObject.percent&lt;br /&gt;
    local colour&lt;br /&gt;
    if percent then&lt;br /&gt;
        colour = colours[ rfxObject.type ][ percent ]&lt;br /&gt;
    end&lt;br /&gt;
    colour = colour or &amp;#039;&amp;#039;&lt;br /&gt;
    local votes&lt;br /&gt;
    if supports and opposes and neutrals and percent then&lt;br /&gt;
        votes = mw.ustring.format( [==[&lt;br /&gt;
        &lt;br /&gt;
| style=&amp;quot;text-align: right;%s&amp;quot; | [[%s#Support|%d]]&lt;br /&gt;
| style=&amp;quot;text-align: right;%s&amp;quot; | [[%s#Oppose|%d]]&lt;br /&gt;
| style=&amp;quot;text-align: right;%s&amp;quot; | [[%s#Neutral|%d]]&lt;br /&gt;
| style=&amp;quot;text-align: right; background: #%s;&amp;quot; | %d]==],&lt;br /&gt;
            styleInline, page, supports,&lt;br /&gt;
            styleInline, page, opposes,&lt;br /&gt;
            styleInline, page, neutrals,&lt;br /&gt;
            colour, percent&lt;br /&gt;
        )&lt;br /&gt;
    else&lt;br /&gt;
        votes = &amp;#039;\n| colspan=&amp;quot;4&amp;quot; style=&amp;quot;background: #f8cdc6;&amp;quot; | Error parsing votes&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if status then&lt;br /&gt;
        status = mw.language.getContentLanguage():ucfirst( status )&lt;br /&gt;
        if status == &amp;#039;Pending closure&amp;#039; then&lt;br /&gt;
            status = &amp;#039;Pending closure...&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        status = mw.ustring.format( &amp;#039;\n| %s %s&amp;#039;, style, status )&lt;br /&gt;
    else&lt;br /&gt;
        status = &amp;#039;\n| style=&amp;quot;background: #f8cdc6;&amp;quot; | Error getting status&amp;#039;&lt;br /&gt;
    end &lt;br /&gt;
    local endTime = rfxObject.endTime&lt;br /&gt;
    local secondsLeft = rfxObject:getSecondsLeft()&lt;br /&gt;
    local timeLeft = rfxObject:getTimeLeft()&lt;br /&gt;
    local time&lt;br /&gt;
    if endTime and timeLeft then&lt;br /&gt;
        time = mw.ustring.format( &amp;#039;\n| %s %s\n| %s %s&amp;#039;, style, endTime, style, timeLeft )&lt;br /&gt;
    else&lt;br /&gt;
        time = &amp;#039;\n| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background: #f8cdc6;&amp;quot; | Error parsing end time&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local dupes = rfxObject:dupesExist()&lt;br /&gt;
    if dupes then&lt;br /&gt;
        dupes = &amp;quot;&amp;#039;&amp;#039;&amp;#039;yes&amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
    elseif dupes == false then&lt;br /&gt;
        dupes = &amp;#039;no&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        dupes = &amp;#039;--&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local report = rfxObject:getReport()&lt;br /&gt;
    if report then&lt;br /&gt;
        report = mw.ustring.format( &amp;#039;\n|%s [%s report]&amp;#039;, style, tostring( report ) )&lt;br /&gt;
    else&lt;br /&gt;
        report = &amp;#039;\n| style=&amp;quot;background: #f8cdc6;&amp;quot; | Report not found&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.format(&lt;br /&gt;
        &amp;#039;\n|-\n|%s [[%s|%s]]%s%s%s\n| style=&amp;quot;text-align: center;%s&amp;quot; | %s%s&amp;#039;,&lt;br /&gt;
        style, page, user, votes, status, time, styleInline, dupes, report&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeHeading( rfxType )&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
    local rfxCaps&lt;br /&gt;
    if rfxType == &amp;#039;rfa&amp;#039; then&lt;br /&gt;
        rfxCaps = &amp;#039;RfA&amp;#039;&lt;br /&gt;
    elseif rfxType == &amp;#039;rfb&amp;#039; then&lt;br /&gt;
        rfxCaps = &amp;#039;RfB&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.format(&lt;br /&gt;
        &amp;#039;\n|-\n! %s candidate !! &amp;lt;abbr title=&amp;quot;Support&amp;quot;&amp;gt;S&amp;lt;/abbr&amp;gt; !! &amp;lt;abbr title=&amp;quot;Oppose&amp;quot;&amp;gt;O&amp;lt;/abbr&amp;gt; !! &amp;lt;abbr title=&amp;quot;Neutral&amp;quot;&amp;gt;N&amp;lt;/abbr&amp;gt; !! &amp;lt;abbr title=&amp;quot;%% Support&amp;quot;&amp;gt;S %%&amp;lt;/abbr&amp;gt; !! Status !! Ending (UTC) !! Time left !! &amp;lt;abbr title=&amp;quot;Has duplicate votes?&amp;quot;&amp;gt;Dups?&amp;lt;/abbr&amp;gt; !! Report&amp;#039;,&lt;br /&gt;
        rfxCaps&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getRfasRfbsSeparate()&lt;br /&gt;
	local rfxes = getRfxes()&lt;br /&gt;
    if not rfxes then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    -- Get RfX objects and separate RfAs and RfBs.&lt;br /&gt;
    local rfas = {}&lt;br /&gt;
    local rfbs = {}&lt;br /&gt;
    for i, rfxPage in ipairs( rfxes ) do&lt;br /&gt;
        local rfxObject = rfx.new( rfxPage )&lt;br /&gt;
        if rfxObject then&lt;br /&gt;
            if rfxObject.type == &amp;#039;rfa&amp;#039; then&lt;br /&gt;
                table.insert( rfas, rfxObject )&lt;br /&gt;
            elseif rfxObject.type == &amp;#039;rfb&amp;#039; then&lt;br /&gt;
                table.insert( rfbs, rfxObject )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return rfas, rfbs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeReportRows()&lt;br /&gt;
	local rfas, rfbs = getRfasRfbsSeparate()&lt;br /&gt;
&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    if #rfas &amp;gt; 0 then&lt;br /&gt;
        table.insert( ret, makeHeading( &amp;#039;rfa&amp;#039; ) )&lt;br /&gt;
        for i, rfaObject in ipairs( rfas ) do&lt;br /&gt;
            table.insert( ret, makeRow( rfaObject ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if #rfbs &amp;gt; 0 then&lt;br /&gt;
        table.insert( ret, makeHeading( &amp;#039;rfb&amp;#039; ) )&lt;br /&gt;
        for i, rfbObject in ipairs( rfbs ) do&lt;br /&gt;
            table.insert( ret, makeRow( rfbObject ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat( ret )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeReport( args )&lt;br /&gt;
    local purgeLink = mw.title.getCurrentTitle():fullUrl( &amp;#039;action=purge&amp;#039; )&lt;br /&gt;
    local header = mw.ustring.format(&lt;br /&gt;
        &amp;#039;\n|+ Requests for [[Wikipedia:Requests for adminship|adminship]] and [[Wikipedia:Requests for bureaucratship|bureaucratship]]&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;float: right;&amp;quot;&amp;gt;&amp;lt;small&amp;gt;[%s update]&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
        purgeLink&lt;br /&gt;
    )&lt;br /&gt;
    local rows = makeReportRows() or &amp;#039;&amp;#039;&lt;br /&gt;
    if rows == &amp;#039;&amp;#039; then&lt;br /&gt;
        rows = &amp;#039;\n|-\n| colspan=&amp;quot;10&amp;quot; | No current discussions. &amp;lt;small&amp;gt;[[WP:Requests for adminship by year|Recent RfAs]], recent RfBs: ([[Wikipedia:Successful bureaucratship candidacies|successful]], [[Wikipedia:Unsuccessful bureaucratship candidacies|unsuccessful]])&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local style = args.style&lt;br /&gt;
    if not style then&lt;br /&gt;
        local float = args.float or args.align or &amp;#039;right&amp;#039;&lt;br /&gt;
        local clear = args.clear or &amp;#039;left&amp;#039;&lt;br /&gt;
        style = mw.ustring.format(&lt;br /&gt;
            &amp;#039;style=&amp;quot;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;&amp;quot;&amp;#039;,&lt;br /&gt;
            clear, float&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.format( &amp;#039;\n{| class=&amp;quot;wikitable&amp;quot; %s%s%s\n|-\n|}&amp;#039;, style, header, rows )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.countRfas()&lt;br /&gt;
	local rfas, rfbs = getRfasRfbsSeparate()&lt;br /&gt;
	return getTableLength(rfas)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main( frame )&lt;br /&gt;
    -- Process the arguments.&lt;br /&gt;
    local args&lt;br /&gt;
    if frame == mw.getCurrentFrame() then&lt;br /&gt;
        args = frame:getParent().args&lt;br /&gt;
        for k, v in pairs( frame.args ) do&lt;br /&gt;
            args = frame.args&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        args = frame&lt;br /&gt;
    end    &lt;br /&gt;
    return makeReport( args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Enterprisey</name></author>
	</entry>
</feed>