Jump to content

User:Mdaniels5757/mark-global-blocked.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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>