MediaWiki:Gadget-userProfile.js

From Support Wiki
Jump to navigation Jump to search

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.
// User profile
// mw.loader.load( 'https://meta.wikimedia.org/w/index.php?title=User:MarkusRost/profile.js&action=raw&ctype=text/javascript' );
// <nowiki>
mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ] ).done( function() {
	var config = mw.config.get( [
		'wgRelevantUserName',
		'wgNamespaceNumber',
		'wgUserLanguage',
		'wgArticleId',
		'wgAction',
		'wgTitle'
	] );
	var username = config.wgRelevantUserName;
	if ( !username || window.loadedHorseUserProfile ) return;
	window.loadedHorseUserProfile = true;
	if ( config.wgNamespaceNumber !== -1 && config.wgTitle.includes('/') ) return;
	
	var lang = mw.language.bcp47(config.wgUserLanguage);
	var dateOptions = {
		year: "numeric",
		month: "short",
		day: "numeric",
		hour: "2-digit",
		minute: "2-digit",
		timeZone: "UTC",
		timeZoneName: "short"
	};
	var api = new mw.Api();
	if ( mw.util.isIPAddress(username) ) api.get( {
		action: 'query',
		list: ['usercontribs', 'blocks'],
		ucuser: username,
		ucprop: [],
		uclimit: 'max',
		bkip: username,
		bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
		bklimit: 1,
		formatversion: 2
	} ).done( function(data) {
		var editcount = data.query.usercontribs.length;
		if ( data.continue && data.continue.uccontinue ) editcount = data.limits.usercontribs+'+';
		var user = {
			groups: ['*'],
			editcount: editcount
		};
		formatProfile(user, data.query.blocks[0]);
	} );
	else api.get( {
		action: 'query',
		list: ['users', 'blocks'],
		ususers: username,
		usprop: ['groups', 'editcount', 'registration', 'emailable'],
		bkusers: username,
		bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
		bklimit: 1,
		formatversion: 2
	} ).done( function(data) {
		formatProfile(data.query.users[0], data.query.blocks[0]);
	} );
	
	if ( window.loadedHorseUserProfileContribs ) return;
	window.loadedHorseUserProfileContribs = true;
	if ( config.wgNamespaceNumber === 2 && !config.wgArticleId && config.wgAction === 'view' ) {
		mw.loader.using( [ 'mediawiki.pager.styles', 'mediawiki.special.changeslist' ] ).then( function() {
			var text = '== [[Special:Contributions/' + username + '|{{int:contributions-title|' + username + '}}]] ==\n{{Special:Contributions/' + username + '|limit=20}}';
			new mw.Api().parse( text, {
				title: 'User:' + config.wgTitle,
				wrapoutputclass: 'horse-userprofile-contribs',
				disableeditsection: true,
				disablelimitreport: true,
				uselang: config.wgUserLanguage
			} ).done( function(parsedText) {
				mw.hook( 'wikipage.content' ).fire(
					$( parsedText ).appendTo('#mw-content-text')
				);
			} );
		} );
	}
	
	function formatProfile(user, block) {
		user.groups.splice(user.groups.indexOf('*'), 1);
		var text = '<div class="horse-userprofile-info">';
		if ( user.groups.length ) {
			var groupList = user.groups.map( function(group) {
				var grouppage = '{{MediaWiki:grouppage-'+group+'}}';
				return [
					'{{#ifexist: '+grouppage+' | [['+grouppage+'|{{int:group-'+group+'}}]] | {{int:group-'+group+'}} }}',
					'{{#ifexist: '+grouppage+' | [['+grouppage+'|{{int:group-'+group+'-member|'+username+'}}]] | {{int:group-'+group+'-member|'+username+'}} }}'
				];
			} ).reduce( function(prev, cur) {
				prev[0].push(cur[0]);
				prev[1].push(cur[1]);
				return prev;
			}, [[], []] );
			text += '\n\n<span>{{int:prefs-memberingroups|'+user.groups.length+'|'+username+'}}</span>\t<span>{{int:prefs-memberingroups-type|'+mw.language.listToText(groupList[0])+'|'+mw.language.listToText(groupList[1])+'}}</span>';
		}
		text += '\n\n<span>{{int:prefs-edits}}</span>\t<span>[[Special:Contribs/'+username+'|'+mw.language.convertNumber(user.editcount)+']]</span>';
		if ( user.registration ) {
			text += '\n\n<span>{{int:prefs-registration}}</span>\t<span>'+mw.language.convertNumber(new Date(user.registration).toLocaleString(lang, dateOptions))+'</span>';
			if ( !user.emailable ) text += '\n\n<span>{{int:nowikiemailtext|'+username+'}}</span>';
		}
		text += '\n\n</div>';
		if ( block && !$('.mw-warning-with-logexcerpt .mw-logevent-loglines > .mw-logline-block').length ) {
			var notice = 'sp-contributions-blocked-notice';
			if ( mw.util.isIPAddress(block.user, true) ) notice += '-anon';
			var logentry = 'logentry-block-block';
			var partialBlock = [];
			if ( block.partial ) {
				notice += '-partial';
				logentry = 'logentry-partialblock-block';
				if ( block.restrictions.pages ) {
					var blockpages = block.restrictions.pages.map( function(page) {
						return '[['+page.title+']]';
					} );
					partialBlock.push('{{int:logentry-partialblock-block-page|'+blockpages.length+'|'+mw.language.listToText(blockpages)+'}}');
				}
				if ( block.restrictions.namespaces ) {
					var blocknamespaces = block.restrictions.namespaces.map( function(namespace) {
						if ( !namespace ) return '[[Special:AllPages|{{int:blanknamespace}}]]';
						return '[[Special:AllPages/{{ns:'+namespace+'}}:|{{ns:'+namespace+'}}]]';
					} );
					partialBlock.push('{{int:logentry-partialblock-block-ns|'+blocknamespaces.length+'|'+mw.language.listToText(blocknamespaces)+'}}');
				}
				if ( block.restrictions.actions ) {
					var blockactions = block.restrictions.actions.map( function(action) {
						return '{{int:ipb-action-'+action+'}}';
					} );
					partialBlock.push('{{int:logentry-partialblock-block-action|'+blockactions.length+'|'+mw.language.listToText(blockactions)+'}}');
				}
				if ( !partialBlock.length ) logentry = 'logentry-non-editing-block-block';
			}
			var blockDate = new Date(block.timestamp);
			var blockexpiry = '{{int:infiniteblock}}';
			if ( !['infinite', 'indefinite', 'infinity', 'never'].includes(block.expiry) ) {
				var expiry = new Date(block.expiry.replace( /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2,3})/, '$1-$2-$3T$4:$5:$6Z' ));
				var duration = expiry - blockDate;
				var blockDuration = [];
				var factor = 1000;
				if ( duration % factor === 0 ) blockDuration = ['duration-seconds', Math.floor(duration / factor)];
				factor *= 60;
				if ( duration % factor === 0 ) blockDuration = ['duration-minutes', Math.floor(duration / factor)];
				factor *= 60;
				if ( duration % factor === 0 ) blockDuration = ['duration-hours', Math.floor(duration / factor)];
				factor *= 24;
				if ( duration % factor === 0 ) blockDuration = ['duration-days', Math.floor(duration / factor)];
				if ( duration % (factor*7) === 0 ) blockDuration = ['duration-weeks', Math.floor(duration / (factor*7))];
				if ( duration % (factor*30) === 0 ) blockDuration = ['months', Math.floor(duration / (factor*30))];
				factor *= 365;
				if ( duration % factor === 0 ) blockDuration = ['duration-years', Math.floor(duration / factor)];
				if ( duration % (factor*10) === 0 ) blockDuration = ['duration-decades', Math.floor(duration / (factor*10))];
				if ( duration % (factor*100) === 0 ) blockDuration = ['duration-centuries', Math.floor(duration / (factor*100))];
				if ( duration % (factor*1000) === 0 ) blockDuration = ['duration-millennia', Math.floor(duration / (factor*1000))];
				if ( blockDuration.length < 2 || blockDuration[1] > 1000 ) blockexpiry = mw.language.convertNumber(expiry.toLocaleString(lang, dateOptions));
				else blockexpiry = '{{int:'+blockDuration.join('|')+'}}';
			}
			var blockflags = '';
			var blockflaglist = [];
			if ( block.anononly ) blockflaglist.push('{{int:block-log-flags-anononly}}');
			if ( block.nocreate ) blockflaglist.push('{{int:block-log-flags-nocreate}}');
			if ( !block.autoblock && !mw.util.isIPAddress(block.user, true) ) blockflaglist.push('{{int:block-log-flags-noautoblock}}');
			if ( !block.allowusertalk ) blockflaglist.push('{{int:block-log-flags-nousertalk}}');
			if ( block.noemail ) blockflaglist.push('{{int:block-log-flags-noemail}}');
			if ( block.hidden ) blockflaglist.push('{{int:block-log-flags-hiddenname}}');
			if ( blockflaglist.length ) blockflags = '{{int:parentheses|'+blockflaglist.join(mw.msg('comma-separator'))+'}}';
			var blockreason = ' <span class="comment">{{int:parentheses|'+block.reason+'}}</span>';
			if ( !block.reason ) blockreason = '';
			text += '<div class="horse-userprofile-block mw-warning-with-logexcerpt"><div>\n{{int:'+notice+'|'+username+'}}\n';
			text += '<ul class="mw-logevent-loglines"><li class="mw-logline-block">'+mw.language.convertNumber(blockDate.toLocaleString(lang, dateOptions))+' {{int:'+logentry+'|[[User:'+block.by+'|'+block.by+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.by+'|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/'+block.by+'|{{int:contribslink}}]]</span></span>|'+block.by;
			if ( mw.util.isIPAddress(block.user, true) ) text += '|[[Special:Contribs/'+block.user+'|'+block.user+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.user+'|{{int:talkpagelinktext}}]]</span></span>';
			else text += '|[[User:'+block.user+'|'+block.user+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.user+'|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/'+block.user+'|{{int:contribslink}}]]</span></span>';
			text += '|'+block.user+'|'+blockexpiry+'|'+blockflags+'|'+mw.language.listToText(partialBlock)+'}}'+blockreason+'</li></ul></div></div>';
		}
		api.parse( text, {
			disablelimitreport: true,
			wrapoutputclass: 'horse-userprofile mw-message-box mw-content-'+($('#contentSub').attr('dir')||'ltr'),
			uselang: config.wgUserLanguage
		} ).done( function(parsedText) {
			parsedText = parsedText.replace( /\u29FCgroup-([^\u29FC\u29FD]+?)(?:-member)?\u29FD/g, '$1' );
			mw.hook( 'wikipage.content' ).fire(
				$( parsedText ).appendTo('#contentSub')
			);
		} );
	}
} );
// </nowiki>