Fandom Developers 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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**
 * blockListTools
 * 
 * Adds a number of tools to the Block List for each user
 * @author Thundercraft5
 * @version 0.1
 * @uses: mediaWiki
 * @UCP Ready: Yes
 */
;(function(mw) {
	'use strict';
	const config = mw.config.get([
		'wgCanonicalSpecialPageName',
		'wgNamespaceNumber',
		'wgArticlePath'
	]);
	var preloads = 2;

	function logMsg(data) {
		return console.log('[BlockListTools]', typeof(data) === 'object' ? data.join(' ') : data);
	}

	if (window.blockListTools && window.blockListTools.Init || config.wgNamespaceNumber !== -1 && config.wgCanonicalSpecialPageName !== 'BlockList') {
		logMsg('Namespace/page is not supported, skipping importing script.');
		return;
	}
	window.blockListTools = window.blockListTools || {};
	window.blockListTools.Init = true;

	function init(i18n) {
		const msg = i18n.msg;
		/* IP tools */
		const targets = document.querySelectorAll('.TablePager_col_ipb_target');
		for (var i = 0; i < targets.length; i++) {
			const target = targets[i];
			const ip = target.querySelector('a > bdi').textContent;
			if (mw.util.isIPAddress(ip)) {
				/* Proxy Check/General Info */
				const proxy = document.createElement('a');
				proxy.title = msg('proxy-check-tooltip', ip).plain();
				proxy.textContent = msg('proxy-check-abbr').plain();
				proxy.href = 'https://www.ipqualityscore.com/free-ip-lookup-proxy-vpn-test/lookup/' + ip;

				/* Spam Blacklist check */
				const blacklist = document.createElement('a');
				blacklist.title = msg('spam-blacklist-tooltip', ip).plain();
				blacklist.textContent = msg('spam-blacklist-abbr').plain();
				blacklist.href = 'https://cleantalk.org/blacklists/' + ip;

				/* WhoIs check */
				const whois = document.createElement('a');
				whois.title = msg('whois-tooltip', ip).plain();
				whois.textContent = 'WHOIS';
				whois.href = 'https://cleantalk.org/whois/' + ip;

				const actionLinks = target.querySelector('span.mw-usertoollinks > :last-of-type');
				actionLinks.after(
					document.createTextNode(mw.msg('pipe-separator')),
					proxy,
					document.createTextNode(mw.msg('pipe-separator')),
					blacklist,
					document.createTextNode(mw.msg('pipe-separator')),
					whois
				);
			}
		}
		logMsg('Sucessfully appended IP tool links!');

		/* Action links */
		const table = document.getElementsByClassName('mw-blocklist')[0];
		const rows = table.rows;
		for (var j = 1; j < rows.length; j++) {
			const row = rows[j];
			const user = row.querySelector('.TablePager_col_ipb_target > a > bdi').textContent;
			const blockLinks = row.querySelector('td.TablePager_col_ipb_expiry > span.mw-blocklist-actions');

			// move unblock/block links
			row.querySelector('.TablePager_col_ipb_timestamp').append(blockLinks);
			blockLinks.before(document.createElement('br'));

			// change label and text
			const blockLink = blockLinks.querySelectorAll('a');
			for (var k = 0; k < blockLink.length; k++) {
				const ele = blockLink[k];
				if (ele.textContent === mw.msg('unblocklink')) {
					ele.textContent = msg('unblock-abbr').plain();
					ele.title = msg('unblock-user', user).plain();
				} else if (ele.textContent === mw.msg('change-blocklink')) {
					ele.textContent = msg('change-block-abbr').plain();
					ele.title = msg('change-block-tooltip', user).plain();
				}
			}

			// add abuse log link
			if (window.blockListTools.showAbuseLog) {
				const abuselog = document.createElement('a');
				abuselog.href = config.wgArticlePath.replace('$1', 'Special:AbuseLog?wpSearchUser=' + user);
				abuselog.textContent = msg('abuselog-abbr').plain();
				abuselog.title = msg('abuselog-tooltip', user).plain();

				blockLinks.querySelector(':last-of-type').after(
					document.createTextNode(mw.msg('pipe-separator')),
					abuselog
				);
			}
		}
		logMsg('Sucessfully Modified block list action links!');
	}

	function preload() {
		if (--preloads > 0) return;
		new mw.Api().loadMessagesIfMissing([
			'unblocklink',
			'change-blocklink',
			'pipe-separator'
		]).then(function() {
			window.dev.i18n.loadMessages('BlockListTools').done(init);
		});
	}

	mw.hook('dev.i18n').add(preload);
	mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(preload);

	importArticle({
		type: 'script',
		article: 'u:dev:MediaWiki:I18n-js/code.js'
	});
})(window.mediaWiki);