User:Ricordisamoa/UserInfo.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* <nowiki>
 * UserInfo.js
 * inspired from [[:en:User:PleaseStand/User info]] by PleaseStand (taken very few pieces of code, Thanks!)
 * @author [[User:Ricordisamoa]]
*/
/* global $, mw */
/* jshint devel: true */
$( document ).ready( function () {
	'use strict';
	if (
		[ 2, 3 ].indexOf( mw.config.get( 'wgNamespaceNumber' ) ) === -1 ||
		/\//.test( mw.config.get( 'wgTitle' ) )
	) {
		return;
	}
	mw.loader.using( [ 'mediawiki.api', 'mediawiki.language' ], function () {
		var user = mw.config.get( 'wgTitle' ).split( '/' )[ 0 ],
		siteData = mw.config.get( 'wgServer' ).replace( /^\/\/(.+)$/, '$1' ).split( '.' ).slice( -3, 2 ),
		api = new mw.Api();
		api.post( {
			action: 'query',
			meta: 'allmessages',
			amlang: mw.config.get( 'wgUserLanguage' ),
			ammessages: [
				'ago',
				'and',
				'comma-separator',
				'word-separator',
				'just-now',
				'usereditcount',
				'seconds',
				'minutes',
				'hours',
				'days',
				'weeks',
				'months',
				'years'
			].concat(
				$.map( [
					'API_High_Limit_Requestor',
					'Ex_Administrator',
					'Ex_Bureaucrat',
					'Global_bot',
					'Global_rollback',
					'Global_sysops',
					'Image-reviewer',
					'Indic_Bots',
					'New_wikis_importer',
					'OTRS',
					'OTRS-member',
					'Ombudsmen',
					'Staff',
					'abusefilter',
					'accountcreator',
					'arbcom',
					'autoconfirmed',
					'autopatrolled',
					'autoreview',
					'autoreviewer',
					'bigexport',
					'bot',
					'botadmin',
					'bureaucrat',
					'centralnoticeadmin',
					'checkuser',
					'coder',
					'confirmed',
					'editinterface',
					'editor',
					'editprotected',
					'eliminator',
					'epcampus',
					'epcoordinator',
					'epinstructor',
					'eponline',
					'filemover',
					'flood',
					'founder',
					'global-ipblock-exempt',
					'import',
					'inactive',
					'interface_editor',
					'ipblock-exempt',
					'oversight',
					'patroller',
					'recursive-export',
					'researcher',
					'reviewer',
					'rollbacker',
					'steward',
					'suppress',
					'svnadmins',
					'sysadmin',
					'sysop',
					'test-sysop',
					'translate-proofr',
					'translationadmin',
					'transwiki',
					'trusted',
					'upwizcampeditors',
					'user'
				],
				function ( e ) {
					return 'group-' + e + '-member';
				} )
			).join( '|' )
		} )
		.done( function ( result ) {
			var dateDiff;
			$.each( result.query.allmessages, function () {
				if ( this[ '*' ] ) {
					mw.messages.set( this.name, this[ '*' ] );
				}
			} );
			dateDiff = function ( date, precision, ago ) {// state-of-the-art function for date differences!
				var labels = [
					'years',
					'months',
					'weeks',
					'days',
					'hours',
					'minutes',
					'seconds'
				],
				mult = [ 12, 4.34, 7, 24, 60, 60, 1000 ],
				diff = new Date() - date,
				message = [];
				$.each( mult, function ( i ) {
					if ( i <= precision || message.length === 0 ) {
						var f = parseInt( mult.slice( i ).reduce( function ( a, b ) {
							return a * b;
						} ) ),
						fl = Math.floor( diff / f );
						if ( fl > 0 ) {
							message.push( mw.message( labels[ i ], fl ).text() );
							diff -= fl * f;
						}
					}
				} );
				if ( message.length > 0 ) {
					message = mw.language.listToText( message );
					if ( ago === true ) {
						message = mw.message( 'ago', message ).text();
					}
				} else {
					message = mw.message( 'just-now' ).text();
				}
				return message;
			};
			api.get( {
				action: 'query',
				list: 'users|usercontribs',
				maxage: 300,
				usprop: 'blockinfo|editcount|gender|registration|groups',
				ususers: user,
				ucuser: user,
				ucprop: 'timestamp',
				uclimit: 1
			} )
			.done( function ( data ) {
				var query = data.query,
				user = query.users[ 0 ],
				userDesc;
				if ( user.missing !== undefined || user.invalid !== undefined ) {
					// invalid/anonymous user
					if ( mw.util.isIPv4Address( user.name ) ) {
						userDesc = 'anonymous IPv4 user';
					} else if ( mw.util.isIPv6Address( user.name ) ) {
						userDesc = 'anonymous IPv6 user';
					} else {
						userDesc = 'unspecified user';
					}
					userDesc = 'A' + ( /^[aeio]/i.test( userDesc ) ? 'n' : '' ) + ' ' + userDesc;
				} else {
					var gender = user.gender !== undefined ? user.gender : '',
					groups = $.map(
						$( user.groups ).not( [ '*', 'user', 'autoconfirmed' ] ),
						function ( e ) {
							var msgKey = 'group-' + e + '-member';
							return mw.messages.exists( msgKey ) ? mw.message( msgKey, gender ).text() : e;
						}
					);
					userDesc = groups.length > 0 ? mw.language.listToText( groups ) : ( user.blockedby !== undefined ? 'user' : 'registered user' );
					if ( user.blockedby !== undefined ) {
						userDesc = $( '<span>' ).append( 'A ' )
						.append(
							$( '<a>' )
							.text( 'blocked' )
							.attr( 'href', mw.util.getUrl( 'Special:Log', { type: 'block', page: user.name } ) )
						).append( ' ' + userDesc );
					} else {
						userDesc = 'A' + ( /^[aeio]/i.test( userDesc ) ? 'n' : '' ) + ' ' + userDesc;
					}
					var regDate = new Date( user.registration );
					if ( user.registration === null ) {
						console.warn( 'UserInfo.js: cannot determine user\'s registration timestamp' );
					}
					var lastContribDate = query.usercontribs.length > 0 ? new Date( query.usercontribs[ 0 ].timestamp ) : null;
					if ( gender && gender !== '' ) {
						$( '<span>' )
						.text( gender === 'male' ? '\u2642' : ( gender === 'female' ? '\u2640' : '' ) )
						.css( {
							paddingLeft: '0.25em',
							fontFamily: '"Lucida Grande","Lucida Sans Unicode",sans-serif',
							fontSize: '1em'
						} )
						.appendTo( '#firstHeading' );
					}
					var userActiveKeys = {
						inactive: [ 'c73535', 'c33003' ],
						uncertain: [ '949494', '7e7e7e' ],
						active: [ '6bc431', '1fbf00' ]
					},
					userActiveKey = 'inactive';
					if ( lastContribDate !== null && user.blockedby === undefined ) {
						if ( new Date() - lastContribDate < 120000 ) {
							userActiveKey = 'active';
						} else if ( new Date() - lastContribDate < 3600000 ) {
							userActiveKey = 'uncertain';
						}
					}
					var userActiveColors = userActiveKeys[ userActiveKey ],
					userActiveGradient = 'radial-gradient(center,ellipse cover,#' + userActiveColors.join( ',#' ) + ')',
					isBot = user.groups.indexOf( 'bot' ) !== -1,
					userActiveMessage = 'this ' + ( isBot ? 'bot' : 'user' ) + ' is ';
					if ( user.blockedby !== undefined ) {
						userActiveMessage += 'blocked';
					} else if ( userActiveKey === 'uncertain' ) {
						userActiveMessage += 'probably inactive';
					} else if ( isBot && userActiveKey === 'active' ) {
						userActiveMessage += 'running';
					} else {
						userActiveMessage += userActiveKey;
					}
					userActiveMessage += ' at the moment';
					$( '<span>' )
					.attr( 'title', userActiveMessage )
					.css( {
						borderRadius: '100%',
						height: '.8em',
						width: '.8em',
						marginRight: '.3em',
						display: 'inline-block',
						lineHeight: 0,
						background: '#' + userActiveColors[ 0 ]
					} )
					.css( 'background', '-webkit-' + userActiveGradient )
					.css( 'background', '-moz-' + userActiveGradient )
					.css( 'background', '-ms-' + userActiveGradient )
					.css( 'background', '-o-' + userActiveGradient )
					.css( 'background', userActiveGradient )
					.prependTo( '#firstHeading' );
					userDesc = $( '<span>' ).append( userDesc )
					.append( ', ' + ( user.registration !== null ? dateDiff( regDate, 2 ) + ' old, ' : '' ) + 'with ' )
					.append(
						$( '<a>' )
						.text(
							mw.message( 'usereditcount', user.editcount ).text()
						)
						.attr( 'href', '//tools.wmflabs.org/xtools/pcount/?' +
							$.param( {
								name: user.name,
								lang: siteData[ 0 ],
								wiki: siteData[ 1 ]
							} )
						)
					)
					.append(
						lastContribDate !== null ? [
							'. Last edited ',
							$( '<a>' )
							.text( dateDiff( lastContribDate, 2, true ) )
							.attr( 'href', mw.util.getUrl( 'Special:Contributions/' + user.name ) )
						] : ''
					);
				}
				$( '#siteSub' ).show().prepend( '. ' ).prepend( userDesc );
			} );
		} );
	} );
} );