User:Terasail/ArticleInfo.js

/*

Article Info

Created by: Terasail

  • /

// jshint esnext: false, esversion: 8

if (mw.config.get("skin").split("-")[0] == "vector") { //If skin is 'vector' or 'vector-2022'

mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:Terasail/ArticleInfo.css&action=raw&ctype=text/css', 'text/css');

let wgUsername = mw.config.get("wgRelevantUserName");

$.when(mw.loader.using('mediawiki.util'), $.ready).then(function () {

if (wgUsername != null) {

userInfo(wgUsername);

}

let wgAction = mw.config.get("wgAction");

let wgArticleId = mw.config.get("wgRelevantArticleId");

if (wgArticleId !== 0 && (wgAction === "view" || wgAction === "edit")) {

pageInfo(wgArticleId);

}

});

}

async function userInfo(username) {

let userGroups = {

accountcreator: ["AC", "Account creator"],

abusefilter: ["EFM", "Edit filter manager"],

"abusefilter-helper": ["EFH", "Edit filter helper"],

autopatrolled: ["AP", "Autopatrolled"],

autoreviewer: ["AP", "Autopatrolled"],

bot: ["BOT", "BOT"],

bureaucrat: ["B", "Bureaucrat"],

centralnoticeadmin: ["CNA", "Central notice administrator"],

checkuser: ["CU", "Checkuser"],

confirmed: ["C", "Confirmed"],

eventcoordinator: ["EvCo", "Event coordinator"],

extendedconfirmed: ["EC", "Extended confirmed"],

extendedmover: ["PM", "Page mover"],

filemover: ["FM", "File mover"],

flood: ["Fl", "Flooder"],

founder: ["Founder", "Founder"],

"functioneer": ["F", "Functioneer"],

"functionmaintainer": ["M", "Maintainer"],

"global-renamer": ["GR", "Global renamer"],

gwtoolset: ["GWT", ""],

"image-reviewer": ["IR", "Image reviewer"],

"import": ["IM", "Importer"],

"interface-admin": ["IA", "Interface administrator"],

"ipblock-exempt": ["IPBE", "IP block exempt"],

"machinevision-tester": ["MVT", "Machine vision tester"],

"massmessage-sender": ["MMS", "Mass message sender"],

oauthadmin: ["OAA", "OAuth administrator"],

patroller: ["P", "Patroller"],

propertycreator: ["PC", "Property creator"],

reviewer: ["PCR", "Pending changes reviewer"],

rollbacker: ["R", "Rollbacker"],

steward: ["S", "Steward"],

suppress: ["O", "Oversighter"],

sysop: ["A", "Administrator"],

templateeditor: ["TE", "Template editor"],

translationadmin: ["TA", "Translation administrator"],

transwiki: ["TW", ""],

uploader: ["U", "Uploader"],

upwizcampeditors: ["UWC", ""],

"wikifunctions-staff": ["WFS", "Wikifunctions Staff"],

};

let links = [$('#t-contributions'), $('#t-log')];

mw.util.addPortlet('p-uinfo', 'User information', '#p-tb');

mw.util.addPortletLink(

'p-uinfo',

"https://xtools.wmflabs.org/ec/" + mw.config.get("wgServerName") + "/" + username,

'User xTools',

't-uxtools',

'Open xTools user information', ,

);

if ($('#t-userrights').length > 0) { //If a registered user

mw.util.addPortletLink(

'p-uinfo',

"/wiki/Special:CentralAuth/" + username,

'Global account',

't-cauth',

'View global account information', '', '#t-uxtools'

);

links.push($('#t-userrights'));

//Add user info to the top of the page

let userData = await aiApiGet({

action: "query",

list: "users",

ususers: username,

usprop: "editcount|groups|implicitgroups",

format: "json"

});

userData = userData.query.users[0];

let ubar = mw.util.addPortlet('p-ubar');

$('#firstHeading').append(ubar);

mw.util.addPortletLink(

'p-ubar',

"/wiki/Special:Contributions/" + username,

'Edits: ' + addCommas(userData.editcount),

't-uedits',

'Special:Contributions', ,

);

let groups = userData.groups;

groups = groups.slice(0, 0 - userData.implicitgroups.length);

for (let i = 0; i < groups.length; i++) {

let temp = userGroups[groups[i]];

if (temp != undefined) {

groups[i] = temp[0];

// groups[i] = '' + temp[0] + '';

}

}

if (groups.length > 0) {

mw.util.addPortletLink(

'p-ubar',

"/wiki/Special:UserRights/" + username,

'Groups: ' + groups.toString().replaceAll(",", ", "),

't-ugroups',

'Special:UserRights', ,

);

}

}

$('#p-uinfo ul').append(links);

}

async function pageInfo(articleId) {

let pXTools = mw.util.addPortletLink(

'p-cactions',

'https://xtools.wmflabs.org/articleinfo/' + mw.config.get("wgServerName") + '/' + encodeURIComponent(mw.config.get("wgRelevantPageName")),

'Page xTools',

't-pxtools',

'Open xTools page information', ,

);

pXTools.children[0].target = "_blank";

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 pbar = mw.util.addPortlet('p-pbar');

$('#bodyContent').prepend(pbar);

let pageBar = ["revs", "editors", "views", "watch", "created"];//"icons",

for (let a = 0; a < pageBar.length; a++) {

mw.util.addPortletLink('p-pbar', , , 't-' + pageBar[a], , , '');

$('#t-' + pageBar[a])[0].style = "display:none";

$('#t-' + pageBar[a]).append($('#t-' + pageBar[a] + ' span'));

$('#t-' + pageBar[a] + ' a').remove();

}

getPageviews(articleId); //Separate - Can throw errors on new pages

//Separate - Speed up load: no need to wait on loading other requests

getPageCounts();

getAssessment(articleId);

let pageQuery = await aiApiGet({

action: "query",

prop: "info|revisions",

pageids: articleId,

inprop: "protection|watchers",

rvprop: "timestamp|user",

rvlimit: "1",

rvdir: "newer",

format: "json"

});

let pageInfo = pageQuery.query.pages[articleId];

//Watchers

if (pageInfo.watchers != null) {

$('#t-watch span').append(addCommas(pageInfo.watchers) + ' Watchers');

$('#t-watch')[0].style = "";

}

//Page Protection

let protections = pageInfo.protection;

if (protections.length > 0) {

let elemBefore = "#t-revs";

if (document.getElementById('t-pasmt')) {

elemBefore = "#t-pasmt";

}

let pProt = mw.util.addPortletLink(

'p-pbar',

mw.util.getUrl('Special:Log', {type: 'protect', page: mw.config.get('wgRelevantPageName')}),

'',

't-pprot',

'Open page protection log', '', elemBefore

);

pProt.children[0].target = "_blank";

$('#t-pprot span')[0].remove();

}

let cascade = false;

for (let i = 0; i < protections.length; i++) {

if (protections[i].source) {

if (!cascade) {

cascade = true;

$('#t-pprot a').append(createImg(editLocks.cascade));

}

} else {

if (protections[i].type == "edit") {

$('#t-pprot a').append(createImg(editLocks[protections[i].level]));

} else {

$('#t-pprot a').append(createImg(editLocks[protections[i].type]));

}

}

}

//First page revision

let pageRev = pageQuery.query.pages[articleId].revisions[0];

let userQuery = await aiApiGet({

action: "query",

list: "users",

ususers: pageRev.user,

usprop: "editcount|groups|implicitgroups",

format: "json"

});

userQuery = userQuery.query.users[0];

let created = 'Created ' + new Date(pageRev.timestamp).toUTCString().slice(5, 16) + ', by ';

created += '' + pageRev.user + '';

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 += ")";

}

$('#t-created span').append(created);

$('#t-created')[0].style = "";

}

async function getAssessment(articleId) {

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"]

};

if (mw.config.get("wgServerName") == "en.wikipedia.org" && mw.config.get("wgCanonicalNamespace") == "") {

pageQuery = await aiApiGet({

action: "query",

prop: "pageassessments",

pageids: articleId,

palimit: "1",

format: "json"

});

let assessment = pageQuery.query.pages[articleId].pageassessments;

if (assessment != null) {

mw.util.addPortletLink('p-pbar', , , 't-pasmt',, , '#t-revs');

$('#t-pasmt a')[0].remove();

$('#t-pasmt').append(createImg(assessments[Object.entries(assessment)[0][1].class]));

}

}

}

async function getPageviews(articleId) {

let pageQuery = await aiApiGet({

action: "query",

prop: "pageviews",

pageids: articleId,

pvipdays: "30",

format: "json"

});

let rawViews = Object.entries(pageQuery.query.pages[articleId].pageviews);

let totalViews = 0;

for (let i = 0; i < rawViews.length; i++) {

if (typeof rawViews[i][1] == "number") {

totalViews += rawViews[i][1];

}

}

$('#t-views span').append(addCommas(totalViews) + ' Pageviews');

$('#t-views')[0].style = "";

}

async function getPageCounts() {

let fetchTarget = "https://" + mw.config.get("wgServerName") + "/w/rest.php/v1/page/" + encodeURIComponent(mw.config.get("wgRelevantPageName")) + "/history/counts/";

let counts = "edits", "Revision", "revs"], ["editors", "Editor", "editors";

for (let j = 0; j < counts.length; j++) {

let fetchResult = await fetch(fetchTarget + counts[j][0] + "?");

fetchResult = await fetchResult.json();

fetchResult = addCommas(fetchResult.count) + " " + counts[j][1];

fetchResult = fetchResult.replace(/(?<=^30),000/, "k+").replace(/(?!^1 \w+)$/, "s");

$('#t-' + counts[j][2] + ' span').append(fetchResult);

$('#t-' + counts[j][2])[0].style = "";

}

}

function aiApiGet(params) {

return new Promise(function(resolve) {

new mw.Api().get(params)

.done(function (data) {resolve(data);})

.fail(function (data) {console.error(data);});

});

}

function addCommas(number) {

if (typeof(number) == "number") {

return number.toLocaleString('en-US');

}

return number;

}

function createImg(data) {

if (data.length === 1) {

data[1] = "en";

} else if (data[1] === "c") {

data[1] = "commons";

}

let imageStr = '

imageStr += '.svg.png" decoding="async" width="18" height="18">';

return imageStr;

}

//Category:Wikipedia scripts