Jump to content

User:Mdaniels5757/mark-global-blocked.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// @ts-check
// BETA!
// Companion to markblocked and marklocked - asynchronously marks gblocked IPs
// Derived from [[User:GeneralNotability/mark-locked.js]];
// Chunks borrowed from [[User:Krinkle/Scripts/CVNSimpleOverlay_wiki.js]],
// [[User:GeneralNotability/ip-ext-info.js]], and [[MediaWiki:Gadget-markblocked.js]]

/**
 * Get all userlinks on the page
 *
 * @param {JQuery} $content page contents
 * @return {Map} list of unique users on the page and their corresponding links
 */
function gblockedIPs_getIPs($content) {
	const userLinks = new Map();

	// Get all aliases for user: & user_talk: (taken from markblocked)
	const userNS = [];
	for ( const ns in mw.config.get( 'wgNamespaceIds' ) ) {
		if ( mw.config.get( 'wgNamespaceIds' )[ns] === 2 || mw.config.get( 'wgNamespaceIds' )[ns] === 3 ) {
			userNS.push( mw.util.escapeRegExp(ns.replace( /_/g, ' ' )) + ':' );
		}
	}

	// RegExp for all titles that are  User:| User_talk: | Special:Contributions/ | Special:Contribs/ | Special:CentralAuth/ | Special:GlobalBlockList/
	const userTitleRX = new RegExp('^(' + userNS.join('|') + '|Special:Contrib(?:ution)?s\\/|Special:CentralAuth\\/|Special:GlobalBlockList\\/)+([^#]+)$', 'i');	$('a', $content).each(function () {
	const articleRX = new RegExp(mw.config.get('wgArticlePath').replace('$1', '') + '([^#]+)');
	const redlinkRX = new RegExp('/w/index.php?title=([^#&]+)');
		if (!$(this).attr('href')) {
			// Ignore if the <a> doesn't have a href
			return;
		}
		let articleTitleReMatch = articleRX.exec($(this).attr('href').toString());
		if (!articleTitleReMatch) {
			// Try the redlink check
			articleTitleReMatch = redlinkRX.exec($(this).attr('href').toString());
			if (!articleTitleReMatch) {
				return;
			}
		}
		const pgTitle = decodeURIComponent(articleTitleReMatch[1]).replace(/_/g, ' ');
		const userTitleReMatch = userTitleRX.exec(pgTitle);
		if (!userTitleReMatch) {
			return;
		}
		const username = userTitleReMatch[2];
		if (mw.util.isIPAddress(username, true)) {
			if (!userLinks.get(username)) {
				userLinks.set(username, []);
			}
			userLinks.get(username).push($(this));
		}
	});
	return userLinks;
}

/**
 * Check whether an IP is globally blocked
 *
 * @param {string} IP to check
 *
 * @return {Promise<boolean>} Whether the IP in question is gblocked
 */
async function gblockedUsers_isGBlocked(input) {
	const api = new mw.Api();
	try {
		const response = await api.get({
			action: 'query',
			list: 'globalblocks',
			bglimit: '1',
			bgip: input,
			bgprop: 'address'
		});
		if (response.query.globalblocks.length === 0) {
			// If the length is 0, then no block
			return false;
		}
		// If there is a length, then the IP is gblocked
		return true;
	} catch (error) {
		return false;
	}
}

// On window load, get all the users on the page and check if they're blocked
$.when( $.ready, mw.loader.using( 'mediawiki.util' ) ).then( function () {
	mw.hook('wikipage.content').add(function ($content) {
		const usersOnPage = gblockedIPs_getIPs($content);
		usersOnPage.forEach(async (val, key, _) => {
			const userGBlocked = await gblockedUsers_isGBlocked(key);
			if (userGBlocked) {
				val.forEach(($link) => {
					$link.css({ opacity: 0.4, 'border-bottom-size': 'thick', 'border-bottom-style': 'dashed', 'border-bottom-color': 'red' });
				});
			}
		});
	});
});
// </nowiki>