User:LaMagiaaa/markrights.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* copied from zhwiki MediaWiki:Gadget-MarkRights.js oldid=61206443 */
/* Changed */

$(function () {
    var groups = {
    	//基本的な権限
    	autoconfirmed: {list: [], class: "markrights-autoconfirmed"},
    	extendedconfirmed: {list: [], class: "markrights-extendedconfirmed"},
    	//
    	//abusefilter
    	//abusefilter-helper
    	accountcreator: {list: [], class: "markrights-accountcreator"},
    	//arbcom Arbitration committee members 裁定委員会委員
    	//autoeditor  Автопатрулируемые Autoeditors autoconfirmed+autoreview
    	autoreview: {list: [], class: "markrights-autoreview"},
    	autoreviewer: {list: [], class: "markrights-autoreviewer"},
    	bot: {list: [], class: "markrights-bot"},
        bureaucrat: {list: [], class: "markrights-bureaucrat"},
        checkuser: {list: [], class: "markrights-checkuser"},
        //closer //ruwiki Closers Подводящие итоги 削除者
        confirmed: {list: [], class: "markrights-confirmed"},
        //copyviobot
        editer: {list: [], class: "markrights-editer"},
        eliminator: {list: [], class: "markrights-eliminator"},
        //engineer エンジニア Engineers
        //eventparticipant
        //extendedmover
        //founder
        //filemover
        flood: {list: [], class: "markrights-flood"},
        //flow-bot
        //inport
        'interface-admin': {list: [], class: "markrights-interface-admin"},
        //interface-editor //urwiki Interface editors インターフェース編集者
        'ipblock-exempt': {list: [], class: "markrights-ipblock-exempt"},
        //noratelimit
        oversight: {list: [], class: "markrights-oversight"},
        'massmessage-sender': {list: [], class: "markrights-massmessage-sender"},
        //nocreate //tawiki createpage 禁止
        patroller: {list: [], class: "markrights-patroller"},
        //propertycreator //プロパティ作成者 Property creators
        //researcher
        reviewer: {list: [], class: "markrights-reviewer"},
        rollbacker: {list: [], class: "markrights-rollbacker"},
        //suppressredirect //ruwiki Переименовывающие без перенаправлений / Redirect suppressing movers
        steward: {list: [], class: "markrights-steward"},
        sysop: {list: [], class: "markrights-sysop"},
        templateeditor: {list: [], class: "markrights-templateeditor"},
        transwiki: {list: [], class: "markrights-transwiki"},
        //trusted
        //user
        //wikidata-staff //Wikidata staffウィキデータスタッフ
    };
    var markUG = function () {
        var $users = $('a.mw-userlink:not(.mw-anonuserlink)');
        var users = {};
        $users.each(function (index, link) {
            users[link.textContent] = true;
        });

        var queue1 = [];
        var queue2 = [];
        var i = 0, n = 0;
        for (var user in users) {
            queue1.push(user);
            i++;
            if (i === 50) {
                queue2.push(queue1);
                queue1 = [];
                n++;
                i = 0;
            }
        }
        if (queue1.length > 0) {
            queue2.push(queue1);
            n++;
        }

        var getUsername = function (url) {
            var username = mw.util.getParamValue('title', url);
            if (username) {
            	return decodeURIComponent(username.replace(/(User:|利用者:|用戶:|Benutzer:|Benutzerin:|Thành viên:|사용자:|Потребител:|کاربر:|Utilisateur:|Utilizator:|Usuario:|Usuaria:|Utente:|مستخدم:|)/, '').replace(/_/g, ' '));
            }
            username = url.match(/\/wiki\/User:(.+?)$/) 
            || url.match(/\/wiki\/Benutzer:(.+?)$/) //de male
            || url.match(/\/wiki\/Benutzerin:(.+?)$/) //de female
            || url.match(/\/wiki\/Usuario:(.+?)$/) //es male
            || url.match(/\/wiki\/Usuaria:(.+?)$/) //es female
            || url.match(/\/wiki\/Utente:(.+?)$/) //it
            || url.match(/\/wiki\/%E5%88%A9%E7%94%A8%E8%80%85:(.+?)$/) //ja
            || url.match(/\/wiki\/Utilisateur:(.+?)$/) //fr
            || url.match(/\/wiki\/Utilizator:(.+?)$/) //ro
            || url.match(/\/wiki\/%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:(.+?)$/) //ar
            || url.match(/\/wiki\/%EC%82%AC%EC%9A%A9%EC%9E%90:(.+?)$/) //ko
            || url.match(/\/wiki\/Th%C3%A0nh_vi%C3%AAn:(.+?)$/) //vi
            || url.match(/\/wiki\/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1:(.+?)$/) //fa
            || url.match(/\/wiki\/%D0%9F%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%B8%D1%82%D0%B5%D0%BB:(.+?)$/) //bg
            || url.match(/\/wiki\/%E7%94%A8%E6%88%B6:(.+?)$/); //lzhwiki
            if (username) {
                return decodeURIComponent(username[1].replace(/_/g, ' '));
            }
            return null;
        };

        var done = function () {
            var group;
            $('a.mw-userlink:not(.mw-anonuserlink)').each(function (i, el) {
                var username = getUsername($(el).attr('href'));
                if (username) {
                    for (group in groups) {
                        if (groups.hasOwnProperty(group)) {
                            if (groups[group].list.includes(username)) {
                            	$(el).append('<sup class="' + groups[group].class + '"></sup>');
                            }
                        }
                    }
                }
            });
        };

        var process = function (data) {
            var users, group;
            if (data.query && data.query.users) {
                users = data.query.users;
            } else {
                users = [];
            }
            for (var i = 0; i < users.length; i++) {
                var user = users[i];
                if (user.groups) {
                    for (group in groups) {
                        if (groups.hasOwnProperty(group) && user.groups.indexOf(group) > -1) {
                            groups[group].list.push(user.name);
                        }
                    }
                }
            }
            n--;
            if (n <= 0) {
                done();
            }
        };
        var api = new mw.Api();
        for (var j = 0; j < queue2.length; j++) {
            api.get({
                format: 'json',
                action: 'query',
                list: 'users',
                usprop: 'groups',
                ususers: queue2[j].join('|')
            }).done(process);
        }
    };
    if (mw.config.get('wgDiffNewId') || mw.config.get('wgDiffOldId')) {
        // 啟用「互動式瀏覽歷史」,切換差異時重新標記
        mw.hook('wikipage.diff').add(function () { // Reload alongside the revision slider
            markUG();
        });
    } else if (['Recentchanges', 'Recentchangeslinked'].includes(mw.config.get('wgCanonicalSpecialPageName'))) {
        // 最近/相關更改更新時重新標記
        mw.hook('wikipage.content').add(function (element) {
            if (element.hasClass('mw-changeslist')) {
                markUG();
            }
        });
        markUG();
    } else {
        markUG();
    }
});