MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:坑触可/js/userblockedinfo2.js

来自MCBBS Wiki
跳到导航 跳到搜索

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

  • 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
$(function () {
    var markUG = function () {
        var $users = $('a.mw-userlink');
        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 (title) {
            return title.replace('用户:', '').replace(/_/g, ' ').replace(/%(?!\d+)/g, '%25');
        };

        var done = function () {
            var group;
            $('a.mw-userlink').each(function (i, el) {
                var username = getUsername($(el).attr('title'));
                if (username) {
                    for (group in groups) {
                        if (groups.hasOwnProperty(group)) {
                            if (groups[group].list.indexOf(username) > -1) {
                                $(el).append('<sup class=UserBlockedInfo></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: 'blocks',
		bklimit: 100,
		bkusers: users.splice(0, 50).join('|'),
		bkprop: 'user|by|timestamp|expiry|reason|restrictions'
            }).done(process);
        }
    };


		// Callback: receive data and mark links
		function markLinks(resp, status, xhr) {

			serverTime = new Date(xhr.getResponseHeader('Date'));
			var list,
				blk,
				tip,
				links,
				lnk,
				blTime;
			if (!resp || !(list = resp.query) || !(list = list.blocks)) return;

			for (var i = 0; i < list.length; i++) {
				blk = list[i];
				var partial = blk.restrictions && !Array.isArray(blk.restrictions); //Partial block
				if (/^in/.test(blk.expiry)) {
					clss = partial ? 'user-blocked-partial' : 'user-blocked-indef';
					blTime = blk.expiry;
				} else {
					clss = partial ? 'user-blocked-partial' : 'user-blocked-temp';
					blTime = inHours(parseTS(blk.expiry) - parseTS(blk.timestamp));
				}
				tip = mbTooltip;
				if (partial) tip = mbTooltipPartial;
				tip = tip.replace('$1', blTime).replace('infinity', mbInfinity)
					.replace('$2', blk.by)
					.replace('$3', blk.reason)
					.replace('$4', inHours(serverTime - parseTS(blk.timestamp)));
				links = userLinks[blk.user];
				for (var k = 0; links && k < links.length; k++) {
					lnk = $(links[k]);
					lnk = lnk.addClass(clss);
					if (window.mbTipBox) {
						$('<span class=user-blocked-tipbox>#</span>').attr('title', tip).insertBefore(lnk);
					} else {
						lnk.attr('title', lnk.attr('title') + tip);
					}
				}
			}

			if (--apiRequests === 0) { // last response
				setCSS('', 'markBlockedStyle-2', 'remove');
				$('#ca-showblocks').parent().remove(); // remove added portlet link
			}
		}

		// --------AUX functions

		// 避免标签爆炸(mw.hook导致重复添加样式表)
		function setCSS(css, id, method) {
			var style = document.createElement('style');
			switch (method) {
			case 'add':
				if (document.getElementById(id))
					return;
				style.id = id;
				style.appendChild(document.createTextNode(css));
				document.head.appendChild(style);
				break;
			case 'remove':
				document.getElementById(id) && $('#' + id).remove(); // 原生document.getElementById(id).remove()方法不兼容IE
				break;
			default:
				return;
			}
		}

		// 20081226220605  or  2008-01-26T06:34:19Z   -> date
		function parseTS(ts) {
			var m = ts.replace(/\D/g, '').match(/(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/);
			return new Date(Date.UTC(m[1], m[2] - 1, m[3], m[4], m[5], m[6]));
		}

		function inHours(ms) { // milliseconds -> "2:30" or 5,06d or 21d
			var mm = Math.floor(ms / 60000);
			if (!mm) return Math.floor(ms / 1000) + '秒';
			var hh = Math.floor(mm / 60);
			mm = mm % 60;
			var dd = Math.floor(hh / 24);
			hh = hh % 24;
			if (dd) {
				if (dd < 10 && hh) return dd + '日' + hh + '小时';
				return dd + '日';
			}
			return hh + '小时' + zz(mm) + '分';
		}

		function zz(v) { // 6 -> '06'
			if (v <= 9) v = '0' + v;
			return v;
		}

    mw.hook('wikipage.content').add(function(e) {
        if (e.attr('id') === 'mw-content-text') {
            markUG();
            return;
        }
        if (e.hasClass('mw-changeslist')) markUG();
    });
});