MediaWiki:Gadget-Adiutor-UPW.js
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;
Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5./*
* Adiutor: Adiutor enables versatile editing options and modules to assist a variety of user actions to enhance the Wikipedia editing experience.
* Author: Vikipolimer
* Learn more at: https://meta.wikimedia.org/wiki/Adiutor
* Licensing and Attribution: Licensed under Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
* Module: User page widget
*/
/* <nowiki> */
// Get essential configuration from MediaWiki
var mwConfig = mw.config.get(["skin", "wgAction", "wgArticleId", "wgPageName", "wgNamespaceNumber", "wgTitle", "wgUserGroups", "wgUserName", "wgUserEditCount", "wgUserRegistration", "wgCanonicalNamespace"]);
var api = new mw.Api();
var wikiId = mw.config.get('wgWikiID');
var adiutorUserOptions = JSON.parse(mw.user.options.get('userjs-adiutor-'+wikiId));
// based on http://en.wiki.x.io/wiki/User:Fran Rogers/dimorphism.js
// and on http://en.wiki.x.io/wiki/User:Splarka/sysopdectector.js
// source: https://en.wiki.x.io/wiki/User:PleaseStand/userinfo.js
if((mw.config.get("wgNamespaceNumber") === 2 || mw.config.get("wgNamespaceNumber") === 3) && !(/\//.test(mw.config.get("wgTitle")))) {
mw.loader.using(['mediawiki.util'], function() {
$(function() {
mw.loader.load( mw.util.getUrl( 'MediaWiki:Gadget-Adiutor-UPW.css', { action:'raw' } ) + '&ctype=text/css' , 'text/css' );
var encodedTitle = mw.util.rawurlencode(mw.config.get("wgTitle"));
$.getJSON(mw.config.get("wgScriptPath") + "/api.php?format=json&action=query&list=blocks|users|usercontribs&usprop=blockinfo|editcount|gender|registration|groups&uclimit=1&ucprop=timestamp&ususers=" + encodedTitle + "&ucuser=" + encodedTitle + "&bkusers" + encodedTitle + "&meta=allmessages&amfilter=grouppage").done(function(queryResult) {
if(!queryResult.query) {
return;
}
var user, invalidUser, missingUser, userGroups, groupPages = {},
editCount, registrationDate, isBlocked, isPartialBlocked, gender, lastEditedDate;
try {
user = queryResult.query.users[0];
invalidUser = typeof user.invalid !== "undefined";
missingUser = typeof user.missing !== "undefined";
userGroups = Array.isArray(user.groups) ? user.groups : [];
editCount = typeof user.editcount === "number" ? user.editcount : null;
registrationDate = typeof user.registration === "string" ? new Date(user.registration) : null;
isBlocked = typeof user.blockedby !== "undefined";
isPartialBlocked = typeof user.blockpartial !== "undefined";
gender = typeof user.gender === "string" ? user.gender : null;
if(typeof queryResult.query.usercontribs[0] === "object" && typeof queryResult.query.usercontribs[0].timestamp === "string") {
lastEditedDate = new Date(queryResult.query.usercontribs[0].timestamp);
}
for(var i = 0; i < queryResult.query.allmessages.length; i++) {
groupPages[queryResult.query.allmessages[i].name.replace("grouppage-", "")] = queryResult.query.allmessages[i]["*"].replace("{{ns:project}}:", "Wikipédia:");
}
} catch(e) {
return;
}
var statusText = "";
var isIpUser = false;
var isIPv4User = false;
var isIPv6User = false;
// User status
if(isBlocked) {
if(isPartialBlocked) {
blockText = mw.msg('partially-blocked');
} else {
blockText = mw.msg('blocked');
}
if (gender === "female") {
blockText += "e";
}
statusText += "<a href=\"" + mw.config.get("wgScriptPath") + "/index.php?title=Special:Log&page=" + mw.util.rawurlencode(mw.config.get("wgFormattedNamespaces")[2] + ":" + user.name) + "&type=block\">" + blockText + "</a> ";
}
if(missingUser) {
statusText += mw.msg('username-not-registered');
} else if(invalidUser) {
isIPv4User = mw.util.isIPv4Address(user.name);
isIPv6User = mw.util.isIPv6Address(user.name);
isIpUser = isIPv4User || isIPv6User;
if(isIPv4User) {
statusText += mw.msg('anonymous-ipv4-user');
} else if(isIPv6User) {
statusText += mw.msg('anonymous-ipv6-user');
} else {
statusText += mw.msg('invalid-username');
}
} else {
var friendlyGroupNames = {};
if (gender !== "female") {
friendlyGroupNames = {
'*': false,
'user': false,
'autoconfirmed': false,
sysop: mw.msg('friendly-group-names-sysop'),
rollbacker: mw.msg('friendly-group-names-rollbacker'),
accountcreator: mw.msg('friendly-group-names-accountcreator'),
'import': mw.msg('friendly-group-names.import'),
'interface-editor': mw.msg('friendly-group-names-interface-editor'),
'interface-admin': mw.msg('friendly-group-names-interface-admin'),
patroller: mw.msg('friendly-group-names-patroller'),
autoreview: mw.msg('friendly-group-names-autoreview'),
bureaucrat: mw.msg('friendly-group-names-bureaucrat'),
transwiki: mw.msg('friendly-group-names-transwiki'),
'ipblock-exempt': mw.msg('friendly-group-names-ipblock-exempt'),
checkuser: mw.msg('friendly-group-names-checkuser'),
suppress: mw.msg('friendly-group-names-suppress'),
confirmed: mw.msg('friendly-group-names-confirmed'),
abusefilter: mw.msg('friendly-group-names-abusefilter'),
autoreviewer: mw.msg('friendly-group-names-autoreviewer'),
epcoordinator: mw.msg('friendly-group-names-epcoordinator'),
epcampus: mw.msg('friendly-group-names-epcampus'),
eponline: mw.msg('friendly-group-names-eponline'),
filemover: mw.msg('friendly-group-names-filemover'),
'massmessage-sender': mw.msg('friendly-group-names-massmessage-sender'),
templateeditor: mw.msg('friendly-group-names-templateeditor'),
autopatrolled: mw.msg('friendly-group-names-autopatrolled')
};
} else {
friendlyGroupNames = {
'*': false,
'user': false,
'autoconfirmed': false,
sysop: 'administratrice',
rollbacker: 'r\u00e9vocatrice',
accountcreator: 'cr\u00e9atrice de comptes',
'import': mw.msg('friendly-group-names.import'),
'interface-editor': mw.msg('friendly-group-names-interface-editor'),
'interface-admin': 'administratrice d\'interfaces',
patroller: mw.msg('friendly-group-names-patroller'),
autoreview: mw.msg('friendly-group-names-autoreview'),
bureaucrat: mw.msg('friendly-group-names-bureaucrat'),
transwiki: mw.msg('friendly-group-names-transwiki'),
'ipblock-exempt': 'exempt\u00e9e de blocages ip',
checkuser: 'v\u00e9rificatrices d\' IP',
suppress: 'masqueuse',
confirmed: mw.msg('friendly-group-names-confirmed'),
abusefilter: '\u00e9ditrice de filtres',
autoreviewer: mw.msg('friendly-group-names-autoreviewer'),
epcoordinator: mw.msg('friendly-group-names-epcoordinator'),
epcampus: mw.msg('friendly-group-names-epcampus'),
eponline: mw.msg('friendly-group-names-eponline'),
filemover: mw.msg('friendly-group-names-filemover'),
'massmessage-sender': mw.msg('friendly-group-names-massmessage-sender'),
templateeditor: mw.msg('friendly-group-names-templateeditor'),
autopatrolled: 'autopatrouill\u00e9e'
};
}
var friendlyGroups = [];
for(var i = 0; i < userGroups.length; i++) {
var groupName = userGroups[i];
if(groupName === "named") {
continue;
}
var groupPage = groupPages[groupName] || groupName;
if(friendlyGroupNames.hasOwnProperty(groupName)) {
if(friendlyGroupNames[groupName]) {
friendlyGroups.push("<a href='/wiki/" + mw.util.rawurlencode(groupPage) + "'>" + friendlyGroupNames[groupName] + "</a>");
}
} else {
friendlyGroups.push("<a href='/wiki/" + mw.util.rawurlencode(groupPage) + "'>" + groupName + "</a>");
}
}
switch(friendlyGroups.length) {
case 0:
if(!isBlocked) {
statusText += (gender === "female") ? "enregistrée" : "enregistré" ;
}
break;
case 1:
statusText += friendlyGroups[0];
break;
case 2:
statusText += friendlyGroups[0] + " " + mw.msg('and') + " " + friendlyGroups[1];
break;
default:
var groupList = friendlyGroups.slice(0, -1).join(", ");
statusText += groupList + ", " + mw.msg('and') + " " + friendlyGroups[friendlyGroups.length - 1];
break;
}
}
// Registration date
var firstLoggedUserDate = new Date("2005-09-07T22:16:00Z");
var texteInscrit = (gender === "female") ? 'inscrite' : 'inscrit' ;
if(registrationDate) {
var registrationLink = "";
statusText += " est " + texteInscrit + " depuis " + formatRelativeDateDifference(registrationDate) + ".";
} else {
var ecartAnnees = new Date().getFullYear() - firstLoggedUserDate.getFullYear();
statusText += " est " + texteInscrit + " depuis plus de " + ecartAnnees + " ans.";
}
statusText = (gender === "female") ? 'Cette utilisatrice ' + statusText : 'Cet utilisateur ' + statusText;
// Show the correct gender symbol
var firstHeading = document.getElementById("firstHeading") || document.getElementById("section-0");
if(!firstHeading) {
return;
}
// Add classes for blocked, registered, and anonymous users
var newClasses = [];
if(isBlocked) {
newClasses.push("ps-blocked");
}
if(isIpUser) {
newClasses.push("ps-anonymous");
} else if(invalidUser) {
newClasses.push("ps-invalid");
} else {
newClasses.push("ps-registered");
}
firstHeading.className += (firstHeading.className.length ? " " : "") + userGroups.map(function(group) {
return "ps-group-" + group;
}).concat(newClasses).join(" ");
var icone = 'userRights';
if (userGroups.includes('bot')) {
if (userGroups.includes('sysop')) {
if (userGroups.includes('bureaucrat')) {
icone = 'admin-bureaucrat-bot';
} else {
icone = 'admin-bot';
}
} else if (userGroups.includes('bureaucrat')) {
icone = 'bureaucrat-bot';
} else {
icone = 'bot';
}
} else if (userGroups.includes('steward')) {
switch (gender) {
case 'male': icone = 'steward-m'; break;
case 'female': icone = 'steward-f'; break;
default: icone = 'steward-n';
}
} else if (userGroups.includes('bureaucrat')) {
switch (gender) {
case 'male': icone = 'bureaucrat-admin-m'; break;
case 'female': icone = 'bureaucrat-admin-f'; break;
default: icone = 'bureaucrat-admin-n';
}
} else if (userGroups.includes('sysop')) {
switch (gender) {
case 'male': icone = 'admin-m'; break;
case 'female': icone = 'admin-f'; break;
default: icone = 'admin-n';
}
} else if (userGroups.includes('suppress')) {
switch (gender) {
case 'male': icone = 'suppress-m'; break;
case 'female': icone = 'suppress-f'; break;
default: icone = 'suppress-n';
}
} else {
switch (gender) {
case 'male': icone = 'register-m'; break;
case 'female': icone = 'register-f'; break;
default: icone = 'register-n';
}
}
var userPageUsernameDetails = new OO.ui.MessageWidget({
type: 'success',
icon: icone,
inline: false,
label: new OO.ui.HtmlSnippet('<strong class="username">' + user.name + '</strong><br>' + statusText),
classes: ['adiutor-user-page-username-details']
});
var lastEditedText = mw.msg('last-edited-default');
if(lastEditedDate) {
lastEditedText = mw.msg('last-edited', formatRelativeDateDifference(lastEditedDate));
}
var userPageChangeCount = new OO.ui.MessageWidget({
type: 'notice',
icon: 'edit',
inline: false,
label: new OO.ui.HtmlSnippet('<strong>' + mw.msg('has-x-edit-count', formatQuantityWithCommas(editCount)) + '</strong><br>' + lastEditedText + '.'),
classes: ['adiutor-user-page-change-count']
});
var UnBlockButton = new OO.ui.ButtonWidget({
icon: 'unBlock',
label: mw.msg('unblock-button-label'),
flags: ['destructive']
});
var BlockButton = new OO.ui.ButtonWidget({
icon: 'block',
label: mw.msg('block-button-label'),
flags: ['destructive']
});
var warnUserButton = new OO.ui.ButtonWidget({
icon: 'hand',
label: mw.msg('warn-button-label'),
});
var userContributions = new OO.ui.ButtonWidget({
icon: 'edit',
label: mw.msg('contributions-button-label'),
});
warnUserButton.on('click', function() {
loadAdiutorScript('WRN');
});
userContributions.on('click', function() {
window.location.href = '/wiki/Spécial:Contributions/' + mw.util.rawurlencode(user.name);
});
UnBlockButton.on('click', function() {
window.location.href = '/wiki/Spécial:Débloquer/' + mw.util.rawurlencode(user.name);
});
var userPageActionButtons = new OO.ui.ButtonGroupWidget({
items: [warnUserButton, userContributions],
classes: ['adiutor-user-page-button-group']
});
if(mwConfig.wgUserGroups.includes('sysop')) {
if(isBlocked) {
userPageActionButtons.addItems([UnBlockButton]);
} else {
userPageActionButtons.addItems([BlockButton]);
}
BlockButton.on('click', function() {
loadAdiutorScript('UBM');
});
}
var userPageUserDetailStack = new OO.ui.StackLayout({
items: [userPageUsernameDetails, userPageChangeCount, userPageActionButtons],
continuous: true,
classes: ['adiutor-user-page-box-container']
});
var userPanelStack;
if(isBlocked) {
if (user.blockreason) {
var params = {
action: 'parse',
text: user.blockreason,
format: 'json',
contentmodel: 'wikitext'
};
api.get(params).done(data => {
user.blockreason = data.parse.text['*'];
var match = user.blockreason.match(/<p>((.|\n)*?)<\/p>/);
if (match) { user.blockreason = match[1];}
var blockedUserSection;
var user_blocked = (gender === "female") ? "Cette utilisatrice a été bloquée par " + user.blockedby + " le " + user.blockedtimestampformatted + " pour la raison : " + user.blockreason + "." : mw.msg('user-partially-blocked', user.blockedtimestampformatted, user.blockreason, user.blockedby);
if(isPartialBlocked) {
var user_partially_blocked_title = (gender === "female") ? "Cette utilisatrice est bloquée partiellement." : mw.msg('user-partially-blocked-title');
blockedUserSection = new OO.ui.MessageWidget({
type: 'warning',
icon: 'block',
label: new OO.ui.HtmlSnippet('<strong>' + user_partially_blocked_title + '</strong><br>' + user_blocked )
});
} else {
var user_blocked_message_title = (gender === "female") ? "Cette utilisatrice est bloquée." : mw.msg('user-blocked-message-title');
blockedUserSection = new OO.ui.MessageWidget({
type: 'error',
icon: 'block',
label: new OO.ui.HtmlSnippet('<strong>' + user_blocked_message_title + '</strong><br>' + user_blocked )
});
}
userPanelStack = new OO.ui.StackLayout({
items: [userPageUserDetailStack, blockedUserSection],
continuous: true,
classes: ['adiutor-user-page-container']
});
$('.ve-init-mw-desktopArticleTarget-targetContainer').prepend(userPanelStack.$element);
});
}
} else {
userPanelStack = new OO.ui.StackLayout({
items: [userPageUserDetailStack],
continuous: true,
classes: ['adiutor-user-page-container']
});
$('.ve-init-mw-desktopArticleTarget-targetContainer').prepend(userPanelStack.$element);
}
});
});
});
}
function formatQuantityWithCommas(number) {
return String(number).replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,");
}
function formatRelativeDateDifference(oldDate) {
var currentTime = new Date().getTime();
var ageInMilliseconds = currentTime - oldDate.getTime();
var ageNumber, ageKey, ageForm;
if(ageInMilliseconds < 60000) {
ageNumber = Math.floor(ageInMilliseconds / 1000);
ageKey = 'second';
} else if(ageInMilliseconds < 3600000) {
ageNumber = Math.floor(ageInMilliseconds / 60000);
ageKey = 'minute';
} else if(ageInMilliseconds < 86400000) {
ageNumber = Math.floor(ageInMilliseconds / 3600000);
ageKey = 'hour';
} else if(ageInMilliseconds < 604800000) {
ageNumber = Math.floor(ageInMilliseconds / 86400000);
ageKey = 'day';
} else if(ageInMilliseconds < 2592000000) {
ageNumber = Math.floor(ageInMilliseconds / 604800000);
ageKey = 'week';
} else if(ageInMilliseconds < 31536000000) {
ageNumber = Math.floor(ageInMilliseconds / 2592000000);
ageKey = 'month';
} else {
ageNumber = Math.floor(ageInMilliseconds / 31536000000);
ageKey = 'year';
}
ageForm = ageNumber === 1 ? 'one' : 'other';
return mw.msg('relative-date-' + ageKey + '-' + ageForm, ageNumber);
}
function loadAdiutorScript(scriptName) {
mw.loader.load(mw.util.getUrl('MediaWiki:Gadget-Adiutor-' + scriptName + '.js', {
action: 'raw'
}) + '&ctype=text/javascript', 'text/javascript');
}
/* </nowiki> */