User:Void/findInactiveSysops.js

// //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 "Example || timestamp || timestamp" mw.loader.using(['oojs-ui', 'mediawiki.util']).done( function {

var scriptActivationLink = mw.util.addPortletLink(   'p-tb',    '#',    '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: 'bot|sysop|bureaucrat|consul|autopatrolled|rollbacker|interface-admin|flow-bot', aulimit: 150, //Unlikely to be more than 150 privilged users }       ).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", "Void", "NDKilla", "Reception123", "Revi", "Southparkfan", "Abuse filter", "Void-bot", "Voidwalker", "Paladox", "Zppix", "ZppixBot", "RhinosF1", "MediaWiki message delivery", "ZI Jony", "Bonnedav", "Babel AutoCreate", "HeartsDo"]; 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:" + "" ); 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 = "" + 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 = "" + logsInfo + ""; $("#inactiveList").append( "" + userLink + " || " + tribsInfo + " || " + logsInfo + "" ); }

function updList { var list = $("#inactiveList")[0].innerText; list = '|-\n|' + list; while( list.indexOf("\n-\n|' + list.substr( list.indexOf( "\n[[User:" ) + 1 );	}	$.getJSON(		mw.util.wikiScript( 'api' ),       {            format: 'json',            action: 'query',            pageids: 238,            prop: 'revisions',            rvprop: 'content'        }    ).done( function ( data ) {        try {           	var wtext = data.query.pages[238].revisions[0]['*'];           	wtext = wtext.substr( 0, wtext.indexOf("|-") ) + list + '\n' + 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 ) );    } ); }

}); //