MediaWiki:Gadget/Twinkle/twinklebatchprotect.js

From OpenWetWare

Jump to: navigation, search

Note - After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh); Konqueror: click Reload or press F5; Opera: clear the cache in Tools → Preferences; Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

// If TwinkleConfig aint exist.
if( typeof( TwinkleConfig ) == 'undefined' ) {
    TwinkleConfig = {};
}
 
/**
 TwinkleConfig.summaryAd (string)
 If ad should be added or not to summary, default [[WP:TWINKLE|TWINKLE]]
 */
if( typeof( TwinkleConfig.summaryAd ) == 'undefined' ) {
    TwinkleConfig.summaryAd = " using [[WP:TW|TW]]";
}
 
/**
 TwinkleConfig.protectionSummaryAd (string)
 If ad should be added or not to protection summary, default [[WP:TWINKLE|TWINKLE]]
 */
if( typeof( TwinkleConfig.protectionSummaryAd ) == 'undefined' ) {
    TwinkleConfig.protectionSummaryAd = " using [[WP:TW|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 );
    }
}
Personal tools