Jump to content

User:Terasail/ArticleInfo.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Terasail (talk | contribs) at 15:11, 25 February 2023 (Undid revision 1141533533 by Terasail (talk) Wrong js). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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>
	Article Info
	Created by: Terasail
*/
// jshint esnext: false, esversion: 8
var infoArticleID = mw.config.get("wgArticleId");
var infoAction = mw.config.get("wgAction");
var api = new mw.Api();

var relevantUserName = mw.config.get("wgRelevantUserName");
if (relevantUserName != null) {
	let userInfoHtml = '<div id="p-userinfo" class="vector-menu mw-portlet"><div class="vector-menu-heading">User Information</div><div class="vector-menu-content"><ul id="usrinfo-ul" class="vector-menu-content-list"></ul></div>';
	$(userInfoHtml).insertBefore($("#p-tb"));
	if ($("#vector-page-tools").length === 0) {
		$("#p-userinfo").addClass("vector-main-menu-group vector-menu-portal");
	}
	$("#usrinfo-ul").append($("#t-contributions"), [$("#t-log")]);
	if (document.getElementById("t-userrights") != null) {
		$("#usrinfo-ul").append($("#t-userrights"));
		$.when( mw.loader.using( 'mediawiki.util' ), $.ready ).then( function () {
			let globalAccount = mw.util.addPortletLink(
				'p-userinfo',
				"/wiki/Special:CentralAuth/" + relevantUserName,
				'Global account',
				't-global-account',
				'View global account information', '', ''
			);
			let xToolsAccount = mw.util.addPortletLink(
				'p-userinfo',
				"https://xtools.wmflabs.org/ec/" + mw.config.get("wgServerName") + "/" + relevantUserName,
				'Open xTools',
				't-xtools-account',
				'Open xTools user information', '', ''
			);
			if (infoAction === "view" || infoAction === "edit") {
				api.get({
					action: "query",
					list: "users",
					ususers: relevantUserName,
					usprop: "editcount|groups|implicitgroups",
					format: "json"
				}).done(function (data) {
					let rightsAbbreviation = {
						extendedconfirmed: "EC",
						reviewer: "PCR",
						rollbacker: "R",
						autopatrolled: "AP",
						autoreviewer: "AP",
						patroller: "P",
						filemover: "FM",
						extendedmover: "PM",
						accountcreator: "AC",
						eventcoordinator: "EvCo",
						templateeditor: "TE",
						"ipblock-exempt": "IPBE",
						abusefilter: "EFM",
						"abusefilter-helper": "EFH",
						"massmessage-sender": "MMS",
						sysop: "A",
						bureaucrat: "B",
						steward: "S",
						"interface-admin": "IA",
						suppress: "O",
						checkuser: "CU",
						bot: "BOT",
						translationadmin: "TA",
						"import": "IM",
						propertycreator: "PC",
						gwtoolset: "GWT",
						transwiki: "TW",
						uploader: "U",
						centralnoticeadmin: "CNA",
						oauthadmin: "OAA",
						"global-renamer": "GR",
						flood: "F",
						"image-reviewer": "IR",
						upwizcampeditors: "UWC",
						"machinevision-tester": "MVT"
					};
					let userData = data.query.users[0];
					let groups = userData.groups;
					groups = groups.slice(0, 0 - userData.implicitgroups.length);
					for (let i = 0; i < groups.length; i++) {
						groups[i] = rightsAbbreviation[groups[i]];
					}
					let styledSpan = '<span style="white-space: nowrap;border-left:1px solid #a2a9b1;color:#54595d;margin-left:5px;padding-left:5px;font-size:0.875rem;font-family:sans-serif;">';
					$("#firstHeading").append($(styledSpan + "Edits: " + addCommas(userData.editcount) + '</span>'));
					if (groups.length != 0) {
						$("#firstHeading").append($(styledSpan + "Groups: " + groups.toString().replaceAll(",", ", ") + '</span>'));
					}
				});
			}
		});
	}
}

