User:Fred Gandt/getUnpatrolledOfAlexNewArtBotResultsPages.js

$( document ).ready( function {	"use strict";	if ( !!/\bUser:AlexNewArtBot\/\w+SearchResult\b/i.test( mw.config.get( "wgPageName" ) ) && mw.config.get( "wgAction" ) == "view" ) {		if ( ~mw.config.get( "wgUserGroups" ).indexOf( "patroller" ) ) {			const nsName2Number = function( pn ) {					return {						"Media": "-2", "Special": "-1", "": "0", "User": "2", "Wikipedia": "4", "File": "6", "MediaWiki": "8", "Template": "10",						"Help": "12", "Category": "14", "Portal": "100", "Book": "108", "Draft": "118", "Education Program": "446",						"TimedText": "710", "Module": "828", "Gadget": "2300", "Gadget definition": "2302", "Topic": "2600"					}[ ( /^([\w ]{4,17})\:[^ ]\w*/g.exec( pn ) || [ "", "" ] )[ 1 ] ] || "0";				},				query = function( usr, nmspcs, fnc ) {					$.ajax( { url: "/w/api.php", dataType: "json", data: { action: "query", format: "json", generator: "recentchanges", grclimit: "max", grctype: "new", grcshow: "!patrolled", grcnamespace: nmspcs.join( "|" ), grcuser: usr, redirects: "" }, success: function( data ) { fnc( usr, data ); }, error: function( data) { console.error( data ); } } );				},				setUi = function( ul ) {					const BTN = document.createElement( "button" ),						LIS = ul.querySelectorAll( "li" ),						read = function {							const mark = function( u, t, r ) {									let ut = u[ t ];									if ( ut ) {										ut.classList.add( "fg-unpatrolled" );										if ( r ) {											ut.setAttribute( "class", "fg-redirect" );											ut.querySelector( "a" ).href = "/w/index.php?title=" + t.replace( / /g, "_" ) + "&redirect=no";											ut.innerHTML += "Redirected to " + r + "";										}									}								},								UI = document.createElement( "p" ),								USRS = {};							let nmbr = 0;							UI.innerText = "Reading...";							ul.replaceChild( UI, this );							LIS.forEach( function( li ) { const PG = li.querySelector( "a" ).innerText, NSN = nsName2Number( PG ), USR = li.querySelector( "a[title^=User]" ).innerText; let kUSR = USRS[ USR ]; if ( !kUSR ) { kUSR = USRS[ USR ] = { "pgs": [ PG ], "nmspcs": [ NSN ] }; ++nmbr; } else { kUSR.pgs.push( PG ); if ( kUSR.nmspcs.indexOf( NSN ) < 0 ) { kUSR.nmspcs.push( NSN ); }								}								kUSR[ PG ] = li; } );							UI.innerText = "Requesting data for " + nmbr + " unique authors";							$( document ).ajaxComplete( function { if ( !--nmbr ) { UI.classList.add( "fg-finished" ); }							} );							Object.getOwnPropertyNames( USRS ).forEach( function( usr ) { const tUSR = USRS[ usr ]; query( usr, tUSR.nmspcs, function( usr, data ) {									if ( !!data.query ) {										const PGS = data.query.pages, // object of objects											RDRCTS = data.query.redirects; // array of objects										Object.getOwnPropertyNames( PGS ).forEach( function( pg ) { mark( tUSR, PGS[ pg ].title ); } );										if ( !!RDRCTS ) {											RDRCTS.forEach( function( rdrct ) { mark( tUSR, rdrct.from, rdrct.to ); } );										}										UI.innerHTML = "Highlighting " + ul.querySelectorAll( ".fg-unpatrolled,.fg-redirect" ).length + " unpatrolled pages ";									}								} ); } );						};					BTN.innerText = "Find unpatrolled of these " + LIS.length + " results";					BTN.addEventListener( "click", read, { "once": true } );					return BTN;				},				BS = document.createElement( "base" );			mw.loader.load( "/w/index.php?title=User:Fred_Gandt/getUnpatrolledOfAlexNewArtBotResultsPages.css&action=raw&ctype=text/css", "text/css" );			BS.setAttribute( "target", "_blank" );			document.querySelector( "head" ).appendChild( BS );			document.getElementById( "mw-content-text" ).querySelectorAll( "ul" ).forEach( function( ul ) { ul.insertBefore( setUi( ul ), ul.firstElementChild ); } );		} else {			window.alert( 'The script "getUnpatrolledOfAlexNewArtBotResultsPages.js" by "User:Fred_Gandt" cannot function without the user having the "patroller" group right.' );		}	} } );