MediaWiki:Gadget-BlockInfo.js

From Wiktionary, the free dictionary
Jump to navigation Jump to search

Note – after saving, you may have to bypass your browser’s cache to see the changes.

  • Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
  • Konqueror and Chrome: click Reload or press F5;
  • Opera: clear the cache in Tools → Preferences;
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

See also: Special:Gadgets.


// {{documentation}}
/*jshint undef:true */
/*global jQuery, mw */
(function(){
'use strict';

var api = new mw.Api();

function el(tag, child, attr, events) {
	var key, node = document.createElement(tag);
 
	if (child) {
		if (typeof child !== 'object')
			child = [child];
		for (var i = 0; i < child.length; ++i) {
			var ch = child[i];
			if ((ch === void(null)) || (ch === null))
				continue;
			else if (typeof ch !== 'object')
				ch = document.createTextNode(String(ch));
			node.appendChild(ch);
		}
	}
 
	if (attr) for (key in attr) {
		node.setAttribute(key, String(attr[key]));
	}
 
	if (events) for (key in events) {
		node.addEventListener(key, events[key], false);
	}
 
	return node;
}

function fmtDate(date) {
	// XXX: uses browser's time zone instead of preferences
	date = new Date(date);

	switch (mw.user.options.get('date')) {
	case 'dmy'     : return date.toLocaleTimeString() + ', ' + date.getDate() + ' ' + mw.language.months.genitive[date.getMonth()] + ' ' + date.getFullYear();
	case 'mdy'     : return date.toLocaleTimeString() + ', ' + mw.language.months.genitive[date.getMonth()] + ' ' + date.getFullYear() + ', ' + date.getDate();
	case 'ymd'     : return date.toLocaleTimeString() + ', ' + date.getFullYear() + ' ' + mw.language.months.genitive[date.getMonth()] + ' ' + date.getDate();
	case 'default' : return date.toLocaleString();
	case 'ISO 8601': return date.toISOString(); 
	}
}

var wd2iw = {
	'metawiki': 'm'
};

function buildList(user, callback) {
	var isAnon = mw.util.isIPv4Address(user) || mw.util.isIPv6Address(user);

	var rq = api.get({
		action: 'query',
		list: 'blocks' + (isAnon ? '|globalblocks' : '|globalallusers'),
		
		// blocks
		bkip: isAnon ? user : void(window.warranty),
		bkusers: isAnon ? void(window.warranty) : user,
		bkprop: 'id|user|range|timestamp|expiry|by|reason|flags',
		bkdir: 'older',
		
		// globalblocks
		bgip: isAnon ? user : void(window.warranty),
		bgprop: isAnon ? 'id|address|range|timestamp|expiry|by|reason' : void(window.warranty),
		bgdir: isAnon ? 'older' : void(window.warranty),
		
		// globalallusers
		agufrom: !isAnon ? user : void(window.warranty),
		aguto: !isAnon ? user : void(window.warranty),
		agulimit: !isAnon ? 1 : void(window.warranty),
		aguprop: !isAnon ? 'lockinfo' : void(window.warranty)
	});
	
	rq.then(function (result) {
		var list = el('ul'), item, i;

		if (result.query.globalallusers && result.query.globalallusers[0] && ('locked' in result.query.globalallusers[0])) {
			list.appendChild(el('li', [
				"This account is globally locked", 
				" (", el('a', "globalauth log", { href: mw.util.getUrl('m:Special:Log/globalauth', { page: 'User:' + user + '@global' }) }), ")."
			]));
		}
		
		for (i = 0; i < result.query.blocks.length; ++i) {
			item = result.query.blocks[i];
			list.appendChild(el('li', [
				fmtDate(item.timestamp),
				': ', el('a', item.by, { href: mw.util.getUrl('User:' + item.by) }),
				" blocked ", el('b', item.user),
				" (", el('a', 'block log', { href: mw.util.getUrl('Special:Log/block', { page: 'User:' + item.user }) }), "),",
				' expiring ', el('b', item.expiry === 'infinity' ? 'never' : fmtDate(item.expiry)),
				item.reason && " (", item.reason, item.reason && ")",
			]));
		}
	
		if (result.query.globalblocks)
		for (i = 0; i < result.query.globalblocks.length; ++i) {
			item = result.query.globalblocks[i];
			list.appendChild(el('li', [
				fmtDate(item.timestamp),
				': ', el('a', item.by, { href: mw.util.getUrl(wd2iw[item.bywiki] + ':User:' + item.by) }),
				" at ", el('code', item.bywiki),
				" globally blocked ", el('b', item.address),
				" (", el('a', "gblblock log", { href: mw.util.getUrl(wd2iw[item.bywiki] + ':Special:Log/gblblock', { page: 'User:' + item.address }) }), "),",
				" expiring ", el('b', item.expiry === 'infinity' ? "never" : fmtDate(item.expiry)),
				item.reason && " (", item.reason, item.reason && ")",
			]));
		}
		
		callback(list);
	});
	
	return rq;
}

function makeBox(user, relTo) {
	if (!user)
		return;
	relTo = relTo || document.getElementById('mw-content-text');

	var afterList, box = el('div', [
		el('p', [el('strong', user), ' is currently blocked.']),
		afterList = el('small', [
			el('a', "block log"        , { href: mw.util.getUrl('Special:Log/block', { page: 'User:' + user }) })
		])
	], {
		'class': 'mw-warning-with-logexcerpt'
	});

	relTo.rq = buildList(user, function (list) {
		relTo.rq = null;
		if (!list.hasChildNodes())
			return;

		box.insertBefore(list, afterList);
		relTo.parentNode.insertBefore(box, relTo);
	});

	return box;
}

var user;

var wgNamespaceNumber = mw.config.get('wgNamespaceNumber');
var wgNamespaceIds = mw.config.get('wgNamespaceIds');
var wgTitle = mw.config.get('wgTitle');

if ((wgNamespaceNumber & ~1) === wgNamespaceIds.user) {
	makeBox(wgTitle.replace(/\/.*$/, ''));
} else if ((mw.config.get('wgCanonicalSpecialPageName') === 'Contributions') || (mw.config.get('wgCanonicalSpecialPageName') === 'DeletedContributions')) {
	makeBox(wgTitle.indexOf('/') !== -1 ? wgTitle.replace(/^.*?\//, '') : mw.util.getParamValue('target'));
} else if (mw.config.get('wgCanonicalSpecialPageName') === 'Log') {
	user = mw.util.getParamValue('user');
	if (/^[^\/]+\/(block|delete)$/.test(wgTitle))
		return;
	if (wgTitle.indexOf('/') !== -1)
		user = wgTitle.replace(/^.*\//, '');
	makeBox(user);
} else if (mw.config.get('wgCanonicalSpecialPageName') === 'Block') {
	var ipinput = document.getElementById('mw-bi-target');
	var relTo = ipinput.form.getElementsByTagName('legend')[0].nextSibling;
	var warnnode = null;

	var refresh = function () {
		if (relTo.rq)
			relTo.rq.abort();

		if (warnnode && warnnode.parentNode) {
			warnnode.parentNode.removeChild(warnnode);
			warnnode = null;
		}

		if (!ipinput.value)
			return;

		warnnode = makeBox(ipinput.value, relTo);
	};

	var tmout;
	ipinput.addEventListener('input', function () {
		clearTimeout(tmout);
		tmout = setTimeout(refresh, 500);
	}, false);
	ipinput.addEventListener('change', function () {
		refresh();
	}, false);
	refresh();
	return;
}

})();