MediaWiki:MassPatrol/code.js
From PHIGHTING! Wiki
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.
/*
* Name: MassPatrol
* Description: Allows to massively patrol edits
* Author: Rendann
* Support: Aenn, BertH, Your Own Waifu
* Files used: [[File:Facebook throbber.gif]]
* Scripts used:
* https://dev.wikia.com/wiki/MediaWiki:AjaxPatrol/code.js
*/
(function ($, mw) {
'use strict';
//Load Protection
if (window.MassPatrolLoaded) return;
window.MassPatrolLoaded = true;
//Load I18n-js
importArticle({
type:'script',
article:'MediaWiki:I18n-js/code.js'
});
var preloads = 2;
//Prepare PageCfg
var pageConfig = mw.config.get(['wgDiffOldId','wgDiffNewId','wgPageName','wgAction']);
function init(i18n) {
var api = new mw.Api();
var MassPatrol = {
revids:[],
patroltoken:'',
total:0,
init: function () {
//Not on Diff page or History Page
if (pageConfig.wgDiffNewId===null && pageConfig.wgAction!=='history') { return; }
//Load API
api.get({
format: 'json',
action: 'query',
list: 'recentchanges',
rcprop: 'ids|patrolled',
rcdir: 'newer',
rclimit: 'max',
rctitle: pageConfig.wgPageName,
meta: 'tokens',
type: 'patrol'
}).then(MassPatrol.apiLoad);
},
apiLoad: function(data) {
//Grab RC into array
var rcArray = data.query.recentchanges;
//If history page, fork off
if (pageConfig.wgAction==='history') {
return MassPatrol.history(rcArray.filter(function(e){
return !('patrolled' in e);
}));
}
//Bulk of Mass Patrol Code
MassPatrol.patroltoken = data.query.tokens.patroltoken;
var capture = false;
for (var i = 0; i < rcArray.length; i++) {
var each = rcArray[i];
if (each.revid >= (pageConfig.wgDiffOldId || 0))
capture = true; //Start Capture
if (capture && !('patrolled' in each)) //Capturing starts, and unpatrolled
MassPatrol.revids.push(each.revid);
if (each.revid >= pageConfig.wgDiffNewId)
break; //End Early
}
//Set max patrol length (for end counter: will be shift-ing this array)
MassPatrol.total = MassPatrol.revids.length;
//Build HTML For Mass Patrol Button
var button = $('<span>', {
id: 'massPatrol'
}).append('[',$('<a>',{
href:'#',
text:i18n.msg('patrol').plain()
}),']');
// Cannot be added directly to the button as it will not render in new page edits
document.addEventListener('click', function(event){
if (event.target && event.target.closest('#massPatrol') && document.querySelector('#massPatrol a')){
event.preventDefault();
document.querySelector('#massPatrol a').outerHTML = '<img src="//images.wikia.nocookie.net/dev/images/8/82/Facebook_throbber.gif"' +
'style="vertical-align: baseline;" border="0" alt=' + i18n.msg('patrolling').escape() + '/>';
MassPatrol.patrolRecursive();
}
});
//Can Patrol, and Has at least 1 Patrol, apply built HTML
if (MassPatrol.patroltoken.length>2 && MassPatrol.total >= 1)
$('#mw-diff-ntitle4').append(' ',button);
},
history:function(data){
var unpatrolled = $('<abbr>',{
class: 'unpatrolled',
title: i18n.msg('unpatrolled').plain(),
text:' \xa0!\xa0'
});
var obj = $('li[data-mw-revid]').filter(function(i,obj){
return data.find(function(e){
return e.revid == $(obj).data('mw-revid');
});
}).prepend(unpatrolled);
},
patrolRecursive: function() {
if (MassPatrol.revids.length === 0) {
return $('#massPatrol').text('['+i18n.msg('patrolled',MassPatrol.total).plain()+']');
}
api.post({
action: 'patrol',
format: 'json',
revid: MassPatrol.revids.shift(),
token: MassPatrol.patroltoken
}).then(MassPatrol.patrolRecursive);
}
};
MassPatrol.init();
}
function preload() {
if (--preloads > 0) return;
window.dev.i18n.loadMessages('MassPatrol').done(init);
}
// Add Hook when finish loading I18n-js and API is ready for use
mw.loader.using('mediawiki.api').then(preload);
mw.hook('dev.i18n').add(preload);
})(window.jQuery, window.mediaWiki);