<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://eurovision.jobogamer.xyz/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://eurovision.jobogamer.xyz/index.php?action=history&amp;feed=atom&amp;title=Module%3ARFX_report"/>
	<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=Module:RFX_report&amp;action=history"/>
	<updated>2026-05-22T03:06:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://eurovision.jobogamer.xyz/index.php?title=Module:RFX_report&amp;diff=3376&amp;oldid=prev</id>
		<title>imported&gt;Sapphaline: not an abbreviation</title>
		<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=Module:RFX_report&amp;diff=3376&amp;oldid=prev"/>
		<updated>2025-10-04T21:35:50Z</updated>

		<summary type="html">&lt;p&gt;not an abbreviation&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 status = rfxObject:getStatus()&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;
&lt;br /&gt;
    local percentStr = mw.ustring.format( &amp;#039;%d&amp;#039;, percent )&lt;br /&gt;
    if percent == 0 and supports == 0 and opposes == 0 and neutrals == 0 then&lt;br /&gt;
        percentStr = &amp;#039;N/A&amp;#039;&lt;br /&gt;
    elseif percent == 100 and opposes ~= 0 then&lt;br /&gt;
    	percentStr = &amp;#039;&amp;gt;99&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&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;
| class=&amp;quot;rfx-report-number&amp;quot; | [[%s#Support|%d]]&lt;br /&gt;
| class=&amp;quot;rfx-report-number&amp;quot; | [[%s#Oppose|%d]]&lt;br /&gt;
| class=&amp;quot;rfx-report-number&amp;quot; | [[%s#Neutral|%d]]&lt;br /&gt;
| class=&amp;quot;rfx-report-number rfx-report-percent&amp;quot; style=&amp;quot;background: #%s; color: #202122&amp;quot; | %s]==],&lt;br /&gt;
            page, supports,&lt;br /&gt;
            page, opposes,&lt;br /&gt;
            page, neutrals,&lt;br /&gt;
            colour, percentStr&lt;br /&gt;
        )&lt;br /&gt;
    else&lt;br /&gt;
        votes = &amp;#039;\n| colspan=&amp;quot;4&amp;quot; class=&amp;quot;rfx-report-error&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 = &amp;#039;\n|&amp;#039; .. status&lt;br /&gt;
    else&lt;br /&gt;
        status = &amp;#039;\n| class=&amp;quot;rfx-report-error&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\n| %s&amp;#039;, endTime, timeLeft )&lt;br /&gt;
    else&lt;br /&gt;
        time = &amp;#039;\n| colspan=&amp;quot;2&amp;quot; class=&amp;quot;rfx-report-error&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;#039;&amp;lt;span class=&amp;quot;rfx-report-dupes-yes&amp;quot;&amp;gt;yes&amp;lt;/span&amp;gt;&amp;#039;&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 report]&amp;#039;, tostring( report ) )&lt;br /&gt;
    else&lt;br /&gt;
        report = &amp;#039;\n| class=&amp;quot;rfx-report-error&amp;quot; | Report not found&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local pending_class = &amp;#039;&amp;#039;&lt;br /&gt;
    if status == &amp;#039;pending closure&amp;#039; then&lt;br /&gt;
        pending_class = &amp;#039;class=&amp;quot;rfx-report-pending&amp;quot;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.format(&lt;br /&gt;
        &amp;#039;\n|-%s\n| [[%s|%s]]%s%s%s\n| class=&amp;quot;rfx-report-dupes&amp;quot; | %s%s&amp;#039;,&lt;br /&gt;
        pending_class, page, user, votes, status, time, 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;
    elseif rfxType == &amp;#039;rrfa&amp;#039; then&lt;br /&gt;
    	rfxCaps = &amp;#039;RRfA&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! scope=&amp;quot;col&amp;quot; | %s candidate !! scope=&amp;quot;col&amp;quot; | &amp;lt;abbr title=&amp;quot;Support&amp;quot;&amp;gt;S&amp;lt;/abbr&amp;gt; !! scope=&amp;quot;col&amp;quot; | &amp;lt;abbr title=&amp;quot;Oppose&amp;quot;&amp;gt;O&amp;lt;/abbr&amp;gt; !! scope=&amp;quot;col&amp;quot; | &amp;lt;abbr title=&amp;quot;Neutral&amp;quot;&amp;gt;N&amp;lt;/abbr&amp;gt; !! scope=&amp;quot;col&amp;quot; | &amp;lt;abbr title=&amp;quot;Support percentage (%%)&amp;quot;&amp;gt;S %%&amp;lt;/abbr&amp;gt; !! scope=&amp;quot;col&amp;quot; | Status !! scope=&amp;quot;col&amp;quot; | Ending (UTC) !! scope=&amp;quot;col&amp;quot; | Time left !! scope=&amp;quot;col&amp;quot; | &amp;lt;span title=&amp;quot;Has duplicate votes?&amp;quot; style=&amp;quot;text-decoration:dotted underline&amp;quot;&amp;gt;Dups?&amp;lt;/span&amp;gt; !! scope=&amp;quot;col&amp;quot; | 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;
    local rrfas = {}&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;
            elseif rfxObject.type == &amp;#039;rrfa&amp;#039; then&lt;br /&gt;
            	table.insert( rrfas, rfxObject)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return rfas, rfbs, rrfas&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeReportRows()&lt;br /&gt;
	local rfas, rfbs, rrfas = getRfasRfbsSeparate()&lt;br /&gt;
&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    if #rfas + #rrfas &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;
        for i, rrfaObject in ipairs( rrfas ) do&lt;br /&gt;
            table.insert( ret, makeRow( rrfaObject ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &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;rfx-report-purge plainlinks&amp;quot;&amp;gt;[%s update]&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;span class=&amp;quot;rfx-report-recent&amp;quot;&amp;gt;[[WP:Requests for adminship by year|Recent RfAs]], recent RfBs: ([[Wikipedia:Successful bureaucratship candidacies|successful]], [[Wikipedia:Unsuccessful bureaucratship candidacies|unsuccessful]])&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local float = args.float or args.align&lt;br /&gt;
    if not float or mw.text.trim(float) == &amp;#039;&amp;#039; then&lt;br /&gt;
    	float = nil&lt;br /&gt;
    end&lt;br /&gt;
    local clear = args.clear&lt;br /&gt;
    if not clear or mw.text.trim(clear) == &amp;#039;&amp;#039; then&lt;br /&gt;
    	clear = nil&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local style = &amp;#039;&amp;#039;&lt;br /&gt;
    if float or clear then&lt;br /&gt;
    	style = string.format(&lt;br /&gt;
    		&amp;#039;style=&amp;quot;%s%s&amp;quot;&amp;#039;,&lt;br /&gt;
    		clear and (&amp;#039;clear: &amp;#039; .. clear .. &amp;#039;;&amp;#039;) or &amp;#039;&amp;#039;,&lt;br /&gt;
    		float and (&amp;#039;float: &amp;#039; .. float .. &amp;#039;;&amp;#039;) or &amp;#039;&amp;#039;&lt;br /&gt;
    	)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &amp;#039;templatestyles&amp;#039;, args = { src = &amp;#039;Module:RFX report/styles.css&amp;#039; }&lt;br /&gt;
	} .. mw.ustring.format(&lt;br /&gt;
    	&amp;#039;\n{| class=&amp;quot;wikitable rfx-report&amp;quot; %s%s%s\n|-\n|}&amp;#039;,&lt;br /&gt;
    	style,&lt;br /&gt;
    	header,&lt;br /&gt;
    	rows&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.countRfas()&lt;br /&gt;
	local rfas, rfbs, rrfas = 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;Sapphaline</name></author>
	</entry>
</feed>