Jump to content

User:Awesome Aasim/usergroups.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>

function isIPV4Address(ip) {
	let digits = ip.split(".");
	if (digits.length != 4) {
		return false;
	}
	
	// for last digit see if it is a range
	let r0 = digits[3].split("/");
	let range;
	if (r0.length > 2) {
		return false;
	} else {
		digits[3] = r0[0];
		if (r0.length == 2) range = r0[1];
		else range = 0
	}
	
	// if any digits are empty string return false
	if (digits[0] === '' || digits[1] === '' || digits[2] === '' || digits[3] === '' || range === '') {
		return false;
	}
	
	return digits[0] < 256 && digits[0] >= 0
		&& digits[1] < 256 && digits[1] >= 0
		&& digits[2] < 256 && digits[2] >= 0
		&& digits[3] < 256 && digits[3] >= 0
		&& range <= 32 && range >= 0;
}

function isIPV6Address(ip) {
	let digits = ip.split(":");
	if (digits.length > 8) {
		return false;
	}
	
	// for last digit see if it is a range
	let r0 = digits[digits.length - 1].split("/");
	let range;
	if (r0.length > 2) {
		return false;
	} else {
		digits[digits.length - 1] = r0[0];
		if (r0.length == 2) range = r0[1];
		else range = 0;
	}
	
	for (let i = 0; i < digits.length; i++) {
		if (digits[i] === "") {
			let differenceInCIDRlength = 8 - digits.length;
			for (let j = 0; j < differenceInCIDRlength; j++) {
				digits.push("");
			}
			
			for (let j = digits.length - 1; j >= i; j--) {
				digits[j] = digits[j - differenceInCIDRlength];
				digits[j - differenceInCIDRlength] = "0";
			}
			digits[i] = "0";
			break;
		}
	}
	
	return "0x" + digits[0] < 65536 && "0x" + digits[0] >= 0
		&& "0x" + digits[1] < 65536 && "0x" + digits[1] >= 0
		&& "0x" + digits[2] < 65536 && "0x" + digits[2] >= 0
		&& "0x" + digits[3] < 65536 && "0x" + digits[3] >= 0
		&& "0x" + digits[4] < 65536 && "0x" + digits[4] >= 0
		&& "0x" + digits[5] < 65536 && "0x" + digits[5] >= 0
		&& "0x" + digits[6] < 65536 && "0x" + digits[6] >= 0
		&& "0x" + digits[7] < 65536 && "0x" + digits[7] >= 0
		&& range <= 128 && range >= 0;
}

function isIP(ip) {
	return isIPV6Address(ip) || isIPV4Address(ip)
}

mw.loader.using([ 'mediawiki.api', 'mediawiki.jqueryMsg' ], function() {
	mw.loader.load(`${window.location.origin + mw.config.get("wgScriptPath")}/index.php?title=User:Awesome_Aasim/usergroups.css&action=raw&ctype=text/css`, "text/css");
	mw.loader.load(`${window.location.origin + mw.config.get("wgScriptPath")}/index.php?title=MediaWiki:Usergroups.css&action=raw&ctype=text/css`, "text/css");
	if (!window.userGroupsLoaded) {
		window.userGroupsLoaded = true;
		window.userGroupsCache = {};
		$(document).ready(async function() {
			let user;
			if (mw.config.get("wgNamespaceNumber") == 2 || mw.config.get("wgNamespaceNumber") == 3) {
				user = mw.config.get("wgTitle").split("/")[0];
			} else if (mw.config.get("wgNamespaceNumber") == -1) {
				user = mw.config.get("wgTitle").split("/")[1] ? mw.config.get("wgTitle").split("/")[1] : null;
			}
			
			if (user) {
				let res = await $.get(mw.config.get('wgScriptPath') + '/api.php', {
					action: "query",
					list: "users|blocks",
					ususers: user,
					usprop: "groups|blockinfo",
					bkusers: isIP(user) ? undefined : user,
					bkip: isIP(user) ? user : undefined,
					format: "json"
				});
				if (!res.error) {
					var userdata = res.query.users[0];
					var blockdata = res.query.blocks.length > 0 ? res.query.blocks[0] : null;
					var usergroups = "";
					var messagesArray = [];
					var linksArray = [];
					if (userdata.invalid === null || userdata.invalid === undefined) {
						for (let group of userdata.groups) {
							messagesArray.push(`group-${group}-member`);
							linksArray.push(`grouppage-${group}`);
						}
					}
					messagesArray.push('blockedtitle');
					await new mw.Api().loadMessagesIfMissing(messagesArray);
					await new mw.Api().loadMessagesIfMissing(linksArray, {amlang: mw.config.get("wgContentLanguage")});
					$("#siteSub").text("");
					$("#siteSub").css("display", "block");
					$("#siteSub").append($('<div style="font-family:sans-serif;font-style: normal;" id="usergroups"></div>'));
					if (userdata.blockid || blockdata) {
						// readd block ID
						$("#firstHeading").append(`&nbsp;(<b><a href="${mw.config.get("wgScriptPath")}/index.php?title=Special:BlockList&wpTarget=${user}">${mw.message(`blockedtitle`)}</a></b>)`);
					}
					if (userdata.invalid === null || userdata.invalid === undefined) {
						for (let group of userdata.groups) {
							if (group == "*" || group == "user") continue;
							$("#usergroups").append(`<span class="usergroup usergroup-${group}"><a href="${mw.config.get("wgArticlePath").replace(/\$1/g, mw.message(`grouppage-${group}`))}">${mw.message(`group-${group}-member`).parse()}</a></span>&nbsp;`);
						}
					}
				} else {
					console.error(res.error);
				}
			}
			$(".mw-userlink").each(async function() {
				let that = this;
				let user = $(this).text();
				if (window.userGroupsCache[user]) {
					return;
				} else {
					window.userGroupsCache[user] = true;
				}
				
				let res = typeof window.userGroupsCache[user] == "object" ? window.userGroupsCache[user] : await $.get(mw.config.get('wgScriptPath') + '/api.php', {
					action: "query",
					list: "users|blocks",
					ususers: user,
					usprop: "groups|blockinfo",
					bkusers: isIP(user) ? undefined : user,
					bkip: isIP(user) ? user : undefined,
					format: "json"
				});
				if (res.error) {
					console.error(res.error);
					delete window.userGroupsCache[user];
				} else {
					window.userGroupsCache[user] = res;
					var userdata = res.query.users.length > 0 ? res.query.users[0] : {};
					var blockdata = res.query.blocks.length > 0 ? res.query.blocks[0] : null;
					var classString = "";
					classString += 'usergroup ';
					if (userdata.blockid) {
						classString += "usergroup-blocked ";
						if (userdata.blockpartial !== null && userdata.blockpartial !== undefined) {
							classString += "usergroup-blockedpartial ";
						}
					} else if (blockdata) {
						classString += "usergroup-blocked "
						if (blockdata.partial !== null && blockdata.partial !== undefined) {
							classString += "usergroup-blockedpartial ";
						}
					}
					if (userdata.invalid === null || userdata.invalid === undefined) {
						for (let group of userdata.groups) {
							if (group == "*" || group == "user") continue;
							classString += `usergroup-${group} `;
						}
					}
					$(`.mw-userlink:contains(${user})`).each(function() {
						if ($(this).text() != user) return;
						let $enclosure = $('<span></span>');
						$(this).before($enclosure);
						$enclosure.append($(this));
						$enclosure.addClass(classString);
					})
				}
			});
		});
	}
});
// </nowiki>