MediaWiki:Gadget-ShowUserGroup.js

    来自中国珂学院

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

    • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
    • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
    • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
    • Opera:按 Ctrl-F5。
    "use strict";
    $(() => (async () => {
        await mw.loader.using(["mw.Api", "mediawiki.Uri"]);
        const groupsKey = ["bureaucrat", "checkuser", "sysop", "patroller", "bot"].reverse();
        const groupsStr = {
            bureaucrat: "行",
            checkuser: "查",
            sysop: "管",
            patroller: "巡",
            bot: "机",
        };
        let cache;
        try {
            cache = JSON.parse(localStorage.getItem("AnnTools-usergroup"));
            if (!$.isPlainObject(cache)
                || typeof cache.timestamp !== "number" || cache.timestamp < new Date().getTime() - 30 * 60 * 1000
                || !$.isPlainObject(cache.groups)) {
                throw new Error();
            } else {
                for (const i of groupsKey) {
                    if (!Array.isArray(cache.groups[i])) {
                        throw new Error();
                    }
                }
            }
        } catch {
            const api = new mw.Api();
            const result = {};
            const eol = Symbol();
            let aufrom = undefined;
            while (aufrom !== eol) {
                const _result = await api.post({
                    action: "query",
                    list: "allusers",
                    augroup: groupsKey.join("|"),
                    aulimit: "max",
                    auprop: "groups",
                    aufrom,
                });
                if (_result.continue) {
                    aufrom = _result.continue.aufrom;
                } else {
                    aufrom = eol;
                }
                _result.query.allusers.forEach(({
                    name,
                    groups,
                }) => {
                    groups.forEach((group) => {
                        if (groupsKey.includes(group)) {
                            result[group] = result[group] || [];
                            if (!result[group].includes(name)) {
                                result[group].push(name);
                            }
                        }
                    });
                });
            }
            cache = {
                timestamp: new Date().getTime(),
                groups: result,
            };
        }
        localStorage.setItem("AnnTools-usergroup", JSON.stringify(cache));
        const hook = () => {
            $("a.mw-userlink:not(.markrights)").each((_, ele) => {
                ele.classList.add("markrights");
                const uri = new mw.Uri(ele.href);
                let username;
                const path = decodeURI(uri.path);
                if (/^\/User:[^/=%]+/.test(path)) {
                    username = path.match(/^\/User:([^/=%]+)/)[1].replace(/_/g, " ");
                } else if (/^User:[^/=%]+/.test(uri.query.title)) {
                    username = uri.query.title.match(/^User:([^/=%]+)/)[1].replace(/_/g, " ");
                }
                if (username) {
                    const self = $(ele);
                    groupsKey.forEach((group) => {
                        if (cache.groups[group].includes(username)) {
                            self.after(`<sup class="markrights-${group}">${groupsStr[group]}<sup>`);
                        }
                    });
                }
            });
        };
        hook();
        mw.hook("wikipage.content").add(hook);
        $(window).on("load", hook);
        $("body").append("<style>.markrights-bureaucrat{color:black}.markrights-checkuser{color:purple}.markrights-suppress{color:purple}.markrights-sysop{color:mediumvioletred}.markrights-patroller{color:sienna}.markrights-bot{color:blue}.markrights-goodeditor{color:green}sup[class^=markrights-]+sup[class^=markrights-]{margin-left:2px}</style>");
    })());