:User:Timotab/twinkleprotect.js

//

// If TwinkleConfig aint exist.

if( typeof( TwinkleConfig ) == 'undefined' ) {

TwinkleConfig = function() {};

}

/**

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";

}

function twinkleprotect() {

if( wgNamespaceNumber < 0 || wgCurRevisionId == false ) {

return;

}

if( userIsInGroup( 'sysop' ) ) {

mw.util.addPortletLink( 'p-cactions', "javascript:twinkleprotect.callback()", "pp", "tw-rpp", "Protect page", "");

} else {

mw.util.addPortletLink( 'p-cactions', "javascript:twinkleprotect.callback()", "rpp", "tw-rpp", "Request page protection", "");

}

}

$(twinkleprotect);

twinkleprotect.callback = function twinkleprotectCallback() {

var Window = new SimpleWindow( 600, 400 );

Window.setTitle( "Protection of pages" );

var form = new QuickForm( twinkleprotect.callback.evaluate );

form.append( {

type: 'select',

name: 'category',

label: 'Type of protection: ',

event: twinkleprotect.callback.disabledefaults,

list: [

{

label: 'Full protection',

list: [

{ label: 'Generic', value: 'pp-protect' },

{ label: 'Dispute', selected: true, value: 'pp-dispute' },

{ label: 'Vandalism', value: 'pp-vandalism' },

{ label: 'High visible template', value: 'pp-template' },

{ label: 'User talk of banned user', value: 'pp-usertalk' }

]

},

{

label: 'Semi-protection',

list: [

{ label: 'Generic', value: 'pp-semi-protect' },

{ label: 'Vandalism', value: 'pp-semi-vandalism' },

{ label: 'High visible template', value: 'pp-semi-template' },

{ label: 'User talk of banned user', value: 'pp-semi-usertalk' },

{ label: 'Spambot target', value: 'pp-semi-spambot' }

]

},

{

label: 'Other',

list: [

{ label: 'Move-protection', value: 'pp-move' },

{ label: 'Unprotection', value: 'unprotect' }

]

}

]

} );

var flags = form.append( {

type: 'field',

label: 'Options'

} );

flags.append( {

type: 'checkbox',

list: [

{

name: 'noinclude',

label: 'Wrap ',

tooltip: 'Will wrap the template in tags, so that it won\'t transclude',

checked:(wgNamespaceNumber==10),

adminonly: true

},

{

name: 'small',

label: 'Iconify',

tooltip: 'Will use the |small=yes feature of the template, and only render it as a keylock',

adminonly: true

},

{

name: 'cascade',

label: 'Cascade protection',

tooltip: 'Cascade protection will protect all pages that is transcluded into said page'

}

]

} );

form.append( {

type: 'select',

name: 'expiry',

label: 'Expiration: ',

event: function(event) {

var value = event.target.value;

event.target.form.small.disabled = value != 'indefinite';

},

list: [

{ 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: 'indefinite', selected: true, value:'indefinite' }

]

} );

form.append( {

type: 'textarea',

name: 'reason',

label: 'Reason: '

} );

form.append( { type:'submit' } );

var result = form.render();

Window.setContent( result );

Window.display();

}

twinkleprotect.callback.disabledefaults = function twinkleprotectCallbackDisableDefaults(e) {

var root = e.target.form;

if( e.target.value == 'unprotect' ) {

root.noinclude.disabled = true;

root.cascade.disabled = true;

root.expiry.disabled = true;

root.small.disabled = true;

} else {

root.noinclude.disabled = false;

root.cascade.disabled = false;

root.expiry.disabled = false;

root.small.disabled = false;

}

if( /template/.test( e.target.value ) ) {

root.noinclude.checked = true;

root.expiry.disabled = true;

} else {

root.noinclude.checked = false;

}

}

twinkleprotect.callback.evaluate = function twinkleprotectCallbackEvaluate(e) {

var form = e.target;

var params = {

noinclude: form.noinclude.checked,

cascade: form.cascade.checked,

small: form.small.checked,

reason: form.reason.value,

expiry: form.expiry.value,

type: form.category.value

}

Status.init( form );

if( userIsInGroup( 'sysop' ) ) {

var edit, move, tag = params.type, reason;

switch( tag ) {

case 'pp-dispute':

edit = 'sysop';

move = 'sysop';

reason = 'Full protection: Dispute';

break;

case 'pp-vandalism':

edit = 'sysop';

move = 'sysop';

reason = 'Full protection: Vandalism';

break;

case 'pp-template':

edit = 'sysop';

move = 'sysop';

reason = 'Full protection: High-visible template';

break;

case 'pp-usertalk':

edit = 'sysop';

move = 'sysop';

reason = 'Full protection: User talk of banned user';

break;

case 'pp-protected':

edit = 'sysop';

move = 'sysop';

if( params.reason ) {

tag += '|reason=' + params.reason;

params.reason = undefined;

}

reason = 'Full protection';

break;

case 'pp-semi-vandalism':

edit = 'autoconfirmed';

move = 'autoconfirmed';

reason = 'Semi-protection: Vandalism';

break;

case 'pp-semi-usertalk':

edit = 'autoconfirmed';

move = 'autoconfirmed';

reason = 'Semi-protection: User talk of banned user';

break;

case 'pp-semi-template':

edit = 'autoconfirmed';

move = 'autoconfirmed';

reason = 'Semi-protection: High-visible template';

break;

case 'pp-semi-spambot':

edit = 'autoconfirmed';

move = 'autoconfirmed';

reason = 'Semi-protection: Spambot target';

break;

case 'pp-semi-protected':

edit = 'autoconfirmed';

move = 'autoconfirmed';

if( params.reason ) {

tag += '|reason=' + params.reason;

params.reason = undefined;

}

reason = 'Semi-protection';

break;

case 'pp-move':

edit = '';

move = 'sysop';

reason = 'Move-protection';

break;

case 'unprotect':

default:

edit = '';

move = '';

reason = 'Unprotection';

break;

}

if( params.reason ) {

reason += ', ' + params.reason;

}

reason += '.';

params.reason = reason;

params.tag = tag;

params.edit = edit;

params.move = move;

var query = {

'title': wgPageName,

'action': 'submit'

};

// Updating data for the action completed event

Wikipedia.actionCompleted.redirect = query['title'];

Wikipedia.actionCompleted.notice = "Done...";

var wikipedia_wiki = new Wikipedia.wiki( 'Tagging page', query, twinkleprotect.callbacks.sysop.taggingPage );

wikipedia_wiki.params = params;

wikipedia_wiki.get();

var query = {

'title': wgPageName,

'action': 'protect'

};

var wikipedia_wiki = new Wikipedia.wiki( 'Protecting page', query, twinkleprotect.callbacks.sysop.protectingPage );

wikipedia_wiki.params = params;

wikipedia_wiki.get();

} else {

var typename, reason;

switch( params.type ) {

case 'pp-dispute':

case 'pp-vandalism':

case 'pp-template':

case 'pp-usertalk':

case 'pp-protected':

typename = 'full protection';

break;

case 'pp-semi-vandalism':

case 'pp-semi-usertalk':

case 'pp-semi-template':

case 'pp-semi-spambot':

case 'pp-semi-protected':

typename = 'semi-protection';

break;

case 'pp-move':

typename = 'move-protection';

break;

case 'unprotect':

default:

typename = 'unprotection';

break;

}

switch( tag ) {

case 'pp-dispute':

reason = 'Full protection: Dispute';

break;

case 'pp-vandalism':

reason = 'Full protection: Vandalism';

break;

case 'pp-template':

reason = 'Full protection: High-visible template';

break;

case 'pp-usertalk':

reason = 'Full protection: User talk of banned user';

break;

case 'pp-protected':

reason = 'Full protection';

break;

case 'pp-semi-vandalism':

reason = 'Semi-protection: Vandalism';

break;

case 'pp-semi-usertalk':

reason = 'Semi-protection: User talk of banned user';

break;

case 'pp-semi-template':

reason = 'Semi-protection: High-visible template';

break;

case 'pp-semi-spambot':

reason = 'Semi-protection: Spambot target';

break;

case 'pp-semi-protected':

reason = 'Semi-protection';

break;

case 'pp-move':

reason = 'Move-protection';

break;

case 'unprotect':

default:

reason = 'Unprotection';

break;

}

if( params.reason ) {

reason += ', ' + params.reason;

}

reason += '.';

params.reason = reason;

params.typename = typename;

var query = {

'title': 'Wikipedia:Requests for page protection',

'action': 'submit'

};

// Updating data for the action completed event

Wikipedia.actionCompleted.redirect = query['title'];

Wikipedia.actionCompleted.notice = "Nomination completed, redirecting now to the discussion page";

var wikipedia_wiki = new Wikipedia.wiki( 'Requesting protection of page', query, twinkleprotect.callbacks.user );

wikipedia_wiki.params = params;

wikipedia_wiki.get();

}

}

twinkleprotect.callbacks = {

sysop: {

taggingPage: function( self ) {

var form = self.responseXML.getElementById( 'editform' );

var oldtag_re = /\s*(?:)?\s*\{\{\s*(pp-[^{}]*?|protected|(?:t|v|s|p-|usertalk-v|usertalk-s|sb|move)protected(?:2)?|protected template|privacy protection)\s*?\}\}\s*(?:<\/noinclude>)?\s*/gi;

