User:Kanonkas/warn.js

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
// If TwinkleConfig aint exist.
if( typeof( TwinkleConfig ) == 'undefined' ) {
	TwinkleConfig = {};
}

var twinkleConfigExists = window.twinkleConfigExists || false;

/**
 TwinkleConfig.defaultGroup (int)
 if true, watch the page which has been dispatched an warning or notice, if false, default applies
 */
if( typeof( TwinkleConfig.defaultWarningGroup ) == 'undefined' ) {
	TwinkleConfig.defaultWarningGroup = 1;
}
 
/**
 TwinkleConfig.showSharedIPNotice may take arguments:
 true: to show shared ip notice if an IP address
 false: to not print the notice
 */
if( typeof( TwinkleConfig.showSharedIPNotice ) == 'undefined' ) {
	TwinkleConfig.showSharedIPNotice = false;
}
 
/**
 TwinkleConfig.watchWarnings (boolean)
 if true, watch the page which has been dispatched an warning or notice, if false, default applies
 */
if( typeof( TwinkleConfig.watchWarnings ) == 'undefined' ) {
	TwinkleConfig.watchWarnings = true;
}
 
/**
 TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
 if true, blank the talk page when issuing an indef block notice
 */
if( typeof( TwinkleConfig.blankTalkpageOnIndefBlock ) == 'undefined' ) {
	TwinkleConfig.blankTalkpageOnIndefBlock = false;
}
 
/**
 TwinkleConfig.summaryAd (string)
 If ad should be added or not to summary, default [[COM:TWINKLE|Twinkle]]
 */
if( typeof( TwinkleConfig.summaryAd ) == 'undefined' ) {
	TwinkleConfig.summaryAd = " using [[COM:TWINKLE|Twinkle]]";
}
 
function twinklewarn() {
	if( mw.config.get('wgNamespaceNumber') == 3 ) {
		mw.util.addPortletLink( 'p-cactions', (twinkleConfigExists ? "javascript:twinklewarn.callback()" : 'javascript:alert("Your account is too new to use Twinkle.");'), "Warn", "tw-warn", "Warn/Notify user", "");
	}
}
addOnloadHook(twinklewarn);
 
twinklewarn.callback = function twinklewarnCallback() {
	var Window = new SimpleWindow( 600, 400 );
	Window.setTitle( "Warn/Notify user" ); 
	var form = new QuickForm( twinklewarn.callback.evaluate );
 
	var main_select = form.append( {
			type:'field',
			label:'Choose type of warning/notice to issue', 
			tooltip:'First choose a main warning group, then the specific warning to issue.'
		} );
 
	var main_group = main_select.append( {
			type:'select',
			name:'main_group',
			event:twinklewarn.callback.change_category 
		} );
 
	main_group.append( { type:'option', label:'General Note (1)', value:'level1', selected: ( TwinkleConfig.defaultWarningGroup == 1 || TwinkleConfig.defaultWarningGroup < 1 || ( userIsInGroup( 'sysop' ) ? TwinkleConfig.defaultWarningGroup > 5 : TwinkleConfig.defaultWarningGroup > 4 ) ) } );
	main_group.append( { type:'option', label:'Caution (2)', value:'level2', selected: ( TwinkleConfig.defaultWarningGroup == 2 ) } );
	main_group.append( { type:'option', label:'Warning (3)', value:'level3', selected: ( TwinkleConfig.defaultWarningGroup == 3 ) } );
	main_group.append( { type:'option', label:'Final warning (4)', value:'level4', selected: ( TwinkleConfig.defaultWarningGroup == 4 ) } );
	if( userIsInGroup( 'sysop' ) ) {
		main_group.append( { type:'option', label:'Blocking', value:'block', selected: ( TwinkleConfig.defaultWarningGroup == 5 ) } );
	}
 
	main_select.append( { type:'select', name:'sub_group', event:twinklewarn.callback.change_subcategory } ); //Will be empty to begin with.
 
	form.append( { 
			type:'input',
			name:'article',
			label:'Linked article',
			value:( QueryString.exists( 'vanarticle' ) ? QueryString.get( 'vanarticle' ) : '' ),
			tooltip:'An article might be linked to the notice, either it was a revert to said article that dispatched this notice. Leave empty for no article to be linked'
		} );
 
 
	var more = form.append( { type:'field', label:'Fill in an optional reason and hit \"Submit\"' } );
	more.append( { type:'textarea', label:'More:', name:'reason', tooltip:'Perhaps a reason, or that a more detailed notice must be appended' } );
	more.append( { type:'submit', label:'Submit' } );
	var result = form.render();
	Window.setContent( result );
	Window.display();
	result.main_group.root = result;
 
	// We must init the first choice (General Note);
	var evt = document.createEvent( "Event" );
	evt.initEvent( 'change', true, true );
	result.main_group.dispatchEvent( evt );
 
}
 
