MediaWiki:PatrolPageRevisions.js

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
/**
 * [[MediaWiki:PatrolPageRevisions.js]]
 *
 * Adds button that when pressed patrols all revisions of one page
 *
 */
/*jshint */
/*global jQuery:false, mediaWiki:false*/

(function ($, mw) {
	'use strict';
	
	var ppr, pt;
	function firstItem(o) { for (var i in o) { if (o.hasOwnProperty(i)) { return o[i]; } } }
	
	
	ppr = {
		init: function() {
			pt = mw.user.tokens.get('patrolToken');
			if (!pt) return mw.log('[[MediaWiki:PatrolPageRevisions.js]] found no patrol token for you. Are you still a patroller?');
			
			$('<button type="button"></button>')
				.text('Patrol all revisions')
				.attr('title', "Patrols up to 500 revisions of one page.")
				.insertAfter($('.mw-history-compareselectedversions-button').first())
				.click(ppr.doPatrol);
		},
		doPatrol: function(e) {
			e.preventDefault();
			var $b = $(this).attr('disabled', 'disabled').text('Patrolling …');
			
			mw.loader.using('ext.gadget.libAPI', function() {
				mw.libs.commons.api.$query({
					'action': 'query',
					'prop': 'revisions',
					'titles': mw.config.get('wgPageName').replace(/_/g, ' '),
					'rvprop': 'ids',
					'rvlimit': 500
				}).done(function(r) {
					var pg = firstItem(r.query.pages),
						reqOk = 0,
						reqExpired = 0,
						reqFailed = 0,
						reqIssued = 0;
						
					$.each(pg.revisions, function(i, rev) {
						// FIXME: AND NOW ... WE DO EVIL! WE'RE FLOODING THE API.
						reqIssued++;
						$.post(mw.util.wikiScript('api'), {
							'format': 'json',
							'action': 'patrol',
							'token': pt,
							'revid': rev.revid
						}).done(function(r) {
							if (r && r.patrol) {
								reqOk++;
							} else {
								if (r && r.error && r.error.code === 'notpatrollable') {
									reqExpired++;
								} else {
									reqFailed++;
								}
							}
						}).fail(function() {
							reqFailed++;
						}).always(function() {
							if (reqOk + reqFailed + reqExpired === reqIssued) {
								$b.text('TOTAL: ' + reqIssued + ' Ok:' + reqOk + ' (Expired:' + reqExpired + ') Failed:' + reqFailed);
							}
						});
					});
				});
			});
		}
	};

	if ('history' !== mw.config.get('wgAction')) return;

	mw.loader.using(['mediawiki.user', 'user.options'], ppr.init);

}(jQuery, mediaWiki));