User:Matttest/common.js: Difference between revisions
Content added Content deleted
(Created page with "→jslint strict:false: //<nowiki> //This script automates the process of finding inactive sysops. //Output is in the format of "Example || [[Special:Perman...") |
(Replaced content with "→© CC BY-SA 3.0 Publisher: Matttest: if (mw.config.get('wgNamespaceNumber') % 2 == 1 && (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit")) { $(function () { if (!document.editform || !document.editform.wpSave || !document.editform.wpTextbox1) return; var oldOnclick = document.editform.wpSave.onclick; document.editform.wpSave.onclick = function () { if (oldOnclick && !oldOnclick.apply(this, ar...") Tag: Replaced |
||
Line 1: | Line 1: | ||
/* |
|||
/* jslint strict:false */ |
|||
© CC BY-SA 3.0 |
|||
//<nowiki> |
|||
Publisher: Matttest |
|||
//This script automates the process of finding inactive sysops. |
|||
*/ |
|||
//Output is in the format of "[[User:Example|Example]] || [[Special:PermanentLink/1234|timestamp]] || [[Special:Log/Example|timestamp]]" |
|||
if (mw.config.get('wgNamespaceNumber') % 2 == 1 && (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit")) { |
|||
mw.loader.using(['oojs-ui', 'mediawiki.util']).done( function () { |
|||
$(function () { |
|||
var scriptActivationLink = mw.util.addPortletLink( |
|||
if (!document.editform || !document.editform.wpSave || !document.editform.wpTextbox1) return; |
|||
'p-tb', |
|||
var oldOnclick = document.editform.wpSave.onclick; |
|||
'#', |
|||
document.editform.wpSave.onclick = function () { |
|||
'Find Inactive Sysops', |
|||
if (oldOnclick && !oldOnclick.apply(this, arguments)) return false; |
|||
'pt-testscript', |
|||
if (document.editform.wpTextbox1.value.match(/~{3}/)) return true; |
|||
'Replaces the contents of the current page with a list of inactive sysops', |
|||
return confirm("You haven't signed after leaving your message, save anyway?"); |
|||
null, |
|||
'#pt-adminlinks' |
|||
); |
|||
$( scriptActivationLink ).click( function () { |
|||
var progressBar = new OO.ui.ProgressBarWidget(); |
|||
var progressField = new OO.ui.FieldLayout( |
|||
progressBar, |
|||
{ |
|||
label: "Fetching users...", |
|||
align: 'top' |
|||
} |
|||
); |
|||
var textPanel = new OO.ui.PanelLayout( { |
|||
expanded: false, |
|||
framed: false, |
|||
padded: false, |
|||
} ); |
|||
var canSave = false; |
|||
function InactiveUsersProc( config ) { |
|||
InactiveUsersProc.super.call( this, config ); |
|||
} |
|||
OO.inheritClass( InactiveUsersProc, OO.ui.ProcessDialog ); |
|||
InactiveUsersProc.static.name = "Inactive Users Process"; |
|||
InactiveUsersProc.static.title = "List of Inactive Users:"; |
|||
InactiveUsersProc.static.actions = [ |
|||
{ |
|||
action: "save", |
|||
label: "Update", |
|||
flags: "primary" |
|||
}, |
|||
{ |
|||
label: "Cancel", |
|||
flags: "safe" |
|||
} |
|||
]; |
|||
InactiveUsersProc.prototype.initialize = function() { |
|||
InactiveUsersProc.super.prototype.initialize.apply( this, arguments ); |
|||
this.content = new OO.ui.FieldsetLayout(); |
|||
this.content.addItems([ progressField ]); |
|||
this.content.$element.css( 'padding', '1em' ); |
|||
this.$body.append( this.content.$element ); |
|||
}; |
}; |
||
}); |
|||
} |
|||
InactiveUsersProc.prototype.getActionProcess = function( action ) { |
|||
var dialog = this; |
|||
if( action && canSave ) { |
|||
return new OO.ui.Process( function() { |
|||
if( action == "save" ) { |
|||
updList(); |
|||
} |
|||
dialog.close( { |
|||
action: action |
|||
} ); |
|||
}); |
|||
} |
|||
return InactiveUsersProc.super.prototype.getActionProcess.call( this, action ); |
|||
}; |
|||
InactiveUsersProc.prototype.getBodyHeight = function() { |
|||
return this.content.$element.outerHeight( true ); |
|||
}; |
|||
var windowManager = new OO.ui.WindowManager(); |
|||
var inactiveUsersProc = new InactiveUsersProc( { |
|||
size: "large" |
|||
} ); |
|||
windowManager.addWindows([ inactiveUsersProc ]); |
|||
$('body').append(windowManager.$element); |
|||
windowManager.openWindow(inactiveUsersProc); |
|||
var checked = 0; |
|||
var inactive = []; |
|||
var checkList = []; |
|||
var total = 0; |
|||
// Get user list |
|||
$.getJSON( |
|||
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", "NDKilla", "Reception123", "Revi", "Southparkfan", "Abuse filter", "Void", "Zppix", "RhinosF1", "MirahezeBots", "MediaWiki message delivery", "MediaWiki default", "Babel AutoCreate", "Dmehus", "Revibot", "Delete page script", "Move page script", "Flow talk page manager", "Universal Omega", "HeartsDo"]; |
|||
for ( i = 0; i < exempt.length; i++ ) { |
|||
userstring = userstring.replace( exempt[i] + ",", "" ); |
|||
} |
|||
checkList = userstring.split( "," ); |
|||
total = checkList.length; |
|||
checkUser( checkList.pop() ); |
|||
} |
|||
function checkUser( user ) { |
|||
$.getJSON( |
|||
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 { |
|||
var tribsData = data.query.usercontribs; |
|||
var logsData = data.query.logevents; |
|||
var activeLogs, activeTribs, active, tribsInfo; |
|||
if( typeof( logsData[0] ) != "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 ) { |
|||
inactive.push([user, tribsData, logsData]); |
|||
} |
|||
checked++; |
|||
progressBar.setProgress( parseInt( (checked/total) * 100 ) ); |
|||
if( checkList.length > 0 ) { |
|||
checkUser( checkList.pop() ); |
|||
} else { |
|||
listInactiveUsers(); |
|||
} |
|||
} catch ( e ) { |
|||
console.log( "Content request error: " + e.message ); |
|||
console.log( "Content request response: " + JSON.stringify( data ) ); |
|||
} |
|||
} ); |
|||
} |
|||
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( /-/g, "" ); |
|||
} else if( dataType === "tribs" ) { |
|||
date = data.slice( data.indexOf('|') + 1, data.indexOf('T') ); |
|||
date = date.replace( /-/g, "" ); |
|||
} |
|||
return date >= today; |
|||
} |
|||
function listInactiveUsers() { |
|||
sorted = inactive.sort( function( a, b ) { |
|||
return a[0].localeCompare( b[0] ); |
|||
} ); |
|||
for( var i in sorted ) { |
|||
var userName = sorted[i][0]; |
|||
var tribsArray = sorted[i][1]; |
|||
var logsArray = sorted[i][2]; |
|||
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; |
|||
if( logsArray[0] !== undefined ) { |
|||
logsInfo = logsArray[0].timestamp; |
|||
logsInfo = logsInfo.slice( 0, logsInfo.indexOf("T") ); |
|||
logsInfo = "[[Special:Log/" + userName + "|" + logsInfo + "]]"; |
|||
} else { |
|||
logsInfo = 'None'; |
|||
} |
|||
textPanel.$element.append( "<li>" + userLink + " || " + tribsInfo + " || " + logsInfo + "</li>" ); |
|||
} |
|||
inactiveUsersProc.content.clearItems(); |
|||
inactiveUsersProc.content.addItems([textPanel]); |
|||
inactiveUsersProc.updateSize(); |
|||
canSave = true; |
|||
} |
|||
function updList() { |
|||
var list = textPanel.$element[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 ); |
|||
} |
|||
// Get contents of TestWiki:Inactivity/Inactive administrators |
|||
$.getJSON( |
|||
mw.util.wikiScript( 'api' ), |
|||
{ |
|||
format: 'json', |
|||
action: 'query', |
|||
pageids: 238, |
|||
prop: 'revisions', |
|||
rvprop: 'content', |
|||
rvslots: 'main' |
|||
} |
|||
).done( function ( data ) { |
|||
try { |
|||
var wtext = data.query.pages[238].revisions[0].slots.main['*']; |
|||
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" ); |
|||
} ).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> |
Revision as of 05:44, 27 April 2022
/*
© CC BY-SA 3.0
Publisher: Matttest
*/
if (mw.config.get('wgNamespaceNumber') % 2 == 1 && (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit")) {
$(function () {
if (!document.editform || !document.editform.wpSave || !document.editform.wpTextbox1) return;
var oldOnclick = document.editform.wpSave.onclick;
document.editform.wpSave.onclick = function () {
if (oldOnclick && !oldOnclick.apply(this, arguments)) return false;
if (document.editform.wpTextbox1.value.match(/~{3}/)) return true;
return confirm("You haven't signed after leaving your message, save anyway?");
};
});
}