MediaWiki:Gadget/Twinkle/twinklebatchprotect.js

// If TwinkleConfig aint exist. if( typeof( TwinkleConfig ) == 'undefined' ) { TwinkleConfig = {}; }

/** TwinkleConfig.summaryAd (string) If ad should be added or not to summary, default TWINKLE */ if( typeof( TwinkleConfig.summaryAd ) == 'undefined' ) { TwinkleConfig.summaryAd = " using TW"; }

/** TwinkleConfig.protectionSummaryAd (string) If ad should be added or not to protection summary, default TWINKLE */ if( typeof( TwinkleConfig.protectionSummaryAd ) == 'undefined' ) { TwinkleConfig.protectionSummaryAd = " using TW"; }

/** TwinkleConfig.batchProtectChunks (integer) How many pages should be processed at a time */ if( typeof( TwinkleConfig.batchProtectChunks ) == 'undefined' ) { TwinkleConfig.batchProtectChunks = 50; }

/** TwinkleConfig.batchProtectMinCutOff (integer) How many pages left in the process of being completed should allow a new batch to be initialized */ if( typeof( TwinkleConfig.batchProtectMinCutOff ) == 'undefined' ) { TwinkleConfig.batchProtectMinCutOff = 5; }

/** TwinkleConfig.batchMax (integer) How many pages should be processed maximum */ if( typeof( TwinkleConfig.batchMax ) == 'undefined' ) { TwinkleConfig.batchMax = 5000; }

function twinklebatchprotect { if( userIsInGroup( 'sysop' ) && (wgNamespaceNumber > 0 || wgCanonicalSpecialPageName == 'Prefixindex') ) { addPortletLink( 'p-cactions', "javascript:twinklebatchprotect.callback", "P-batch", "tw-pbatch", "Protect pages found on this page", ""); } } addOnloadHook(twinklebatchprotect);