var text = form.wpTextbox1.value;

text = text.replace( oldtag_re, '' );

if( self.params.type != 'unprotect' && self.params.expiry != 'indefinite' ) {

self.params.tag += '|expiry={{' + 'subst:#time:F j, Y|+' + self.params.expiry +'}}';

if( this.params.small ) {

self.params.tag += '|small=yes';

}

}

var summary;

if( self.params.type == 'unprotect' ) {

summary = 'removing protection template' + TwinkleConfig.summaryAd;

} else {

if( self.params.noinclude ) {

text = "\{\{" + self.params.tag + "\}\}" + text;

} else {

text = "\{\{" + self.params.tag + "\}\}\n" + text;

}

summary = "adding \{\{" + self.params.tag + "\}\}" + TwinkleConfig.summaryAd;

}

var postData = {

'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,

'wpWatchthis': form.wpWatchthis.checked ? '' : undefined,

'wpStarttime': form.wpStarttime.value,

'wpEdittime': form.wpEdittime.value,

'wpAutoSummary': form.wpAutoSummary.value,

'wpEditToken': form.wpEditToken.value,

'wpSummary': summary,

'wpTextbox1': text

};

self.post( postData );

},

protectingPage: function( self ){

var form = self.responseXML.getElementById( 'mw-Protect-Form' );

var postData = {

'wpEditToken': form.wpEditToken.value,

'mwProtectWatch': form.mwProtectWatch.checked ? '' : undefined,

'mwProtectCascade': self.params.cascade ? '' : undefined,

'mwProtect-expiry': self.params.expiry != 'indefinite' ? self.params.expiry : undefined,

'mwProtect-level-edit': self.params.edit,

'mwProtect-level-move': self.params.move,

'mwProtect-reason': self.params.reason + TwinkleConfig.protectionSummaryAd

};

self.post( postData );

}

},

