imported>=海豚= |
imported>Func |
第1行: |
第1行: |
| mw.loader.load('https://www.hmoegirl.com/index.php?title=User:=海豚=/js/userStatus.js&action=raw&ctype=text/javascript');
| | [[Category: 工口魔物娘图鉴]] |
| "use strict";
| |
| $(() => (async () => {
| |
| await mw.loader.using(["mw.Api", "mediawiki.Uri"]);
| |
| const groupsKey = ["bureaucrat", "checkuser", "suppress", "sysop", "patroller", "bot", "goodeditor"].reverse();
| |
| const groupsStr = {
| |
| bureaucrat: "行",
| |
| checkuser: "查",
| |
| suppress: "监",
| |
| sysop: "管",
| |
| patroller: "巡",
| |
| bot: "机",
| |
| goodeditor: "优",
| |
| };
| |
| 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>`);
| |
| }
| |
| });
| |
| }
| |
| });
| |
| for (const group of Object.keys(groupsStr)) {
| |
| $(`.markrights-${group}`).nextUntil(':not([class*="markrights-"])').filter(`.markrights-${group}`).remove();
| |
| }
| |
| };
| |
| 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>");
| |
| })());
| |