_ _    _ _____  ___   __                       
 __      _(_) | _(_)___ / ( _ ) / /_   ___ ___  _ __ ___  
 \ \ /\ / / | |/ / | |_ \ / _ \| '_ \ / __/ _ \| '_ ` _ \ 
  \ V  V /| |   <| |___) | (_) | (_) | (_| (_) | | | | | |
   \_/\_/ |_|_|\_\_|____/ \___/ \___(_)___\___/|_| |_| |_|

Utilisateur:LD/IPCheck.js

Dans le monde d’aujourd’hui, Utilisateur:LD/IPCheck.js est un sujet pertinent qui a retenu l’attention de millions de personnes à travers le monde. Depuis son émergence, Utilisateur:LD/IPCheck.js a généré une série de débats et de discussions sur son impact sur divers aspects de la vie quotidienne. Son influence s'étend à de multiples domaines, de la politique et de l'économie à la culture et à la société. Dans cet article, nous explorerons en profondeur le phénomène Utilisateur:LD/IPCheck.js, en analysant ses nombreuses facettes et ses implications dans le monde d'aujourd'hui. Grâce à une approche globale, nous tenterons de faire la lumière sur ce sujet complexe et dynamique, offrant au lecteur une vision plus complète et plus perspicace de Utilisateur:LD/IPCheck.js.
 /**
 * @name IPCheck
 * @version 2.1 11-2022
 * @see ]
 * @authors User:LD, User:DreZhsh 
 * Importation dans votre commons.js : importScript('Utilisateur:LD/IPCheck.js');
 * OR import : mw.loader.load('//fr.wikipedia.org/w/index.php?title=User:LD/IPCheck.js&action=raw&ctype=text/javascript');
 */

/* jshint esversion: 6 */
mw.loader.using( , () => {
	const portletLink = mw.util.addPortletLink( 'p-tb', '#', 'IP Checker', 'IPCPortlet' );
	let IPCheckWindowManager, bloquer;

	mw.util.addCSS( `
	.ipcheck-ipblocked {
		opacity: 0.4;
		text-decoration: line-through;
	}