user: function( self ) {

var form = self.responseXML.getElementById( 'editform' );

var text = form.wpTextbox1.value;

var rppRe = new RegExp( '====.*?' + RegExp.escape( wgPageName, true ) + '.*?====', 'm' );

var tag = rppRe.exec( text );

if( tag ) {

Status.warn( [ htmlNode( 'strong', tag[0] ) , " is alread placed on the page." ] )

return false;

}

var ns2tag = {

'0' : 'la',

'1' : 'lat',

'2' : 'lu',

'3' : 'lut',

'4' : 'lw',

'5' : 'lwt',

'6' : 'li',

'7' : 'lit',

'8' : 'lm',

'9' : 'lmt',

'10': 'lt',

'11': 'ltt',

'12': 'lh',

'13': 'lht',

'14': 'lc',

'15': 'lct',

'100': 'lp',

'101': 'lpt'

};

var newtag = '==== \{\{' + ns2tag[ wgNamespaceNumber ] + '|' + wgTitle + '\}\} ====' + "\n";

newtag += "" + self.params.typename + " ";

newtag += self.params.cascade ? " +cascade, " : '';

newtag += self.params.expiry != 'indefinite' ? " +expiry " + self.params.expiry + ", " : '';

newtag += self.params.reason + "\~\~\~\~";

if( self.params.type == 'un' ) {

var str = "==Current requests for unprotection==\n{{Wikipedia:Requests for page protection/URheading}}";

} else {

var str = "==Current requests for protection==\n{{Wikipedia:Requests for page protection/PRheading}}";

}

text = text.replace( str, str + "\n" + newtag + "\n" );

var postData = {

'wpMinoredit': undefined,

'wpWatchthis': form.wpWatchthis.checked ? '' : undefined,

'wpStarttime': form.wpStarttime.value,

'wpEdittime': form.wpEdittime.value,

'wpAutoSummary': form.wpAutoSummary.value,

'wpEditToken': form.wpEditToken.value,

'wpSummary': "Requesting " + typename + ' of ' + wgPageName.replace('_', ' ') + '.' + TwinkleConfig.summaryAd,

'wpTextbox1': text

};

self.post( postData );

}

}

//