User:Equazcion/userinfo.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:Equazcion/userinfo. |
// Modified version of User:PleaseStand/userinfo.js
// ...which in turn is based on User:Fran Rogers/dimorphism.js
// ...and User:Splarka/sysopdectector.js.
/*global window, wgNamespaceNumber, wgTitle, wgFormattedNamespaces
wgScriptPath, addOnloadHook, importScriptURI, sajax_init_object*/
// for non-Firefox browsers
if(!Array.prototype.map) {
Array.prototype.map = function(fun /*, thisp*/) {
var len = this.length >>> 0;
if (typeof fun != "function") {
throw new TypeError();
}
var res = new Array(len);
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in this) {
res[i] = fun.call(thisp, this[i], i, this);
}
}
return res;
};
}
function UserinfoJsParseDate(utcDate) {
// The ISO 8601 date format used by MediaWiki
var s = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z$/.exec(utcDate);
if(s === null) {
return null;
}
var d = new Date();
d.setUTCFullYear(s[1], s[2] - 1, s[3]);
d.setUTCHours(s[4], s[5], s[6]);
return d;
}
function UserinfoJsValidateIp(ip) {
var ipSplit = ip.split(".");
if(ipSplit.length != 4) {
return false;
}
if(ipSplit.map(function(s){return parseInt(s,10);}).join(".") != ip) {
return false;
}
return true;
}
function UserinfoJsFormatQty(qty, singular, plural) {
return qty + "\u00a0" + (qty == 1 ? singular : plural);
}
// If on a user or user talk page, and not a subpage...
if((mw.config.get('wgNamespaceNumber') == 2 || mw.config.get('wgNamespaceNumber') == 3) && !(/\//.test(mw.config.get('wgTitle')))) {
// add a hook to...
$(function(){
if(typeof sajax_init_object === 'undefined') return;
// Request the user's information from the API.
// Note that this is allowed to be up to 5 minutes old.
var x = sajax_init_object();
x.open("GET", mw.config.get('wgScriptPath') +
"/api.php?format=json&maxage=300&action=query&list=users&ususers=" +
encodeURIComponent(mw.config.get('wgTitle')) +
"&usprop=blockinfo|groups|editcount|registration|gender", true);
x.onreadystatechange = function() {
if(x.readyState != 4) {
return;
}
// When response arrives extract the information we need.
var user = eval("(" + x.responseText + ")").query.users[0];
var invalid = typeof user.invalid != "undefined";
var missing = typeof user.missing != "undefined";
var groups = (typeof user.groups == "object") ? user.groups : [];
var editcount = (typeof user.editcount == "number") ? user.editcount : null;
var registration = (typeof user.registration == "string") ?
UserinfoJsParseDate(user.registration) : null;
var blocked = typeof user.blockedby != "undefined";
var gender = (typeof user.gender == "string") ? user.gender : null;
// Format the information for on-screen display
// Gender
var genderSymbol;
switch(gender) {
case "male": genderSymbol = "\u2642"; break;
case "female": genderSymbol = "\u2640"; break;
default: genderSymbol = ""; break;
}
var statusText = "";
// Registration date
if(registration) {
// The code below requires the computer's clock to be set correctly.
var age = new Date().getTime() - registration.getTime();
var ageNumber, ageRemainder, ageWords;
if(age < 60000) {
// less than one minute old
ageNumber = Math.floor(age / 1000);
ageWords = UserinfoJsFormatQty(ageNumber, "second", "seconds");
} else if(age < 3600000) {
// less than one hour old
ageNumber = Math.floor(age / 60000);
ageWords = UserinfoJsFormatQty(ageNumber, "minute", "minutes");
} else if(age < 86400000) {
// less than one day old
ageNumber = Math.floor(age / 3600000);
ageWords = UserinfoJsFormatQty(ageNumber, "hour", "hours");
ageRemainder = Math.floor((age - ageNumber * 3600000) / 60000);
} else if(age < 604800000) {
// less than one week old
ageNumber = Math.floor(age / 86400000);
ageWords = UserinfoJsFormatQty(ageNumber, "day", "days");
} else if(age < 2592000000) {
// less than one month old
ageNumber = Math.floor(age / 604800000);
ageWords = UserinfoJsFormatQty(ageNumber, "week", "weeks");
} else if(age < 31536000000) {
// less than one year old
ageNumber = Math.floor(age / 2592000000);
ageWords = UserinfoJsFormatQty(ageNumber, "month", "months");
} else {
// one year or older
ageNumber = Math.floor(age / 31536000000);
ageWords = UserinfoJsFormatQty(ageNumber, "year", "years");
ageRemainder =
Math.floor((age - ageNumber * 31536000000) / 2592000000);
if(ageRemainder) {
ageWords += " " +
UserinfoJsFormatQty(ageRemainder, "month", "months");
}
}
statusText += "" + ageWords + " old";
}
// Edit count
if(editcount !== null) {
statusText += ", with " +
"<a href=\"https://tools.wmflabs.org/xtools/pcount/index.php?name=" +
encodeURIComponent(user.name) +
"&lang=en&wiki=wikipedia\">" +
UserinfoJsFormatQty(editcount, "edit", "edits") + "</a>";
}
// Now show the information at the top of the page
var fh = window.document.getElementById("firstHeading");
fh.appendChild(window.document.createTextNode(genderSymbol));
var stDiv = window.document.createElement("div");
// Non-standard? Yes, but it gets the job done.
stDiv.innerHTML = statusText;
fh.parentNode.insertBefore(stDiv, fh.nextSibling);
};
x.send(null);
});
}