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) ;

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.wikipedia.org/wiki/User:Fran Rogers/dimorphism.js
// and on http://en.wikipedia.org/wiki/User:Splarka/sysopdectector.js
// source: https://en.wikipedia.org/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&amp;page=" + mw.util.rawurlencode(mw.config.get("wgFormattedNamespaces")[2] + ":" + user.name) + "&amp;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> */