MediaWiki:Gadget-colored-nicknames.js

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
// UWAGA! Z tego gadżetu korzystają także inne projekty
// Author: [[pl:User:Beau]]
if ( typeof( cn$replacement ) == "undefined" ) {
	window.cn$replacement = {};
}

if ( typeof( cn$class ) == "undefined" ) {
	window.cn$class = {};
}

window.coloredNicknamesGadget = {
	cache: {},//TODO
	list: {},
	version: 11,
	userLink: /(?:Wiki(?:pedystk?a|skryba|reporter|s.+ownikar)|U.+ytkownik|U.+ytkowniczka|User)/,
	contribLink: /Specjalna:Wk/,
	api: new mw.Api(),

	init: function() {
		if ( mw.config.get( 'wgNamespaceNumber' ) > -1 && mw.config.get( 'wgAction' ) != 'history' ) {
			return;
		}

		var that = this;

		var request = {
			action: 'query',
			list: 'allusers|globalallusers',
			
			augroup: 'sysop|bot',
			agugroup: 'steward',
			
			aulimit: 'max',
			agulimit: 'max',
			
			auprop: 'groups',
			aguprop: 'groups',
			
			maxage: 43200,
			smaxage: 600,
			format: 'json'
		};
		
		this.api.get( request ).done( function( result ) {
			that.addToList( result.query.allusers, 'nick_admin', 'sysop' );
			that.addToList( result.query.allusers, 'nick_bot', 'bot' );
			that.addToList( result.query.globalallusers, 'nick_steward', 'steward' );
			
			mw.hook( 'wikipage.content' ).add( function () {that.doColor();});
		} );
	},
	
	addToList: function( data, type, group_name ) {
		if ( data.length ) {
			for ( var id in data ) {
				var nick = data[id].name;
				
				if(!data[id].groups.includes(group_name)) continue;
				
				if ( this.list[nick] ) {
					this.list[nick].push( type );
				} else {
					this.list[nick] = new Array( type );
				}
			}
		}
	},
	
	isIPv4: function( nick ) {
		return nick.match( /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ );
	},
	
	isIPv6: function( nick ) {
		// Source: http://home.deds.nl/~aeron/regex/
		return nick.match( /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i );
	},
	
	getUserClass: function( nick ) {
		if ( nick === null ) {
			return [];
		}

		var userClass = this.cache[nick];
		if ( userClass ) {
			return userClass;
		}
		userClass = [];

		var nc = cn$class[nick];
		if ( nc ) {
			userClass.push( nc );
		}

		if ( this.list[nick] ) {
			userClass = userClass.concat( this.list[nick] );
		}

		if ( this.isIPv4( nick ) ) {
			userClass.push( 'nick_ip' );
			if ( this.isDynamic( nick ) ) {
				userClass.push( 'nick_dynamic_ip' );
			}
		} else if ( this.isIPv6( nick ) ) {
			userClass.push( 'nick_ip' );
		}
		this.cache[nick] = userClass;

		return userClass;
	},
	
	isDynamic: function( ip ) {
		return false;
	},
	
	doColor: function() {
		if ( ( typeof dynamicIpsGadget ) == 'object' ) {
			this.isDynamic = function( ip ) {
				return dynamicIpsGadget.isDynamic( ip );
			};
		}

		var links = document.querySelectorAll( '.mw-body a' );

		for ( var i = 0; i < links.length; i++ ) {
			var link = links[i];
			if ( !link.href.match( this.userLink ) && !link.href.match( this.contribLink ) ) {
				continue;
			}
			var nick = jQuery( link ).text();

			var replacement = cn$replacement[nick];
			if ( replacement ) {
				link.innerHTML = replacement;
			}

			var userClass = this.getUserClass( nick );
			if ( userClass.length ) {
				link.className += ' ' + userClass.join( ' ' );
			}
		}

		this.cache = {};
	}
};

coloredNicknamesGadget.init();