User:Hillgentleman/twinkleprotect.js

出自維基百科,自由嘅百科全書
注意:儲存之後,你可能要兜過你嘅瀏覽器快取至睇到更改。Internet Explorer: 撳住Ctrl掣再撳重新整理掣。 Firefox: 撳住Shift掣再撳重新載入(又或者撳Ctrl-Shift-R)。 Google Chrome同埋Safari用戶就噉撳個重載掣。
// 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( mw.config.get('wgUserGroups', []).indexOf( 'sysop' ) > -1 ) {
		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 );
	}
}