User:Void/findInactiveSysops.js

Revision as of 03:22, 11 February 2018 by Void (talk | contribs) (+exception, because it could bork the script)

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.
//<nowiki>
//This script automates the process of finding inactive sysops.
//Warning: the script will replace the contents of the page you are currently viewing when you click the link at the top right of the page.
//Output is in the format of "[[User:Example|Example]] || [[Special:PermanentLink/1234|timestamp]] || [[Special:Log/Example|timestamp]]"
mw.loader.using(['oojs-ui', 'mediawiki.util']).done( function () {

var scriptActivationLink = mw.util.addPortletLink(
    'p-personal',
    '#',
    'Find Inactive Sysops',
    'pt-testscript',
    'Replaces the contents of the current page with a list of inactive sysops',
    null,
    '#pt-adminlinks'
);

$( scriptActivationLink ).click( function () {
	var doThis = confirm('Do you want to run the script?');
	if( doThis ) {
		$.getJSON(
			//Get userlist
            mw.util.wikiScript( 'api' ),
            {
                format: 'json',
                action: 'query',
                list: 'allusers',
                augroup: 'sysop',
                aulimit: 50, //Set limit to 50 as there are no more than 50 sysops
            }
        ).done( function ( data ) {
            try {
            	var users = data.query.allusers;
            	var userlist = [];
            	users.forEach( function( object ) {
            		userlist.push( object.name );
            	});
            	filterUsers( userlist );
            }
        	catch ( e ) {
            	console.log( "Content request error: " + e.message );
            	console.log( "Content request response: " + JSON.stringify( data ) );
        	}
    	} ).fail( function () {
        	console.log( "While getting the userlist, there was an AJAX error." );
    	} );
	}
} );

function filterUsers ( userlist ) {
	var userstring = userlist.toString();
	var exempt = ["John", "Pup", "Void", "NDKilla", "Reception123", "Revi", "Southparkfan", "Abuse filter", "Void-bot"];
	for ( i = 0; i < exempt.length; i++ ) {
		userstring = userstring.replace( exempt[i] + ",", "" );
	}
	var reducedList = userstring.split( "," );
	var tribsData;
	var logsData;
	//Visual output onto the page you activate the script on
	$( "#mw-content-text" ).replaceWith( "The following users are inactive:" + "<ul id=\"inactiveList\" style=\"list-style-type:none;list-style-image:none;\"></ul>" );
	for ( x = 0; x < reducedList.length; x++ ) {
		checkUser( reducedList[x] );
	}
	var updButton = new OO.ui.ButtonWidget( {
		label: 'Update Inactive Administrators?',
		id: 'upd-inactive-bttn'
	} );
	$("#inactiveList").after( updButton.$element.click( function() { updList(); } ) );
}

function checkUser( user ) {
	$.getJSON(
	//Get contribs and log entries
        mw.util.wikiScript( 'api' ),
        {
            format: 'json',
            action: 'query',
            list: 'logevents|usercontribs',
            leprop: 'timestamp',
            ledir: 'older',
            leuser: user,
            lelimit: 1, //We only need the most recent log action/edit
            uclimit: 1,
            ucuser: user,
            ucdir: 'older',
            ucprop: 'timestamp|ids'
        }
    ).done( function ( data ) {
        try {
        	tribsData = data.query.usercontribs;
        	logsData = data.query.logevents;
           	var activeLogs, activeTribs, active;
           	var tribsInfo;

           	if( typeof( logsData[0].timestamp ) != "undefined" ) {
           		activeLogs = compareDates( logsData[0].timestamp, "logs" );
           	}
           	else {
           		activeLogs = false;
           	}
           	if( typeof( tribsData[0] ) != "undefined" ) {
           		tribsInfo = tribsData[0].revid + "|" + tribsData[0].timestamp;
           		activeTribs = compareDates( tribsInfo, "tribs" );
           	}
           	else {
           		activeTribs = false;
           	}
           	if( activeLogs === false && activeTribs === false ) {
           		console.log( user + " is inactive" );
           		listInactiveUsers( user, tribsData, logsData );
           	}
        }
    	catch ( e ) {
        	console.log( "Content request error: " + e.message );
        	console.log( "Content request response: " + JSON.stringify( data ) );
    	}
    } ).fail(/*console.log( "While getting the userlist, there was an AJAX error." )*/);
}

function compareDates ( data, dataType ) {
	//Gets current date in yyyymmdd
	var today = new Date();
	var dd = today.getDate();
	var mm = today.getMonth() + 1; //January is 0!
	var yyyy = today.getFullYear();
	//Set back 3 months
	mm -= 3;
	if( mm < 0 ) {
		mm += 12;
		yyyy -= 1;
	}
	
	if( dd < 10 ) {
    	dd = '0' + dd;
	} 

	if( mm<10 ) {
	    mm = '0' + mm;
	} 
	today = '' + yyyy + mm + dd; //This is a string

	var date;
	var isActive;
	if( dataType === "logs" ) {
		date = data.slice( 0, data.indexOf('T') );
		date = date.replace( "-", "" );
	}
	else if( dataType === "tribs" ) {
		date = data.slice( data.indexOf('|') + 1, data.indexOf('T') );
		date = date.replace( "-", "" );
	}
	if ( date < today ) {
		isActive = false;
	}
	else {
		isActive = true;
	}
	return isActive;
}

function listInactiveUsers( userName, tribsArray, logsArray ) {
	var userLink = "[[User:<a href=\"https://publictestwiki.com/wiki/Special:Contribs/" + userName + "\">" + userName + "</a>|" + userName + "]]";
	var tribsInfo;
	if( tribsArray[0] !== undefined ) {
		tribsInfo = tribsArray[0].timestamp;
		tribsInfo = tribsInfo.slice( 0, tribsInfo.indexOf("T") );
		tribsInfo = tribsArray[0].revid + "|" + tribsInfo;
		tribsInfo = "[[Special:PermanentLink/" + tribsInfo + "]]";
	}
	else {
		tribsInfo = 'None';
	}
	var logsInfo = logsArray[0].timestamp;
	logsInfo = logsInfo.slice( 0, logsInfo.indexOf("T") );
	logsInfo = "[[Special:Log/" + userName + "|" + logsInfo + "]]";
	$("#inactiveList").append( "<li>" + userLink + " || " + tribsInfo + " || " + logsInfo + "</li>" );
}

function updList() {
	var list = $("#inactiveList")[0].innerText;
	list = '|-\n|' + list;
	while( list.indexOf("\n[[User:") > 0 ) {
		list = list.substr( 0, list.indexOf( "\n[[User:" ) ) + '\n|-\n|' + list.substr( list.indexOf( "\n[[User:" ) + 1 );
	}
	$.getJSON(
		mw.util.wikiScript( 'api' ),
        {
            format: 'json',
            action: 'query',
            pageids: 440,
            prop: 'revisions',
            rvprop: 'content'
        }
    ).done( function ( data ) {
        try {
           	var wtext = data.query.pages[440].revisions[0]['*'];
           	wtext = wtext.substr( 0, wtext.indexOf("|-") ) + list + wtext.substr( wtext.indexOf( "|}" ) );
           	$.ajax( {
       			url: mw.util.wikiScript( 'api' ),
		        type: 'POST',
		        dataType: 'json',
		        data: {
		            format: 'json',
		            action: 'edit',
		            title: 'TestWiki:Inactivity/Inactive administrators',
		            text: wtext,
		            summary: '[[User:Void/findInactiveSysops.js|Automatically]] updating list',
		            token: mw.user.tokens.get( 'csrfToken' ),
		        }
   			} ).done( function() {
   				alert( "Updated TestWiki:Inactivity/Inactive administrators" );
   				var reload = new OO.ui.ButtonWidget( { label: 'Load original page' } );
   				$('#upd-inactive-bttn').replaceWith( reload.$element.click( function() { window.location.reload(); } ) );
   			} ).fail( function ( e, data ) {
   				console.log( e.message );
   				console.log( JSON.stringify( data ) );
   			} );
        }
        catch( e ) {
          	// ignore
        }
    } ).fail( function ( e, data ) {
    	console.log( e.message );
    	console.log( JSON.stringify( data ) );
    } );
}

});
//</nowiki>