// This is all the messages that might be dispatched by the code
twinklewarn.messages = {
	level1: {

		"Test": { 
			label:"Test", 
			summary:"General note: Please test in the sandbox" 
		},
		"Be civil": { 
			label:"Civil", 
			summary:"General note: Please be civil" 
		},
		"Project scope": { 
			label:"Out of project scope edits", 
			summary:"General note: Project scope" 
},
		"Dont remove nsd or nld": { 
                        label:"Page blanking, removal of content or templates", 
                        summary:"General note: Removing no license, or no source" 
			
},
		"No fair use": { 
                        label:"Fair use content", 
                        summary:"General note: Uploading fair use content" 
},
		"Image source": { 
                        label:"Media source link", 
                        summary:"General note: Requesting for source information" 
		}
	},
	level2: {
		"Test2": { 
			label:"Test", 
			summary:"Caution: Test" 

		
               },
		"Derivativenote": { 
                        label:"Derivative notice", 
                        summary:"General note: Uploading unfree derivative content" 

		},
		"Copyvionote": { 
			label:"Copyright violation", 
			summary:"Caution: Editing tests" 
		},
		"dont recreate": { 
			label:"Recreating deleted content", 
			summary:"Caution: Don't recreate deleted content" 
		},
		"uw-delete2": { 
			label:"Page blanking, removal of content or templates", 
			summary:"Caution: Page blanking, removal of content or templates" 
		}
	},
	level3: {
		"Test3": { 
			label:"Vandalism", 
			summary:"Warning: Vandalism" 
		},
		"Test3": { 
			label:"Editing tests", 
			summary:"Warning: Editing tests" 
		}
	},
	level4: {
	  	"Attackimage": { 
			label:"Personal attack", 
			summary:"Final warning: Note regarding a attack image" 
                },
		"Attackpage": { 
			label:"Personal attack", 
			summary:"Final warning: Note regarding a personal attack page" 
                },
		"Test4": { 
			label:"Vandalism", 
			summary:"Final warning: Vandalism"
	        },
		"Be civil final": { 
			label:"Civil", 
			summary:"Final warning: Note regarding civility" 
		},
		"End of copyvios": { 
			label:"Uploading copyrighted content several times", 
			summary:"Final warning: Uploading copyrighted content" 
                }
        },
	block: {
		"Anonblock": {
			'label':"Block level 1",
			'summary':"You have been temporarily blocked by an [[Commons:Administrators|administrator]]"
		},
		"Blocked User": {
			'label':"Block level 2",
			'summary':"You have been blocked by an [[Commons:Administrators|administrator]]"
		},
		"Blocked proxy": {
			'label':"Block level 3",
			'summary':"You have been blocked by an [[Commons:Administrators|administrator]]"
		},
		"Copyviouploadindefblock": {
			'label':"Block level 2",
			'summary':"You have been indefinitely blocked by an [[Commons:Administrators|administrator]]"
		},
		"Username block": {
			'label':"You have been indefinite blocked by an [[Commons:Administrators|administrator]]",
			'summary':"You have been indefinitely blocked"
		}
	}
};


twinklewarn.callback.change_category = function twinklewarnCallbackChangeCategory(e) {
	var value = e.target.value;
	var sub_group = e.target.root.sub_group;
	var messages = twinklewarn.messages[ value ];
	sub_group.main_group = value;
	var old_subvalue = sub_group.value;
	if( old_subvalue ) {
		old_subvalue = old_subvalue.replace(/\d*(im)?$/, '' );
		var old_subvalue_re = new RegExp( RegExp.escape( old_subvalue ) + "(\\d*(?:im)?)$" );
	}
 
	while( sub_group.hasChildNodes() ){
		sub_group.removeChild( sub_group.firstChild );
	}
 
	for( var i in messages ) {
		var selected = false;
		if( old_subvalue && old_subvalue_re.test( i ) ) {
			selected = true;
		}
		var elem = new QuickForm.element( { type:'option', label:"[" + i + "]: " + messages[i].label, value:i, selected: selected } );
 
		sub_group.appendChild( elem.render() );
	}
 
	if( value == 'block' ) {
		var more = new QuickForm.element( {
				type: 'input',
				name: 'block_timer',
				label: 'Period of blocking: ',
				tooltip: 'The period the blocking is due for, for example 24 hours, 2 weeks, indefinite etc...'
			} );
		e.target.root.insertBefore( more.render(), e.target.root.lastChild );
		e.target.root.article.disabled = true;
	} else if( e.target.root.block_timer ) {
		e.target.root.removeChild( e.target.root.block_timer.parentNode );
		e.target.root.article.disabled = false;
		e.target.root.reason.disabled = false;
	}
}
 
