<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://meta.wikioasis.org/wiki/User:Bosco/OnlineAdmins.js?action=history&amp;feed=atom</id>
	<title>User:Bosco/OnlineAdmins.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://meta.wikioasis.org/wiki/User:Bosco/OnlineAdmins.js?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://meta.wikioasis.org/wiki/User:Bosco/OnlineAdmins.js?action=history"/>
	<updated>2026-05-25T09:56:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://meta.wikioasis.org/wiki/User:Bosco/OnlineAdmins.js?diff=5355&amp;oldid=prev</id>
		<title>Bosco: online admins</title>
		<link rel="alternate" type="text/html" href="https://meta.wikioasis.org/wiki/User:Bosco/OnlineAdmins.js?diff=5355&amp;oldid=prev"/>
		<updated>2026-05-25T04:15:25Z</updated>

		<summary type="html">&lt;p&gt;online admins&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// === Language Detection ===&lt;br /&gt;
function detectLang() {&lt;br /&gt;
    var lang = mw.config.get(&amp;#039;wgUserLanguage&amp;#039;) || navigator.language || &amp;#039;en&amp;#039;;&lt;br /&gt;
    lang = lang.toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    var zhHantList = [&amp;#039;zh-hant&amp;#039;,&amp;#039;zh-hk&amp;#039;,&amp;#039;zh-mo&amp;#039;,&amp;#039;zh-tw&amp;#039;];&lt;br /&gt;
    var zhHansList = [&amp;#039;zh-hans&amp;#039;,&amp;#039;zh-cn&amp;#039;,&amp;#039;zh-sg&amp;#039;,&amp;#039;zh-my&amp;#039;,&amp;#039;zh&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    if (zhHantList.indexOf(lang) !== -1) {&lt;br /&gt;
        return &amp;#039;zh-hant&amp;#039;;&lt;br /&gt;
    } else if (zhHansList.indexOf(lang) !== -1) {&lt;br /&gt;
        return &amp;#039;zh-hans&amp;#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
        return &amp;#039;en&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
var userLang = detectLang();&lt;br /&gt;
&lt;br /&gt;
// === Labels &amp;amp; Messages ===&lt;br /&gt;
var labels = {&lt;br /&gt;
    admins: { &amp;#039;en&amp;#039;:&amp;#039;Admins&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;管理員&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;管理员&amp;#039; },&lt;br /&gt;
    bureaucrats: { &amp;#039;en&amp;#039;:&amp;#039;Bureaucrats&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;行政員&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;行政员&amp;#039; },&lt;br /&gt;
    stewards: { &amp;#039;en&amp;#039;:&amp;#039;Stewards&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;監管員&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;监管员&amp;#039; }&lt;br /&gt;
};&lt;br /&gt;
var helps = {&lt;br /&gt;
    admins: { &amp;#039;en&amp;#039;:&amp;#039;Seek help from admins.&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;向管理員尋求協助&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;向管理员寻求协助&amp;#039; },&lt;br /&gt;
    bureaucrats: { &amp;#039;en&amp;#039;:&amp;#039;Seek help from bureaucrats.&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;向行政員尋求協助&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;向行政员寻求协助&amp;#039; },&lt;br /&gt;
    stewards: { &amp;#039;en&amp;#039;:&amp;#039;Seek help from stewards.&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;向監管員尋求協助&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;向监管员寻求协助&amp;#039; }&lt;br /&gt;
};&lt;br /&gt;
var msgs = {&lt;br /&gt;
    noAdmins: { &amp;#039;en&amp;#039;:&amp;#039;Sorry! There are no Administrators online.&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;抱歉！目前沒有管理員在線。&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;抱歉！目前没有管理员在线。&amp;#039; },&lt;br /&gt;
    noBureaucrats: { &amp;#039;en&amp;#039;:&amp;#039;Sorry! There are no Bureaucrats online.&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;抱歉！目前沒有行政員在線。&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;抱歉！目前没有行政员在线。&amp;#039; },&lt;br /&gt;
    noStewards: { &amp;#039;en&amp;#039;:&amp;#039;Sorry! There are no Stewards online.&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;抱歉！目前沒有監管員在線。&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;抱歉！目前没有监管员在线。&amp;#039; },&lt;br /&gt;
    error404: { &amp;#039;en&amp;#039;:&amp;#039;Error 404&amp;#039;,&amp;#039;zh-hant&amp;#039;:&amp;#039;錯誤 404&amp;#039;,&amp;#039;zh-hans&amp;#039;:&amp;#039;错误 404&amp;#039; }&lt;br /&gt;
};&lt;br /&gt;
var onlineMsg = {&lt;br /&gt;
    admins: {&lt;br /&gt;
        &amp;#039;en&amp;#039;:&amp;#039;There are currently {n} Administrators online.&amp;#039;,&lt;br /&gt;
        &amp;#039;zh-hant&amp;#039;:&amp;#039;目前有 {n} 位管理員在線。&amp;#039;,&lt;br /&gt;
        &amp;#039;zh-hans&amp;#039;:&amp;#039;目前有 {n} 位管理员在线。&amp;#039;&lt;br /&gt;
    },&lt;br /&gt;
    bureaucrats: {&lt;br /&gt;
        &amp;#039;en&amp;#039;:&amp;#039;There are currently {n} Bureaucrats online.&amp;#039;,&lt;br /&gt;
        &amp;#039;zh-hant&amp;#039;:&amp;#039;目前有 {n} 位行政員在線。&amp;#039;,&lt;br /&gt;
        &amp;#039;zh-hans&amp;#039;:&amp;#039;目前有 {n} 位行政员在线。&amp;#039;&lt;br /&gt;
    },&lt;br /&gt;
    stewards: {&lt;br /&gt;
        &amp;#039;en&amp;#039;:&amp;#039;There are currently {n} Stewards online.&amp;#039;,&lt;br /&gt;
        &amp;#039;zh-hant&amp;#039;:&amp;#039;目前有 {n} 位監管員在線。&amp;#039;,&lt;br /&gt;
        &amp;#039;zh-hans&amp;#039;:&amp;#039;目前有 {n} 位监管员在线。&amp;#039;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// === Utility: Create User Link ===&lt;br /&gt;
function userLink(user) {&lt;br /&gt;
    return &amp;#039;&amp;lt;a href=&amp;quot;/wiki/User:&amp;#039; + user + &amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;#039; + user +&lt;br /&gt;
           &amp;#039;&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;small style=&amp;quot;opacity:.75;&amp;quot;&amp;gt;(&amp;lt;a href=&amp;quot;/wiki/User_talk:&amp;#039; + user +&lt;br /&gt;
           &amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Talk&amp;lt;/a&amp;gt;)&amp;lt;/small&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Generic Handler ===&lt;br /&gt;
function setupPortlet(group, label, help, msgNo, onlineMsgGroup, groupName) {&lt;br /&gt;
    var portletLink = mw.util.addPortletLink(&lt;br /&gt;
        &amp;#039;p-personal&amp;#039;,&amp;#039;#&amp;#039;,label[userLang],&amp;#039;t-online&amp;#039;+group,help[userLang],&amp;#039;&amp;#039;,&amp;#039;#pt-userpage&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
    $(portletLink).click(function(e) {&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        var users = [], usersExt = [], found = [];&lt;br /&gt;
        var api = new mw.Api();&lt;br /&gt;
        var time = new Date();&lt;br /&gt;
        var rcstart = time.toISOString();&lt;br /&gt;
        time.setMinutes(time.getMinutes() - 30);&lt;br /&gt;
        var rcend = time.toISOString();&lt;br /&gt;
&lt;br /&gt;
        api.get({&lt;br /&gt;
            format:&amp;#039;json&amp;#039;,action:&amp;#039;query&amp;#039;,list:&amp;#039;recentchanges&amp;#039;,&lt;br /&gt;
            rcprop:&amp;#039;user&amp;#039;,rcstart:rcstart,rcend:rcend,rcshow:&amp;#039;!bot|!anon&amp;#039;,rclimit:500&lt;br /&gt;
        }).done(function(data) {&lt;br /&gt;
            $.each(data.query.recentchanges,function(i,item){users.push(item.user);});&lt;br /&gt;
            api.get({&lt;br /&gt;
                format:&amp;#039;json&amp;#039;,action:&amp;#039;query&amp;#039;,list:&amp;#039;logevents&amp;#039;,&lt;br /&gt;
                leprop:&amp;#039;user&amp;#039;,lestart:rcstart,leend:rcend,lelimit:500&lt;br /&gt;
            }).done(function(data) {&lt;br /&gt;
                $.each(data.query.logevents,function(i,item){usersExt.push(item.user);});&lt;br /&gt;
                Array.prototype.push.apply(users,usersExt);&lt;br /&gt;
                users=$.unique(users.sort());&lt;br /&gt;
&lt;br /&gt;
                var promises=[];&lt;br /&gt;
                var mark=function(data){&lt;br /&gt;
                    $.each(data.query.users,function(i,user){&lt;br /&gt;
                        if($.inArray(&amp;#039;bot&amp;#039;,user.groups)===-1 &amp;amp;&amp;amp; $.inArray(groupName,user.groups)!==-1){&lt;br /&gt;
                            found.push(user.name);&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                };&lt;br /&gt;
                for(var i=0;i&amp;lt;users.length;i+=50){&lt;br /&gt;
                    promises.push(api.get({&lt;br /&gt;
                        format:&amp;#039;json&amp;#039;,action:&amp;#039;query&amp;#039;,list:&amp;#039;users&amp;#039;,&lt;br /&gt;
                        ususers:users.slice(i,i+50).join(&amp;#039;|&amp;#039;),usprop:&amp;#039;groups&amp;#039;&lt;br /&gt;
                    }).done(mark));&lt;br /&gt;
                }&lt;br /&gt;
                $.when.apply($,promises).done(function(){&lt;br /&gt;
                    if(found.length&amp;gt;0){&lt;br /&gt;
                        var out=[&amp;#039;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;&amp;#039;+label[userLang]+&amp;#039;&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&amp;#039;,&lt;br /&gt;
                                 &amp;#039;&amp;lt;p style=&amp;quot;word-break:break-all;&amp;quot;&amp;gt;&amp;#039;+&lt;br /&gt;
                                 onlineMsgGroup[userLang].replace(&amp;#039;{n}&amp;#039;,found.length)+&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;];&lt;br /&gt;
                        $.each(found,function(i,e){out.push(userLink(e));});&lt;br /&gt;
                        mw.notify($(out.join(&amp;#039;&amp;#039;)));&lt;br /&gt;
                    } else {&lt;br /&gt;
                        mw.notify(msgNo[userLang]);&lt;br /&gt;
                    }&lt;br /&gt;
                }).fail(function(){mw.notify(msgs.error404[userLang]);});&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Setup All Portlets ===&lt;br /&gt;
setupPortlet(&amp;#039;admin&amp;#039;,labels.admins,helps.admins,msgs.noAdmins,onlineMsg.admins,&amp;#039;sysop&amp;#039;);&lt;br /&gt;
setupPortlet(&amp;#039;bureaucrat&amp;#039;,labels.bureaucrats,helps.bureaucrats,msgs.noBureaucrats,onlineMsg.bureaucrats,&amp;#039;bureaucrat&amp;#039;);&lt;br /&gt;
setupPortlet(&amp;#039;steward&amp;#039;,labels.stewards,helps.stewards,msgs.noStewards,onlineMsg.stewards,&amp;#039;steward&amp;#039;);&lt;/div&gt;</summary>
		<author><name>Bosco</name></author>
	</entry>
</feed>