` );

	if ( portletLink === null ) {
		return;
	}

	function sortIps( localblock, globalblock ) {
		const locallist = ,
			globallist = ;
		for ( const block of localblock ) {
			locallist.push( block.user );
		}
		for ( const block of globalblock ) {
			globallist.push( block.address );
		}
		document.querySelectorAll( '.ipcheckIp' ).forEach( ( element ) => {
			const ipAddress = element.textContent;
			if ( locallist.indexOf( ipAddress ) !== -1 || globallist.indexOf( ipAddress ) !== -1 ) {
				element.parentElement.setAttribute( 'class', 'ipcheck-ipblocked' );
				element.parentElement.setAttribute( 'title', 'IP Bloquée' );
			}
		} );

	}

	function getBlocks() {
		let arrayIp = mw.storage.session.get( 'ipcheck-Latest' ).split( ',' ),
			arrayLoop = ;
		while ( arrayIp.length !== 0 ) {
			arrayLoop = arrayIp.slice( 0, 50 );
			arrayIp = arrayIp.slice( 50 );
			const ipToCheck = arrayLoop.join( '|' );
			new mw.Api()
				.get( {
					action: 'query',
					format: 'json',
					list: 'blocks',
					formatversion: '2',
					bkusers: ipToCheck,
					bkprop: 'user'
				} )
				.then( ( localblock ) => {
					new mw.ForeignApi( 'https://meta.wikimedia.org/w/api.php' )
						.get( {
							action: 'query',
							format: 'json',
							list: 'globalblocks',
							formatversion: '2',
							bgaddresses: ipToCheck,
							bgprop: 'address'
						} )
						.then( ( globalblock ) => {
							if (
								localblock.query.blocks.length === 0 &&
				globalblock.query.globalblocks.lenth === 0
							) {
								return;
							}
							sortIps( localblock.query.blocks, globalblock.query.globalblocks );
						} );
				} );
		}
	}
	/**
	 * ipLinks
	 *
	 * Crée les liens à insérer dans la panneau
	 *
	 * @param {string} ipAddress - L'adresse IP
	 * @param {string}  - Le lien d'introduction
	 */
	function ipLinks( ipAddress, introLink = `<a class="ipcheckIp" href="https://wiki386.com/fr/Spécial:Contributions/${ipAddress}" target="_blank">${ipAddress}</a>` ) {
		const isSysop = mw.config.get( 'wgUserGroups' ).indexOf( 'sysop' ) !== -1;
		if ( isSysop ) {
			bloquer = ` - <a href="https://fr.wikipedia.org/w/index.php?title=Sp%C3%A9cial:Bloquer&wpAutoBlock=1&wpCreateAccount=1&wpEditingRestriction=sidewide&wpHardBlock=1&wpReason=Autre&wpReason-other=]&wpTarget=${ipAddress}" target="_blank">Bloquer</a>`;
		}
		const whois = `<a href="https://whois-referral.toolforge.org/gateway.py?lookup=true&ip=${ipAddress}" target="_blank">Whois</a> - <a href="https://bullseye.toolforge.org/ip/${ipAddress}" target="_blank">Bullseye</a>`,
			proxy = `<a href="https://www.ipqualityscore.com/free-ip-lookup-proxy-vpn-test/lookup/${ipAddress}" target="_blank">IPQualityScore</a> - <a href="https://www.spur.us/context/${ipAddress}" target="_blank">Spur</a> - <a href="https://ipcheck.toolforge.org/index.php?ip=${ipAddress}" target="_blank">IPCheck</a>`,
			wikimedia = `<a href="https://meta.toolforge.org/stalktoy/${ipAddress}" target="_blank">Blocages</a> - <a href="https://guc.toolforge.org/?by=date&user=${ipAddress}" target="_blank">Contributions globales</a>`,
			li = document.createElement( 'li' );
		li.innerHTML = `${introLink}${bloquer ?? ''}<br>${proxy}<br>(<small>${whois} - ${wikimedia}</small>)`;
		document.getElementById( 'ipCheckScriptList' ).append( li );
	}

	/**
	 * getIpInRc
	 *
	 * Obtient les IPs en fonction de la page
	 * que l'utilisateur consulte
	 */
	function getIpInRc() {
		const ipAlreadyChecked = ;
		const avaibleSpecialPage = ;

		document.getElementById( 'ipCheckScriptList' ).replaceChildren();
		if ( avaibleSpecialPage.indexOf( mw.config.get( 'wgCanonicalSpecialPageName' ) ) !== -1 ) {
			document.querySelectorAll( '.mw-anonuserlink' ).forEach( ( element ) => {
				const ipAddress = element.children.textContent;
				if (
					ipAlreadyChecked.indexOf( ipAddress ) === -1 &&
					mw.util.isIPAddress( ipAddress )
				) {
					ipAlreadyChecked.push( ipAddress );
					ipLinks( ipAddress );
				}
			} );
		} else if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
			new mw.Api().get( {
				action: 'query',
				formatversion: 2,
				prop: 'revisions',
				titles: mw.config.get( 'wgPageName' ),
				rvprop: 'ids|user',
				rvlimit: 500
			} ).then( ( data ) => {
				const revisions = data.query.pages.revisions;
				for ( const rev of revisions ) {
					const ipAddress = rev.user;
					if ( rev.anon === true &&
			ipAlreadyChecked.indexOf( ipAddress ) === -1
					) {
						ipAlreadyChecked.push( ipAddress );
						ipLinks( ipAddress, `(<a href="https://wiki386.com/fr/Spécial:Diff/${rev.revid}" target="_blank">Diff</a>) <a href="https://wiki386.com/fr/Spécial:Contributions/${ipAddress}" target="_blank" class="ipcheckIp">${ipAddress}</a>` );
					}
				}
			} );
		} else {
			new mw.Api().get( {
				action: 'query',
				format: 'json',
				list: 'recentchanges',
				utf8: 1,
				formatversion: '2',
				rcprop: 'user',
				rcshow: 'anon',
				rclimit: '100'
			} ).then( ( data ) => {
				const recentchanges = data.query.recentchanges;
				for ( const rc of recentchanges ) {
					const ipAddress = rc.user;
					if ( ipAlreadyChecked.indexOf( ipAddress ) === -1 ) {
						ipAlreadyChecked.push( ipAddress );
						ipLinks( ipAddress );

					}
				}
			} );
		}
		mw.storage.session.set( 'ipcheck-Latest', ipAlreadyChecked );

	}

	/**
	 * DefinePageName
	 *
	 * Définit le nom à utiliser dans le panneau
	 *
	 * @return {string} Le nom à utiliser dans le panneau
	 */
	function definePageName() {
		if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
			mw.config.set( 'wgPageName', mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ) );
			return `l'historique de ${mw.config.get( 'wgPageName' )}`;
		} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'BlockList' ) {
			return 'la liste des blocages';
		} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'AbuseLog' ) {
			return 'le journal des filtrages';
		} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Newpages' ) {
			return 'les nouvelles pages';
		} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Log' ) {
			return 'les journaux';
		} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Watchlist' ) {
			return 'la liste de suivi';
		} else {
			return 'les modifications récentes';
		}

	}

	/**
	 * initializeIPC
	 *
	 * Création du panneau d'IPCheck
	 */
	function initializeIPC() {
		function LongProcessDialog( config ) {
			LongProcessDialog.super.call( this, config );
		}
		OO.inheritClass( LongProcessDialog, OO.ui.ProcessDialog );
		LongProcessDialog.static.name = 'LongProcessDialog';
		LongProcessDialog.static.title = 'IP Check';
		LongProcessDialog.static.actions = [
			{ action: 'save', label: 'Cherchons', icon: 'reload', flags:  },
			{ action: 'cancel', label: 'Fermer la fenêtre', flags:  },
			{ action: 'sort', label: 'Filtrer les IPs bloquées', icon: 'funnel' }
		];
		LongProcessDialog.prototype.initialize = function () {
			LongProcessDialog.super.prototype.initialize.apply( this, arguments );
			const htmlElement = mw.html.element( 'div', { style: 'text-align:center; font-size:1.5em', id: 'ipCheckDiv' }, new mw.html.Raw( mw.html.element( 'strong', {}, `Recherche des IPs dans ${definePageName()}` ) ) );
			const htmlElement2 = mw.html.element( 'ul', { id: 'ipCheckScriptList', style: 'column-count:2;' }, '' );
			const htmlContent = ( htmlElement + htmlElement2 );
			this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
			this.content.$element.append( htmlContent );
			this.$body.append( this.content.$element );
		};
		LongProcessDialog.prototype.getActionProcess = function ( action ) {
			const dialogAction = this;
			if ( action === 'cancel' ) {
				dialogAction.close();
			} else if ( action === 'save' ) {
				getIpInRc();
			} else if ( action === 'sort' ) {
				getBlocks();
			}
			return LongProcessDialog.super.prototype.getActionProcess.call( this, action );
		};
		IPCheckWindowManager = new OO.ui.WindowManager();
		$( document.body ).append( IPCheckWindowManager.$element );

		window.IPCheckDialog = new LongProcessDialog( { size: 'full' } );
		IPCheckWindowManager.addWindows(  );
		IPCheckWindowManager.openWindow( window.IPCheckDialog );
	}

	portletLink.addEventListener( 'click', ( e ) => {
		e.preventDefault();
		if ( IPCheckWindowManager === undefined ) {
			initializeIPC();
		} else {
			IPCheckWindowManager.openWindow( window.IPCheckDialog );
		}
	} );
} );