if (infoArticleID !== 0 && (infoAction === "view" || infoAction === "edit")) {
	api.get({
		action: "query",
		prop: "pageviews|info|revisions|pageassessments",
		pageids: infoArticleID,
		pvipdays: "30",
		inprop: "protection|watchers",
		rvprop: "timestamp|user",
		rvlimit: "1",
		rvdir: "newer",
		palimit: "1",
		format: "json"
	}).done(function (data) {
		data = data.query.pages[infoArticleID];
		let serverName = mw.config.get("wgServerName");
		let pageName = mw.config.get("wgPageName");
		//IDs: infoBar - infoImgs, infoRevs, infoEditors, infoViews, infoWatch, infoCreated, infoXTools.
		let spanBorder = 'border-right:1px solid #a2a9b1;';
		let spanStyle = 'white-space:nowrap;margin-right:5px;padding-right:5px;margin-top:10px;margin-bottom:5px;';
		let infoBarHtml = '<div id="infoBar" class="vector-page-toolbar-container" style="flex-wrap:wrap;"><span id="infoImgs"></span><span id="infoRevs"></span><span id="infoEditors"></span><span id="infoViews"></span><span id="infoWatch"></span><span id="infoCreated"></span><span id="infoXTools"></span></div>';
		$(".vector-page-toolbar").prepend($(infoBarHtml));
		let barSpans = $("#infoBar").children();

		//Assessment & Protection icons
		let assessments = {
			NA: ["6/6a/Symbol_na_class"],
			Draft: ["0/09/Symbol_draft_class"],
			Template: ["5/5c/Symbol_template_class"],
			Redirect: ["a/a2/Symbol_redirect_class", "c"],
			Project: ["7/72/Symbol_project_class"],
			Portal: ["e/e2/Symbol_portal_class"],
			File: ["9/9c/Symbol_file_class"],
			Disambig: ["2/2a/Symbol_dab_class", "c"],
			Category: ["9/96/Symbol_category_class"],
			List: ["d/db/Symbol_list_class"],
			Stub: ["f/f5/Symbol_stub_class"],
			Start: ["a/a4/Symbol_start_class"],
			C: ["e/e6/Symbol_c_class"],
			B: ["5/5f/Symbol_b_class"],
			A: ["2/25/Symbol_a_class", "c"],
			GA: ["9/94/Symbol_support_vote"],
			FM: ["b/bc/Featured_article_star", "c"],
			FL: ["b/bc/Featured_article_star", "c"],
			FA: ["b/bc/Featured_article_star", "c"],
			"": ["e/e0/Symbol_question"]
		};
		let editLocks = {
			move: ["4/44/Move-protection-shackle"],
			upload: ["d/d7/Upload-protection-shackle"],
			cascade: ["0/0f/Cascade-protection-shackle"],
			sysop: ["1/12/Full-protection-shackle-block", "c"],
			templateeditor: ["5/53/Template-protection-shackle"],
			extendedconfirmed: ["8/8c/Extended-protection-shackle"],
			autoconfirmed: ["1/1b/Semi-protection-shackle"]
		};
		let assessment = data.pageassessments;
		let protection = data.protection;
		let icons = "";
		if (assessment != null) {
			icons += createImg(assessments[Object.entries(assessment)[0][1].class], false);
		}
		for (let i = 0; i < protection.length; i++) {
			let protType = protection[i].type;
			let protLevel = protection[i].level;
			if (icons.includes("Cascade") == false) {
				if (protType == "move" || protType == "upload") {
					icons += createImg(editLocks[protType], true);
				} else if (protType == "edit") {
					if (icons.includes("protection") == false) {
						icons += createImg(editLocks[protLevel], true);
					} else {
						icons += createImg(editLocks.cascade, true);
					}
				}
			}
		}
		if (icons != "") {
			$("#infoImgs").append(icons);
			$("#infoImgs")[0].style = spanStyle + spanBorder;
		}

		//Async revision and editor count requests
		getEdits(spanStyle + spanBorder);
		getEditors(spanStyle + spanBorder);

		//Pageviews
		let rawViews = Object.entries(data.pageviews);
		let totalViews = 0;
		for (let i = 0; i < rawViews.length; i++) {
			if (typeof rawViews[i][1] == "number") {
				totalViews += rawViews[i][1];
			}
		}
		$("#infoViews").append(addCommas(totalViews) + ' <abbr title="Pageviews in the last 30 days">Pageviews</abbr>');
		$("#infoViews")[0].style = spanStyle + spanBorder;

		//Page watchers
		let watchers = data.watchers;
		if (watchers != null) {
			$("#infoWatch").append(addCommas(watchers) + ' <abbr title="Users with this page on their watchlist">Watchers</abbr>');
			$("#infoWatch")[0].style = spanStyle + spanBorder;
		}

		//Page creation
		let firstRev = data.revisions[0];
		let created = 'Created ' + new Date(firstRev.timestamp).toUTCString().slice(5, 16) + ', by ';
		let firstUser = firstRev.user;
		api.get({
			action: "query",
			list: "users",
			ususers: firstUser,
			usprop: "editcount|groups|implicitgroups",
			format: "json"
		}).done(function(data) {
			let userQuery = data.query.users[0];
			created += '<a href="/wiki/User:' + firstUser + '">' + firstUser + '</a>';
			if (typeof (userQuery.editcount) !== "undefined" && typeof (userQuery.groups) !== "undefined") {
				created += ' (' + addCommas(userQuery.editcount) + " edits";
				let numRights = userQuery.groups.length - userQuery.implicitgroups.length;
				if (numRights > 0) {
					created += " | " + numRights + " group";
					if (numRights > 1) {
						created += "s";
					}
				}
				created += ")";
			}
			$("#infoCreated").append(created);
			$("#infoCreated")[0].style = spanStyle + spanBorder;
		});

		//Page information link
		let xToolsLink = '<a target="_blank" href="https://xtools.wmflabs.org/articleinfo/' + serverName + '/' + pageName + '">Open xTools</a>';
		$("#infoXTools").append(xToolsLink);
		$("#infoXTools")[0].style = spanStyle.replace("margin-right:5px;padding-right:5px;", "");
	});
}

