Jump to content

User:Timotab/twinkleprotect.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// If TwinkleConfig aint exist.
if( typeof( TwinkleConfig ) == 'undefined' ) {
	TwinkleConfig = function() {};
}
 
/**
 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:TWINKLE|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:TWINKLE|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 <noinclude>',
					tooltip: 'Will wrap the template in <noinclude> 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*(?:<noinclude>)?\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 = "<noinclude>\{\{" + self.params.tag + "\}\}</noinclude>" + 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 );
	}
}
// </nowiki>