twinklewarn.callback.change_subcategory = function twinklewarnCallbackChangeSubcategory(e) {
	var value = e.target.value;
	var main_group = e.target.main_group;
 
	if( main_group == 'block' ) {
		if( value == 'uw-block3' || value == 'uw-spamublock' || value == 'uw-soablock' || value == 'uw-vaublock' || value == 'uw-voablock' || value == 'uw-ublock' || value == 'uw-uhblock' || value == 'uw-lblock' || value == 'anonblock' || value == 'schoolblock' ) {
			e.target.form.block_timer.disabled = true;
		} else if( e.target.form.block_timer.disabled ) {
			e.target.form.block_timer.disabled = false;
		}
 
		if( value == 'uw-3block' || value == 'uw-afblock' || value == 'uw-ewblock' ) {
			e.target.form.article.disabled = false;
		} else if ( value == 'anonblock' || value == 'schoolblock' ) {
			e.target.form.article.disabled = true;
		} else if( !e.target.form.article.disabled ) {
			e.target.form.article.disabled = true;
		}
 
		if( value == 'uw-block1' || value == 'uw-block2' || value == 'uw-block3' || value == 'uw-ablock' || value == 'anonblock' || value == 'schoolblock' ) {
			e.target.form.reason.disabled = false;
		} else if( !e.target.form.reason.disabled ) {
			e.target.form.reason.disabled = true;
		}
	}
}
 