async function getEdits(style) {
	try {
		let numEdits = await fetch("https://" + mw.config.get("wgServerName") + "/w/rest.php/v1/page/" + mw.config.get("wgPageName").replaceAll("/", "%2F") + "/history/counts/edits?");
		numEdits = await numEdits.json();
		numEdits = addCommas(numEdits.count).replace("30,000", "30k+") + " Revision";
		if (numEdits !== "1 Revision") {
			numEdits += "s";
		}
		$("#infoRevs").append(numEdits);
		$("#infoRevs")[0].style = style;
	} catch( err ) {
		console.error(err.message);
	}
}

async function getEditors(style) {
	try {
		let numUsrs = await fetch("https://" + mw.config.get("wgServerName") + "/w/rest.php/v1/page/" + mw.config.get("wgPageName").replaceAll("/", "%2F") + "/history/counts/editors?");
		numUsrs = await numUsrs.json();
		numUsrs = addCommas(numUsrs.count).replace("30,000", "30k+") + " Editor";
		if (numUsrs !== "1 Editor") {
			numUsrs += "s";
		}
		$("#infoEditors").append(numUsrs);
		$("#infoEditors")[0].style = style;
	} catch( err ) {
		console.error(err.message);
	}
}

function createImg(data, protection) {
	if (data != null) {
		if (data.length === 1) {
			data[1] = "en";
		} else if (data[1] === "c") {
			data[1] = "commons";
		}
		let imageStr = '<a href="/wiki/File:' + data[0].slice(5) + '.svg">';
		if (protection) {
			imageStr = '<a target="_blank" href="/w/index.php?title=Special:Log&type=protect&page=' + mw.config.get("wgPageName") + '">';
		}
		imageStr += '<img src="/media/wikipedia/' + data[1] + '/thumb/';
		imageStr += data[0] + ".svg/25px-" + data[0].slice(5);
		imageStr += '.svg.png" decoding="async" width="18" height="18"></a>';
		return imageStr;
	}
}

function addCommas(number) {
	if (typeof(number) == "number") {
		return number.toLocaleString('en-US');
	}
	return number;
}
//</nowiki>[[Category:Wikipedia scripts]]