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 04:05, 14 February 2023 (Update). 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 wgArticleIdAI = mw.config.get("wgArticleId");
var wgServerNameAI = mw.config.get("wgServerName");
var wgpageNameAI = mw.config.get("wgPageName");
var wgActionAI = 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) {
		console.log(1)
		$("#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', '', ''
			);
			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": "IPE",
					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: "PROP",
					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]];
				}
				$("#usrinfo-ul").prepend($('<li class="mw-list-item"><a style="pointer-events:none;color:#54595d;font-size:0.8rem;"><i>Rights: ' + groups.toString().replaceAll(",", ", ") + '</i></a></li>'));
				$("#usrinfo-ul").prepend($('<li class="mw-list-item"><a style="pointer-events:none;color:#54595d;font-size:0.8rem;"><i>Edit count: ' + userData.editcount + '</i></a></li>'));
			});
		});
	}
}

if (wgArticleIdAI != 0 && (wgActionAI == "view" || wgActionAI == "edit")) {
	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"]};
	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"]};
	api.get({
		action: "query",
		prop: "pageviews|info|revisions|pageassessments",
		pageids: wgArticleIdAI,
		pvipdays: "30",
		inprop: "protection|watchers",
		rvprop: "timestamp|user",
		rvlimit: "1",
		rvdir: "newer",
		palimit: "1",
		format: "json"
	}).done(function(data) {
		data = data.query.pages[wgArticleIdAI];
		x = data;
		let protection = data.protection;
		let pageviews = Object.entries(data.pageviews);
		let firstUser = data.revisions[0].user;
		let firstTime = new Date(data.revisions[0].timestamp).toUTCString().slice(5, 16);
		let watchers = data.watchers;
		let totalViews = 0;
		let assessment = data.pageassessments;
		for (let i = 0; i < pageviews.length; i++) {
			if (typeof pageviews[i][1] == "number") {
				totalViews += pageviews[i][1];
			}
		}
		let icons = '<div id="apageInfoBar" style="font-size:90%; margin:5px 0px">';
		if (assessment != null) {
			assessment = createImg(assessments[Object.entries(assessment)[0][1].class], false);
			icons += assessment + " ";
		}
		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.includes("<img")) {
			icons += " ";
		}
		let mainStringAI = ' <abbr title="Pageviews in the last 30 days">Pageviews</abbr> &#183; ';
		mainStringAI = addCommas(totalViews) + mainStringAI;
		if (watchers != null) {
			mainStringAI += "Watchers: " + addCommas(watchers) + " &#183; ";
		}
		api.get({
			action: "query",
			list: "users",
			ususers: firstUser,
			usprop: "editcount|groups|implicitgroups",
			format: "json"
		}).done(function(data) {
			let userQuery = data.query.users[0];
			mainStringAI += "Created on " + firstTime + ', by <a href="/wiki/User:' + firstUser + '">' + firstUser + '</a> (' + addCommas(userQuery.editcount) + ") ";
			let numRights = userQuery.groups.length - userQuery.implicitgroups.length;
			if (numRights > 0) {
				mainStringAI += "[" + numRights + " right";
				if (numRights != 1) {
					mainStringAI += "s";
				}
				mainStringAI += "] ";
			}
			mainStringAI += '&#183; <a target="_blank" href="https://xtools.wmflabs.org/articleinfo/' + wgServerNameAI + '/' + wgpageNameAI + '">Page information</a></div>';
			// mainStringAI = mainStringAI.replaceAll("undefined", "0");
			concatageInfo(icons, mainStringAI);
		});
	});
}

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=' + wgpageNameAI + '">';
		}
		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 addHtml(mainStringAI, id, target) {
	let bodyElm = document.getElementById("bodyContent");
	$(bodyElm).prepend(mainStringAI);
}

async function concatageInfo(icons, mainStringAI) {
	try {
		let numUsrs = await fetch("https://" + wgServerNameAI + "/w/rest.php/v1/page/" + wgpageNameAI.replaceAll("/", "%2F") + "/history/counts/editors?");
		let numRev = await fetch("https://" + wgServerNameAI + "/w/rest.php/v1/page/" + wgpageNameAI.replaceAll("/", "%2F") + "/history/counts/edits?");
		numUsrs = await numUsrs.json();
		numRev = await numRev.json();
		numUsrs = addCommas(numUsrs.count) + " Editor";
		numRev = addCommas(numRev.count) + " Revision";
		if (numUsrs != "1 Editor") { numUsrs += "s"; }
		if (numRev != "1 Revision") { numRev += "s"; }
		mainStringAI = icons + numRev + " &#183; " + numUsrs + " &#183; " + mainStringAI;
		mainStringAI = mainStringAI.replaceAll(/30,000(?= (Revision|Editor))/g, "30,000+");
		mainStringAI = mainStringAI.replace(/ *undefined */, "");
		addHtml(mainStringAI, "apageInfoBar", "usrInfoBar");
	} catch( err ) {
		console.error(err.message);
	}
}

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