twinklewarn.callbacks = {
	main: function( self ) {
		var form = self.responseXML.getElementById( 'editform' );
		var text = form.wpTextbox1.value;
 
		var history_re = /\<\!\-\-\ Template\:(uw\-.*?)\ \-\-\>.*?(\d{1,2}:\d{1,2}, \d{1,2} \w+ \d{4}) \(UTC\)/g;
		var history = {};
		var latest = { date:new Date( 0 ), type:'' };
 
		var current;
 
 
		while( ( current = history_re.exec( text ) ) != undefined ) {
			var current_date = new Date( current[2] + ' UTC' );
			if( !( current[1] in history ) ||  history[ current[1] ] < current_date ) {
				history[ current[1] ] = current_date;
			}
			if( current_date > latest.date ) {
				latest.date = current_date;
				latest.type = current[1];
			}
		}
 
		var date = new Date();
 
		if( self.params.sub_group in history ) {
			var temp_time = new Date( history[ self.params.sub_group ] );
			temp_time.setUTCHours( temp_time.getUTCHours() + 24 );
 
			if( temp_time > date ) {
				Status.info( 'Info', "an identical " + self.params.sub_group + " has been issued in the last 24 hours" );
				if( !confirm( "Would you still like to add a warning/notice?" ) ) {
					self.statelem.info( 'aborted per user request' );
					return;
				}
			}
		}
 
		latest.date.setUTCMinutes( latest.date.getUTCMinutes() + 1 ); // after long debate, one minute is max
 
		if( latest.date > date ) {
			Status.info('Info', "a " + latest.type + " has been issued in the last minute" );
				if( !confirm( "Would you still like to add a warning/notice?" ) ) {
					self.statelem.info( 'aborted per user request' );
					return;
				}
		}
 
 
 
		var mainheaderRe = /==+\\s*Warnings\\s*==+/;
		var headerRe = new RegExp( "^==+\\s*(?:" + date.getUTCMonthName() + '|' + date.getUTCMonthNameAbbrev() +  ")\\s+" + date.getUTCFullYear() + "\\s*==+", 'm' );
 
		if( text.length > 0 ) {
			text += "\n";
		}
 
		if( self.params.main_group == 'block' ) {
			var article = '', time = null;
 
			if( TwinkleConfig.blankTalkpageOnIndefBlock && ( /indef|\*|max/.exec( self.params.block_timer ) || self.params.sub_group == 'uw-block3' || self.params.sub_group == 'uw-spamublock' || self.params.sub_group == 'uw-soablock' || self.params.sub_group == 'uw-vaublock' || self.params.sub_group == 'uw-voablock' || self.params.sub_group == 'uw-ublock' || self.params.sub_group == 'uw-uhblock' || self.params.sub_group == 'uw-lblock' ) ) {
				Status.info( 'Info', 'Blanking talk page per preferences and createing a new level 2 heading for the date' );
				text = "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
			} else if( !headerRe.exec( text ) ) {
				Status.info( 'Info', 'Will create a new level 2 heading for the date, as none was found for this month' );
				text += "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
			}
 
			if( ( self.params.sub_group == 'uw-3block' || self.params.sub_group == 'uw-ewblock' ) && self.params.article ) {
				article = '|1=' + self.params.article;
			}
			else self.params.article = ""; //Unless an article-related block messages is placed, don't mention the article in the edit summary - it probably was filled in by mistake. [[WP:TW/BUGS#273]]
 
			if( /te?mp|^\s*$|min/.exec( self.params.block_timer ) ) {
				time = '';
			} else if( /indef|\*|max/.exec( self.params.block_timer ) ) {
				time = '|indef=yes';
			} else {
				time = '|time=' + self.params.block_timer;
			}
 
			if( self.params.sub_group == 'schoolblock' || self.params.sub_group == 'anonblock' ) {
				text += "\{\{" + self.params.sub_group + (self.params.reason ? '|1=' + self.params.reason : '' ) + "|sig=\~\~\~\~\}\}";
			} else {
				text += "\{\{subst:" + self.params.sub_group + article + time + (self.params.reason ? '|reason=' + self.params.reason : '' ) + "|sig=true\}\}";				
			}
		} else {
			if( !headerRe.exec( text ) ) {
				Status.info( 'Info', 'Will create a new level 2 heading for the date, as none was found for this month' );
				text += "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
			}
 
			if( self.params.sub_group == 'uw-username' ) {
				// ugly hack
				text += "\{\{subst:" + self.params.sub_group + ( self.params.reason ? '|1=' + self.params.reason : '' ) + "\}\} \~\~\~\~";
			} else {
				text += "\{\{subst:" + self.params.sub_group + ( self.params.article ? '|1=' + self.params.article : '' ) + "\}\}" + (self.params.reason ? " ''" + self.params.reason + "'' ": ' ' ) + "\~\~\~\~";
			}
		}
 
 
 
 
 
		if ( TwinkleConfig.showSharedIPNotice && isIPAddress( mw.config.get('wgTitle') ) ) {
			Status.info( 'Info', 'Adding a shared ip notice' );
			switch( QueryString.get( 'type' ) ) {
			case 'vand':
				text +=  "\n:''If this is a shared [[IP address]], and you didn't make any [[Commons:Vandalism|unconstructive]] edits, consider creating an account for yourself so you can avoid further irrelevant warnings.'' ";
				break;
			default:
				text +=  "\n:''If this is a shared [[IP address]], and you didn't make the edit, consider creating an account for yourself so you can avoid further irrelevant notices.'' ";
				break;
			}
		}
		var postData = {
			'wpMinoredit': form.wpMinoredit.checked ? 1 : undefined,
			'wpWatchthis': (form.wpWatchthis.checked || TwinkleConfig.watchWarnings) ? 1 : undefined,
			'wpStarttime': form.wpStarttime.value,
			'wpEdittime': form.wpEdittime.value,
			'wpAutoSummary': form.wpAutoSummary.value,
			'wpEditToken': form.wpEditToken.value,
			'wpSection': '',
			'wpSummary': twinklewarn.messages[self.params.main_group][self.params.sub_group].summary + ( self.params.article ? ' on [[' + self.params.article + ']]'  : '' ) + '.' + TwinkleConfig.summaryAd,
			'wpTextbox1': text
		};
 
		self.post( postData );
	}
}
 
twinklewarn.callback.evaluate = function twinklewarnCallbackEvaluate(e) {
 
	// First, grab all the values provided by the form
 
	var params = {
		reason: e.target.reason.value,
		main_group: e.target.main_group.value,
		sub_group: e.target.sub_group.value,
		article: e.target.article.value.replace( /^(Image|Category):/i, ':$1:' ),
		block_timer: e.target.block_timer ? e.target.block_timer.value : null
	}
 
	Status.init( e.target );
 
	var query = { 
		'title': mw.config.get('wgPageName'), 
		'action': 'submit'
	};
	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "Warning complete, reloading talk page in a few seconds";
	var wikipedia_wiki = new Wikipedia.wiki( 'User talk page modification', query, twinklewarn.callbacks.main );
	wikipedia_wiki.params = params;
	wikipedia_wiki.get();
}