MediaWiki:Gadget-GlobalRenameQueueCheckAntiSpoof.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.
/**
 * Author : rxy (https://rxy.jp)
 * Copyright (c) rxy 2018
 * License: MIT
 * License descrition: https://opensource.org/licenses/MIT
 */

( function ( mw, $ ) {
	'use strict';

	console.log( '[rxy_antispoof]: loaded 201908070601xx' );

	if(
		mw.config.get( 'wgCanonicalSpecialPageName' ) == 'GlobalRenameQueue' &&
		$( '#mw-renamequeue-approve' ).length
	){
		mw.loader.using( [ 'mediawiki.api', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows' ], function(){
			var $approveButton = $( 'button[name="approve"]' )[0];
			$( "#mw-renamequeue-approve" ).off("click");
	
			$approveButton.disabled = true;
			$( $approveButton ).parent().addClass( 'oo-ui-widget-disabled' ).removeClass( 'oo-ui-widget-enabled' );
	
			var targetName = $( $( '#mw-globalrenamequeue-request label > ul > li' )[2] ).children( 'a:first' ).text();
			// var encodedTargetName = mw.util.rawurlencode(getName);
	
			var api = new mw.Api();
			// https://meta.wikimedia.org/w/api.php?action=antispoof&format=json&username=Rxy
			api.get(
				{
				    action: 'antispoof',
				    username: targetName
				}
			).done( function( data ){
				console.log( '[rxy_antispoof]: ', data.antispoof.result );
				$.when( mw.loader.using( [ 'mediawiki.api', 'mediawiki.jqueryMsg' ] ), $.ready )
			    // Then: Load the messages that you need (if they are not yet loaded)
			    .then( function() {
			        return new mw.Api().loadMessagesIfMissing( [
			        	'Gadget-GlobalRenameQueueCheckAntiSpoof-enableApproveButton',
			        	'Gadget-GlobalRenameQueueCheckAntiSpoof-confirm'
			        ] );
			    } )
			    // Then: Do stuff with them
			    .then( function(){
					var enableButton = new OO.ui.ButtonWidget( {
						id: 'EXT_rxy_antispoof_enableApproveButton',
						label: mw.message( 'Gadget-GlobalRenameQueueCheckAntiSpoof-enableApproveButton' ).escaped(),
						flags: [
							'primary',
							'progressive'
						]
					} );
					var detailURI = new mw.Uri();
					detailURI.path = '/w/api.php';
					detailURI.extend( { action: 'antispoof', format: 'json', username: targetName } );
					var $apiLink = $(
						'<a>',
						{
							id: 'EXT_rxy_antispoof_detailLink',
							href: detailURI.toString(),
							text: '(API)',
							target: '_blank'
						}
					);
	
					$( 'body' ).on(
						'click',
						'#EXT_rxy_antispoof_enableApproveButton',
						function (){
							OO.ui.confirm(
								mw.message( 'Gadget-GlobalRenameQueueCheckAntiSpoof-confirm' ).escaped(),
								{ size: 'large'	}
							).done( function ( yes ) {
								var leaveByDialogCancel = typeof Gadget_GlobalRenameQueueCheckAntiSpoof_leaveByDialogCancel !== 'undefined' ? Gadget_GlobalRenameQueueCheckAntiSpoof_leaveByDialogCancel : false;
								console.log( '[rxy_antispoof]: leaveByDialogCancel: ' + leaveByDialogCancel );
							    if ( yes ) {
							        enableApproveButton( $( 'button[name="approve"]' )[0] );
							        $( '#EXT_rxy_antispoof_enableApproveButton' ).remove();
							    } else if ( leaveByDialogCancel ){
									window.location = '/wiki/Special:GlobalRenameQueue/open';
								}
							});
						}
					);
	
					if( typeof data.antispoof !== 'undefined' ){
						if( data.antispoof.result == 'error' ){
						    $( '#mw-globalrenamequeue-request' ).prepend(
						    	$(
						    		'<div>',
						    		{
						    			id: 'EXT_rxy_antispoof_error',
						    			class: 'mw-message-box mw-message-box-error',
						    			text: '[AntiSpoof] ' + data.antispoof.error
						    		}
								).append( $apiLink ).append( enableButton.$element )
						    );
						} else if ( data.antispoof.result == 'conflict' ){
							var conflictDivClass = 'mw-message-box mw-message-box-error';
							var conflictTextSuffix = '.';
							var requesterUsername = $(
								$( '#mw-globalrenamequeue-request label > ul > li' )[0]
							).children( 'a:first' ).text();
							if (
								data.antispoof.users.length === 1 
								&& data.antispoof.users[0] === requesterUsername
							) {
								conflictDivClass = 'mw-message-box mw-message-box-warning';
								conflictTextSuffix = ", but same with requester's username.";
								enableApproveButton( $approveButton );
								enableButton.$element = null;
							}
						    $( '#mw-globalrenamequeue-request' ).prepend(
						    	$(
						    		'<div>',
						    		{
						    			id: 'EXT_rxy_antispoof_conflict',
						    			class: conflictDivClass,
						    			text: '[AntiSpoof] Result is conflict' + conflictTextSuffix
						    		}
								).append( $apiLink ).append( enableButton.$element )
							);
						} else {
							enableApproveButton( $approveButton );
						}
					}
				});
			});
	
			function enableApproveButton( $approveButton ){
				$( "#mw-renamequeue-approve" ).on(
					"click",
					function(){ return confirm( mw.msg( 'centralauth-rename-confirm' ) ) }
				);
				$approveButton.disabled = false;
				$( $approveButton ).parent().addClass( 'oo-ui-widget-enabled' ).removeClass( 'oo-ui-widget-disabled' );
			}
		});
	}
}( mediaWiki, jQuery ) );