注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5
// Create portlet link
var portletLinkOnline = mw.util.addPortletLink(
    'p-personal',
    '#',
    '在线管理员',
    't-onlineadmin',
    '查看当前在线管理员',
    '',
    '#pt-userpage'
);


var rcstart, rcend, time;
var users =[];
var admins =[];
var uniqueuser, userTotal;
var api = new mw.Api();

// Bind click handler
$( "li#t-onlineadmin a" ).click( function () {
    users = [];
    users_ext = [];
    admins = [];
    userTotal = 0;
    
    // 最近更改30分钟内的编辑用户
    time = new Date();
    rcstart = time.toISOString();
    time.setMinutes(time.getMinutes() -30);
    rcend = time.toISOString();
    
    // API:RecentChanges
    api.get( {
        format: 'json',
        action: 'query',
        list: 'recentchanges',
        rcprop: 'user',
        rcstart: rcstart,
        rcend: rcend,
        rcshow: '!bot|!anon',
        rclimit: 500
        }).done( function ( data ) {
            $.each( data.query.recentchanges, function( i, item ) {
                users[i] = item.user;
            });
            api.get( {
                format: 'json',
                action: 'query',
                list: 'logevents',
                leprop: 'user',
                lepstart: rcstart,
                leend: rcend,
                lelimit: 500
            }).done( function ( data ) {
                $.each( data.query.logevents, function( i, item ) {
                    users_ext[i] = item.user;
                });
                        
                Array.prototype.push.apply(users, users_ext);

                // 用户去重与分割,因为一次最多只能查50人
                users = $.unique(users.sort());
                var promises = [];
                var mark = function(data) {
                    $.each(data.query.users, function(i, user) {
                        // 找到管理员,去除adminbot
                        if ($.inArray('sysop', user.groups) > -1 && $.inArray('bot', user.groups) === -1) {
                            admins[i]=user.name;
                        }
                    });
                };

                for (var i=0; i<(users.length+50)/50; i++) {
                    promises.push(api.get({
                        format: 'json',
                        action: 'query',
                        list: 'users',
                        ususers: users.slice(i*50, (i+1)*50).join('|'),
                        usprop: 'groups'
                    }).done(mark));
                }

                // 查询完成
                $.when.apply($, promises).done(function () {
                    // 消除空值
                    admins = admins.filter(function(n){return n});
                    // console.log( admins );
                    // 管理员数
                    userTotal=admins.length;
                    // mw.notify( '上线'+userTotal+'名管理员' ); 
                    
                    var userlink = function(user) {
                        var user2 = user.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&lt;');
                        return '<a href="/wiki/User:' + user2 + '" target="_blank">' + user2 + '</a>&nbsp;<small style="opacity:.75;">(<a href="/wiki/User talk:' + user2 + '" target="_blank">留言</a>)</small> ';
                    }
                    
                    if (userTotal>0) {
                        var adminsstring = [];
                        adminsstring.push('<p style="word-break:break-all;">' + wgULS('管理员', '管理員') + ' (' + admins.length + wgULS('个在线', '個在線') + '):');
                        $.each(admins, function(i, e) {
                            adminsstring.push(userlink(e));
                        });
                        adminsstring.push('</p>');
                        mw.notify($(adminsstring.join('<br>')));
                    } else {
                        mw.notify( wgUVS( '当前没有管理员在线。', '管理員無人在線上。' ) ); // Send a plaintext notification
                    }
               });
          });
     });    
});