twinklebatchprotect.unlinkCache = {}; twinklebatchprotect.callback = function twinklesbatchprotectCallback { var Window = new SimpleWindow( 800, 400 ); Window.setTitle( "Batch protection" );

var form = new QuickForm( twinklebatchprotect.callback.evaluate ); form.append( {           type: 'select',            name: 'move',            label: 'Move protection',            list: [                {                     label: 'Allow all users (still autoconfirmed)',                    value: '',                    selected: true                },                {                     label: 'Block new and unregistered users',                    value: 'autoconfirmed'                },                {                    label: 'Block all non-admin users',                    value: 'sysop'                }            ]        } ); form.append( {           type: 'select',            name: 'edit',            label: 'Edit protection',            list: [                {                     label: 'Allow all users',                    value: '',                    selected: true                },                {                     label: 'Block new and unregistered users',                    value: 'autoconfirmed'                },                {                    label: 'Block all non-admin users',                    value: 'sysop'                }            ]        } ); form.append( {           type: 'select',            name: 'create',            label: 'Create protection',            list: [                {                     label: 'Allow all users (still autoconfirmed)',                    value: '',                    selected: true                },                {                     label: 'Block new and unregistered users',                    value: 'autoconfirmed'                },                {                    label: 'Block all non-admin users',                    value: 'sysop'                }            ]        } ); form.append( {           type: 'checkbox',            list: [                {                    name: 'cascade',                    label: 'Cascade protection'                }            ]        } ); form.append( {           type: 'select',            name: 'expiry',            label: 'Expiration: ',            list: [                { label: '15 minutes', value: '15 minutes' },                { label: '30 minutes', value: '30 minutes' },                { label: '45 minutes', value: '45 minutes' },                { label: '1 hour', value: '1 hour' },                { label: '2 hours', value: '2 hours' },                { label: '3 hours', value: '3 hours' },                { label: '6 hours', value: '6 hours' },                { label: '12 hours', value: '12 hours' },                { label: '1 day', value: '1 day' },                { label: '2 days', value: '2 days' },                { label: '3 days', value: '3 days' },                { label: '4 days', value: '4 days' },                { label: '5 days', value: '5 days' },                { label: '6 days', value: '6 days' },                { label: '1 week', value: '1 week' }, { label: '2 weeks', value: '2 weeks' }, { label: '1 month', value: '1 month' }, { label: '2 months', value: '2 months' }, { label: '3 months', value: '3 months' }, { label: '6 months', value: '6 months' }, { label: '1 year', value: '1 year' }, { label: '2 years', value: '2 years' }, { label: '3 years', value: '3 years' }, { label: '6 years', value: '6 years' }, { label: 'indefinite', selected: true, value:'indefinite' } ]       } );    form.append( { type: 'textarea', name: 'reason', label: 'Reason: ' } );

if( wgNamespaceNumber == Namespace.CATEGORY ) {

var query = { 'action': 'query', 'generator': 'categorymembers', 'gcmtitle': wgPageName, 'gcmlimit' : TwinkleConfig.batchMax, // the max for sysops 'prop': [ 'revisions' ], 'rvprop': [ 'size' ] };   } else if( wgCanonicalSpecialPageName == 'Prefixindex' ) { var query = { 'action': 'query', 'generator': 'allpages', 'gapnamespace': QueryString.exists('namespace') ? QueryString.get( 'namespace' ): document.getElementById('namespace').value, 'gapprefix': QueryString.exists('from') ? QueryString.get( 'from' ).replace('+', ' ').toUpperCaseFirstChar : document.getElementById('nsfrom').value.toUpperCaseFirstChar, 'gaplimit' : TwinkleConfig.batchMax, // the max for sysops 'prop' : [ 'revisions' ], 'rvprop': [ 'size' ] }   } else { var query = { 'action': 'query', 'gpllimit' : TwinkleConfig.batchMax, // the max for sysops 'generator': 'links', 'titles': wgPageName, 'prop': [ 'revisions' ], 'rvprop': [ 'size' ] };

}   var wikipedia_api = new Wikipedia.api( 'Grabbing pages', query, function( self ) {            var xmlDoc = self.responseXML;            var snapshot = xmlDoc.evaluate('//page', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );            var list = [];            for ( var i = 0; i < snapshot.snapshotLength; ++i ) {                var object = snapshot.snapshotItem(i);                var page = xmlDoc.evaluate( '@title', object, null, XPathResult.STRING_TYPE, null ).stringValue;                var size = xmlDoc.evaluate( 'revisions/rev/@size', object, null, XPathResult.NUMBER_TYPE, null ).numberValue;

list.push( {label:page + (size ? ' (' + size + ')' : '' ), value:page, checked: true }); }           self.params.form.append( {                    type: 'checkbox',                    name: 'pages',                    list: list                }            ) self.params.form.append( { type:'submit' } );

var result = self.params.form.render; self.params.Window.setContent( result );

} );

wikipedia_api.params = { form:form, Window:Window }; wikipedia_api.post; var root = document.createElement( 'div' ); Status.init( root ); Window.setContent( root ); Window.display; }

twinklebatchprotect.currentProtectCounter = 0; twinklebatchprotect.currentprotector; twinklebatchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) { wgPageName = wgPageName.replace( /_/g, ' ' ); // for queen/king/whatever and country! var pages = event.target.getChecked( 'pages' ); var reason = event.target.reason.value; var create = event.target.create.value; var edit = event.target.edit.value; var cascade = event.target.cascade.checked; var expiry = event.target.expiry.value; var move = event.target.move.value; if( ! reason ) { return; }   Status.init( event.target ); if( !pages ) { Status.error( 'Error', 'nothing to delete, aborting' ); return; }

function toCall( work ) { if( work.length == 0 && twinklebatchprotect.currentProtectCounter <= 0 ) { Status.info( 'work done' ); window.clearInterval( twinklebatchprotect.currentprotector ); Wikipedia.removeCheckpoint; return; } else if( work.length != 0 && twinklebatchprotect.currentProtectCounter <= TwinkleConfig.batchProtectMinCutOff ) { var pages = work.shift; twinklebatchprotect.currentProtectCounter += pages.length; for( var i = 0; i < pages.length; ++i ) { var page = pages[i]; var query = { 'action': 'query', 'titles': page }               var wikipedia_api = new Wikipedia.api( 'Checking if page ' + page + ' exists', query, twinklebatchprotect.callbacks.main ); wikipedia_api.params = { page:page, reason:reason, move: move, edit: edit, create: create, expiry: expiry, cascade: cascade    }; wikipedia_api.post; }       }    }    var work = pages.chunk( TwinkleConfig.batchProtectChunks ); Wikipedia.addCheckpoint; twinklebatchprotect.currentprotector = window.setInterval( toCall, 1000, work ); } twinklebatchprotect.callbacks = { main: function( self ) { var xmlDoc = self.responseXML; var normal = xmlDoc.evaluate( '//normalized/n/@to', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue; if( normal ) { self.params.page = normal; }

var query = { 'title': self.params.page, 'action': 'protect' };       var wikipedia_wiki = new Wikipedia.wiki( 'Protecting page ' + self.params.page, query, twinklebatchprotect.callbacks.protectPage, function( self ) {                 --twinklebatchprotect.currentProtectCounter;                var link = document.createElement( 'a' );                link.setAttribute( 'href', wgArticlePath.replace( '$1', self.query['title'] ) );                link.setAttribute( 'title', self.query['title'] );                link.appendChild( document.createTextNode( self.query['title'] ) );                self.statelem.info( [ 'completed (', link , ')' ] );

} );       wikipedia_wiki.params = self.params;        wikipedia_wiki.followRedirect = false;        wikipedia_wiki.get;            },    protectPage: function( self ) {        var form  = self.responseXML.getElementById( 'mw-Protect-Form' );        var postData = {            'wpEditToken': form.wpEditToken.value,            'mwProtect-level-edit': self.params.edit,            'wpProtectExpirySelection-edit': self.params.expiry != 'indefinite' ? 'othertime' : 'indefinite',            'mwProtect-expiry-edit': self.params.expiry != 'indefinite' ? self.params.expiry : undefined,            'mwProtect-level-move': self.params.move,            'wpProtectExpirySelection-move': self.params.expiry != 'indefinite' ? 'othertime' : 'indefinite',            'mwProtect-expiry-move': self.params.expiry != 'indefinite' ? self.params.expiry : undefined,            'mwProtect-cascade': self.params.cascade ? '' : undefined, 'mwProtectWatch': form.mwProtectWatch.checked ? '' : undefined, 'wpProtectReasonSelection': 'other', 'mwProtect-reason': self.params.reason + TwinkleConfig.protectionSummaryAd };

self.post( postData ); } }