User:F-402/twinklewarn.js

// If TwinkleConfig aint exist. if( typeof( TwinkleConfig ) == 'undefined' ) { TwinkleConfig = {}; }

/** 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 = true; }

/** 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.summaryAd (string) If ad should be added or not to summary, default TWINKLE */ if( typeof( TwinkleConfig.summaryAd ) == 'undefined' ) { TwinkleConfig.summaryAd = " using TW"; }

function twinklewarn { if( wgNamespaceNumber == 3 ) { addPortletLink( 'p-cactions', "javascript:twinklewarn.callback", "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:'Choose first the main group you want to issue, then choose an appropriate type 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:true } ); main_group.append( { type:'option', label:'Caution (2)', value:'level2' } ); main_group.append( { type:'option', label:'Warning (3)', value:'level3' } ); main_group.append( { type:'option', label:'Final warning (4)', value:'level4' } ); main_group.append( { type:'option', label:'Only warning (4im)', value:'level4im' } ); main_group.append( { type:'option', label:'Single issue notices', value:'singlenotice' } ); main_group.append( { type:'option', label:'Single issue warnings', value:'singlewarn' } ); if( userIsInGroup( 'sysop' ) ) { main_group.append( { type:'option', label:'Blocking', value:'block' } ); }

main_select.append( { type:'select', name:'sub_group' } ); //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 artice 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: { "uw-vandalism1": { label:"Vandalism", summary:"General note: Vandalism" },		"uw-test1": { label:"Editing tests", summary:"General note: Editing tests" },		"uw-delete1": { label:"Page blanking, removal of content or templates", summary:"General note: Page blanking, removal of content or templates" },		"uw-joke1": { label:"Using improper humor", summary:"General note: Using improper humor" },		"uw-create1": { label:"Creating inappropriate pages", summary:"General note: Creating inappropriate pages" },		"uw-upload1": { label:"Uploading inappropriate images", summary:"General note: Uploading inappropriate images" },		"uw-image1": { label:"Image-related vandalism", summary:"General note: Image-related vandalism" },		"uw-upv1": { label:"User page vandalism", summary:"General note: User page vandalism" },		"uw-spam1": { label:"Adding spam links", summary:"General note: Adding spam links" },		"uw-ad1": { label:"Using Wikipedia for advertising or promotion", summary:"General note: Using Wikipedia for advertising or promotion" },		"uw-npov1": { label:"Not adhering to neutral point of view", summary:"General note: Not adhering to neutral point of view" },		"uw-unsor1": { label:"Addition of unsourced material without proper citations", summary:"General note: Addition of unsourced material without proper citations" },		"uw-error1": { label:"Introducing deliberate factual errors", summary:"General note: Introducing deliberate factual errors" },		"uw-biog1": { label:"Adding unreferenced controversial information about living persons", summary:"General note: Adding unreferenced controversial information about living persons" },		"uw-defam1": { label:"Defamation not specifically directed", summary:"General note: Defamation not specifically directed" },		"uw-uncen1": { label:"Censorship of material", summary:"General note: Censorship of material" },		"uw-mos1": { label:"Manual of style", summary:"General note: Formatting, date, language, etc (Manual of style)" },		"uw-move1": { label:"Page moves", summary:"General note: Page moves" },		"uw-chat1": { label:"Using talk page as forum", summary:"General note: Using talk page as forum" },		"uw-tpv1": { label:"Refactoring others' talk page comments", summary:"General note: Refactoring others' talk page comments" },		"uw-afd1": { label:"Removing \{\{afd\}\} templates", summary:"General note: Removing \{\{afd\}\} templates" },		"uw-speedy1": { label:"Removing \{\{speedy deletion\}\} templates", summary:"General note: Removing \{\{speedy deletion\}\} templates" },		"uw-npa1": { label:"Personal attack directed at a specific editor", summary:"General note: Personal attack directed at a specific editor" },		"uw-agf1": { label:"Not assuming good faith", summary:"General note: Not assuming good faith" },		"uw-own1": { label:"Ownership of articles", summary:"General note: Ownership of articles" }	},	level2: { "uw-vandalism2": { label:"Vandalism", summary:"Caution: Vandalism" },		"uw-test2": { label:"Editing tests", summary:"Caution: Editing tests" },		"uw-delete2": { label:"Page blanking, removal of content or templates", summary:"Caution: Page blanking, removal of content or templates" },		"uw-joke2": { label:"Using improper humor", summary:"Caution: Using improper humor" },		"uw-create2": { label:"Creating inappropriate pages", summary:"Caution: Creating inappropriate pages" },		"uw-upload2": { label:"Uploading inappropriate images", summary:"Caution: Uploading inappropriate images" },		"uw-image2": { label:"Image-related vandalism", summary:"Caution: Image-related vandalism" },		"uw-upv2": { label:"User page vandalism", summary:"Caution: User page vandalism" },		"uw-spam2": { label:"Adding spam links", summary:"Caution: Adding spam links" },		"uw-ad2": { label:"Using Wikipedia for advertising or promotion", summary:"Caution: Using Wikipedia for advertising or promotion" },		"uw-npov2": { label:"Not adhering to neutral point of view", summary:"Caution: Not adhering to neutral point of view" },		"uw-unsor2": { label:"Addition of unsourced material without proper citations", summary:"Caution: Addition of unsourced material without proper citations" },		"uw-error2": { label:"Introducing deliberate factual errors", summary:"Caution: Introducing deliberate factual errors" },		"uw-biog2": { label:"Adding unreferenced controversial information about living persons", summary:"Caution: Adding unreferenced controversial information about living persons" },		"uw-defam2": { label:"Defamation not specifically directed", summary:"Caution: Defamation not specifically directed" },		"uw-uncen2": { label:"Censorship of material", summary:"Caution: Censorship of material" },		"uw-mos2": { label:"Manual of style", summary:"Caution: Formatting, date, language, etc (Manual of style)" },		"uw-move2": { label:"Page moves", summary:"Caution: Page moves" },		"uw-chat2": { label:"Using talk page as forum", summary:"Caution: Using talk page as forum" },		"uw-tpv2": { label:"Refactoring others' talk page comments", summary:"Caution: Refactoring others' talk page comments" },		"uw-afd2": { label:"Removing \{\{afd\}\} templates", summary:"Caution: Removing \{\{afd\}\} templates" },		"uw-speedy2": { label:"Removing \{\{speedy deletion\}\} templates", summary:"Caution: Removing \{\{speedy deletion\}\} templates" },		"uw-npa2": { label:"Personal attack directed at a specific editor", summary:"Caution: Personal attack directed at a specific editor" },		"uw-agf2": { label:"Not assuming good faith", summary:"Caution: Not assuming good faith" },		"uw-own2": { label:"Ownership of articles", summary:"Caution: Ownership of articles" }	},	level3: { "uw-vandalism3": { label:"Vandalism", summary:"Warning: Vandalism" },		"uw-test3": { label:"Editing tests", summary:"Warning: Editing tests" },		"uw-delete3": { label:"Page blanking, removal of content or templates", summary:"Warning: Page blanking, removal of content or templates" },		"uw-joke3": { label:"Using improper humor", summary:"Warning: Using improper humor" },		"uw-create3": { label:"Creating inappropriate pages", summary:"Warning: Creating inappropriate pages" },		"uw-upload3": { label:"Uploading inappropriate images", summary:"Warning: Uploading inappropriate images" },		"uw-image3": { label:"Image-related vandalism", summary:"Warning: Image-related vandalism" },		"uw-upv3": { label:"User page vandalism", summary:"Warning: User page vandalism" },		"uw-spam3": { label:"Adding spam links", summary:"Warning: Adding spam links" },		"uw-ad3": { label:"Using Wikipedia for advertising or promotion", summary:"Warning: Using Wikipedia for advertising or promotion" },		"uw-npov3": { label:"Not adhering to neutral point of view", summary:"Warning: Not adhering to neutral point of view" },		"uw-unsor3": { label:"Addition of unsourced material without proper citations", summary:"Warning: Addition of unsourced material without proper citations" },		"uw-error3": { label:"Introducing deliberate factual errors", summary:"Warning: Introducing deliberate factual errors" },		"uw-biog3": { label:"Adding unreferenced controversial information about living persons", summary:"Warning: Adding unreferenced controversial information about living persons" },		"uw-defam3": { label:"Defamation not specifically directed", summary:"Warning: Defamation not specifically directed" },		"uw-uncen3": { label:"Censorship of material", summary:"Warning: Censorship of material" },		"uw-mos3": { label:"Manual of style", summary:"Warning: Formatting, date, language, etc (Manual of style)" },		"uw-move3": { label:"Page moves", summary:"Warning: Page moves" },		"uw-chat3": { label:"Using talk page as forum", summary:"Warning: Using talk page as forum" },		"uw-tpv3": { label:"Refactoring others' talk page comments", summary:"Warning: Refactoring others' talk page comments" },		"uw-afd3": { label:"Removing \{\{afd\}\} templates", summary:"Warning: Removing \{\{afd\}\} templates" },		"uw-speedy3": { label:"Removing \{\{speedy deletion\}\} templates", summary:"Warning: Removing \{\{speedy deletion\}\} templates" },		"uw-npa3": { label:"Personal attack directed at a specific editor", summary:"Warning: Personal attack directed at a specific editor" },		"uw-agf3": { label:"Not assuming good faith", summary:"Warning: Not assuming good faith" },		"uw-own3": { label:"Ownership of articles", summary:"Warning: Ownership of articles" }	},	level4: { "uw-vandalism4": { label:"Vandalism", summary:"Final warning: Vandalism" },		"uw-delete4": { label:"Page blanking, removal of content or templates", summary:"Final warning: Page blanking, removal of content or templates" },		"uw-joke4": { label:"Using improper humor", summary:"Final warning: Using improper humor" },		"uw-create4": { label:"Creating inappropriate pages", summary:"Final warning: Creating inappropriate pages" },		"uw-upload4": { label:"Uploading inappropriate images", summary:"Final warning: Uploading inappropriate images" },		"uw-image4": { label:"Image-related vandalism", summary:"Final warning: Image-related vandalism" },		"uw-spam4": { label:"Adding spam links", summary:"Final warning: Adding spam links" },		"uw-ad4": { label:"Using Wikipedia for advertising or promotion", summary:"Final warning: Using Wikipedia for advertising or promotion" },		"uw-npov4": { label:"Not adhering to neutral point of view", summary:"Final warning: Not adhering to neutral point of view" },		"uw-biog4": { label:"Adding unreferenced controversial information about living persons", summary:"Final warning: Adding unreferenced controversial information about living persons" },		"uw-defam4": { label:"Defamation not specifically directed", summary:"Final warning: Defamation not specifically directed" },		"uw-move4": { label:"Page moves", summary:"Final warning: Page moves" },		"uw-chat4": { label:"Using talk page as forum", summary:"Final warning: Using talk page as forum" },		"uw-afd4": { label:"Removing \{\{afd\}\} templates", summary:"Final warning: Removing \{\{afd\}\} templates" },		"uw-speedy4": { label:"Removing \{\{speedy deletion\}\} templates", summary:"Final warning: Removing \{\{speedy deletion\}\} templates" },		"uw-npa4": { label:"Personal attack directed at a specific editor", summary:"Final warning: Personal attack directed at a specific editor" }	},	level4im: { "uw-vandalism4im": { label:"Vandalism", summary:"Only warning: Vandalism" },		"uw-delete4im": { label:"Page blanking, removal of content or templates", summary:"Only warning: Page blanking, removal of content or templates" },		"uw-create4im": { label:"Creating inappropriate pages", summary:"Only warning: Creating inappropriate pages" },		"uw-upload4im": { label:"Uploading inappropriate images", summary:"Only warning: Uploading inappropriate images" },		"uw-image4im": { label:"Image-related vandalism", summary:"Only warning: Image-related vandalism" },		"uw-spam4im": { label:"Adding spam links", summary:"Only warning: Adding spam links" },		"uw-defam4im": { label:"Defamation not specifically directed", summary:"Only warning: Defamation not specifically directed" },		"uw-move4im": { label:"Page moves", summary:"Only warning: Page moves" },		"uw-npa4im": { label:"Personal attack directed at a specific editor", summary:"Only warning: Personal attack directed at a specific editor" }	},	singlenotice: { "uw-2redirect": { label:"Creating double redirects through bad page moves", summary:"Notice: Creating double redirects through bad page moves" },		"uw-aiv": { label:"Bad AIV report", summary:"Notice: Bad AIV report" },		"uw-articlesig": { label:"Adding signatures to article space", summary:"Notice: Adding signatures to article space" },		"uw-autobiography": { label:"Creating autobiographies", summary:"Notice: Creating autobiographies" },		"uw-badcat": { label:"Adding incorrect categories", summary:"Notice: Adding incorrect categories" },		"uw-bite": { label:"\"Biting\" newcomers", summary:"Notice: \"Biting\" newcomers" },		"uw-c&pmove": { label:"Cut and paste moves", summary:"Notice: Cut and paste moves" },		"uw-coi": { label:"Conflict of Interest", summary:"Notice: Conflict of Interest" },		"uw-date": { label:"Unnecessarily changing date formats", summary:"Notice: Unnecessarily changing date formats" },		"uw-editsummary": { label:"Not using edit summary", summary:"Notice: Not using edit summary" },		"uw-english": { label:"Not communicating in English", summary:"Notice: Not communicating in English" },		"uw-italicize": { label:"Italicize books, films, albums, magazines, TV series, etc within articles", summary:"Notice: Italicize books, films, albums, magazines, TV series, etc within articles" },		"uw-lang": { label:"Unnecessarily changing between British and American English", summary:"Notice: Unnecessarily changing between British and American English" },		"uw-linking": { label:"For excessive addition of redlinks or repeated blue links", summary:"Notice: For excessive addition of redlinks or repeated blue links" },		"uw-minor": { label:"Incorrect use of minor edits check box", summary:"Notice: Incorrect use of minor edits check box" },		"uw-preview": { label:"Use preview button to avoid mistakes", summary:"Notice: Use preview button to avoid mistakes" },		"uw-selfrevert": { label:"Reverting self tests", summary:"Notice: Reverting self tests" },		"uw-subst": { label:"Remember to subst: templates", summary:"Notice: Remember to subst: templates" },		"uw-talkinarticle": { label:"Talk in article", summary:"Notice: Talk in article" },		"uw-tilde": { label:"Not signing posts", summary:"Notice: Not signing posts" },		"uw-uaa": { label:"Reporting of username to WP:UAA not accepted", summary:"Notice: Reporting of username to WP:UAA not accepted" },		"uw-warn": { label:"Warning vandals", summary:"Notice: Warning vandals" }	},	singlewarn: { "uw-3rr": { label:"Potentially violating the three revert rule", summary:"Warning: Potentially violating the three revert rule" },		"uw-attack": { label:"Creating attack pages", summary:"Warning: Creating attack pages" },		"uw-bv": { label:"Blatant vandalism", summary:"Warning: Blatant vandalism" },		"uw-canvass": { label:"Canvassing", summary:"Warning: Canvassing" },		"uw-copyright": { label:"Copyright violation", summary:"Warning: Copyright violation" },		"uw-copyright-link": { label:"Linking to copyrighted works violation", summary:"Warning: Linking to copyrighted works violation" },		"uw-hoax": { label:"Creating hoaxes", summary:"Warning: Creating hoaxes" },		"uw-legal": { label:"Making legal threats", summary:"Warning: Making legal threats" },		"uw-longterm": { label:"Long term pattern of vandalism", summary:"Warning: Long term pattern of vandalism" },		"uw-multipleIPs": { label:"Usage of multiple IPs", summary:"Warning: Usage of multiple IPs" },		"uw-pinfo": { label:"Personal info", summary:"Warning: Personal info" },		"uw-redirect": { label:"Creating malicious redirects", summary:"Warning: Creating malicious redirects" }	},	block: { "uw-block1": { 'label':"Block level 1", 'summary':"You have been temporarily blocked" },		"uw-block2": { 'label':"Block level 2", 'summary':"You have been blocked" },		"uw-block3": { 'label':"Block level 3", 'summary':"You have been indefinitely blocked" },		"uw-ablock": { 'label':"Anonymous block", 'summary':"Your IP address has been blocked" },		"uw-sblock": { 'label':"Spam block", 'summary':"You have been blocked for spamming" },		"uw-vblock": { 'label':"Vandalism", 'summary':"You have been blocked for vandalism" },		"uw-dblock": { 'label':"Delete block", 'summary':"You have been blocked for deletion" },		"uw-3block": { 'label':"3RR block", 'summary':"You have been blocked for violation of the 3RR rule" },		"uw-ublock": { 'label':"Username block", 'summary':"You have been blocked for violation of the username policy" }	} };

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

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( "Will you still 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( "Will you still add a warning/notice?" ) ) {					self.statelem.info( 'aborted per user request' ); return; }		}

var mainheaderRe = /==+\\s*Warnings\\s*==+/; var headerRe = new RegExp( "^==+\\s*" + date.getUTCMonthName + "\\s+" + date.getUTCFullYear + "\\s*==+", 'm' );

if( text.length > 0 ) { text += "\n"; }

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.main_group == 'block' ) { var time = null; 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; }

text += "\{\{subst:" + self.params.sub_group + time + (self.params.reason ? '|reason=' + self.params.reason : '' ) + "\}\}"; } else { text += "\{\{subst:" + self.params.sub_group + ( self.params.article ? '|' + self.params.article :  ) + "\}\}" + (self.params.reason ? " " + self.params.reason + "'' ": ' ' ) + "\~\~\~\~"; }

if ( TwinkleConfig.showSharedIPNotice && isIPAddress( 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 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': TwinkleConfig.watchWarnings ? 1 : form.wpWatchthis.checked ? 1 : undefined, 'wpStarttime': form.wpStarttime.value, 'wpEdittime': form.wpEdittime.value, 'wpAutoSummary': form.wpAutoSummary.value, 'wpEditToken': form.wpEditToken.value, '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': wgPageName, 'action': 'submit' };	Wikipedia.actionCompleted.redirect = wgPageName; Wikipedia.actionCompleted.notice = "Warning complete, reloading talk page in some seconds"; var wikipedia_wiki = new Wikipedia.wiki( 'User talk page modification', query, twinklewarn.callbacks.main ); wikipedia_wiki.params = params; wikipedia_wiki.get; }