Cannabis Ruderalis

Content deleted Content added
UAA instead of RFCU
Adding functionallity to report suspected sockpuppets (OMGWTFBBQ what have I done)
Line 21: Line 21:


/**
/**
TwinkleConfig.confirmUsernameToAIV (boolean)
TwinkleConfig.confirmUsernameToAIV (boolean) (deprecated)
Defines if a username reports to AIV should be confirmed before sent.
Defines if a username reports to AIV should be confirmed before sent.
*/
*/
Line 49: Line 49:
return result;
return result;
}
}

function getTexts( nodelist ) {
if( !( nodelist instanceof NodeList ) ) {
throw nodelist + " not instance of NodeList";
}
var result = [];
for(var i in nodelist ) {
if( nodelist[i].type == 'text' && nodelist[i].value != '' ) {
result.push( nodelist[i].value );
}
}
return result;
}

function num2order( num ) {
switch( num ) {
case 1: return '';
case 2: return '2nd';
case 3: return '3rd';
default: return num + 'th';
}
}

function createOption( data ) {
function createOption( data ) {
var option = document.createElement( 'option' );
var option = document.createElement( 'option' );
Line 102: Line 125:
function createSimpleCheckbox( label, name, id ) {
function createSimpleCheckbox( label, name, id ) {
return createInput( {
return createInput( {
id:id,
id:id,
name:name,
name:name,
value:label,
value:label,
text:label + ' ',
text:label + ' ',
type:'checkbox',
type:'checkbox',
elem:'div'
elem:'div'


} );
} );
Line 117: Line 140:
return optgroup;
return optgroup;
}
}


addOnloadHook( twinkleARVBase );
addOnloadHook( twinkleARVBase );
function twinkleARVBase(){
function twinkleARVBase(){
Line 140: Line 165:


addPortletLink( chooseBox( 'tw-arv', TwinkleConfig.toolboxButtons ), "javascript:twinklearv(\"" + username + "\")", "arv", "tw-arv", name, title );
addPortletLink( chooseBox( 'tw-arv', TwinkleConfig.toolboxButtons ), "javascript:twinklearv(\"" + username + "\")", "arv", "tw-arv", name, title );
/*
addPortletLink( 'ca-report', 'javascript:twinklearv( "' + username + '", "sock" )' , 'sock puppet' , 'ca-report-sock', title + ' (Account is a sock puppet account)', '' );
if( !isIPAddress( username ) ) {
addPortletLink( 'ca-report', 'javascript:twinklearv( "' + username + '", "username" )' , 'username' , 'ca-report-username', title + ' (inflammatory username)', '' );
}
*/
}
}
}
}
Line 353: Line 372:
case 'sock':
case 'sock':
var legend = document.createElement( 'legend' );
var legend = document.createElement( 'legend' );
legend.appendChild( document.createTextNode( 'Not implemented' ) );
legend.appendChild( document.createTextNode( 'Report Suspected Sockpuppeter' ) );
twinklearv.choices.appendChild( legend );


var div = document.createElement( 'legend' );
twinklearv.socks = document.createElement( 'fieldset' );
twinklearv.socks.appendChild( document.createElement( 'legend' ) ).appendChild( document.createTextNode( 'Suspected Sockpuppets' ) );
div.style.color = 'red';
twinklearv.nbrsocks = 1;
div.style.fontSize = 'large';
div.style.fontWeight = 'bold';
div.appendChild( document.createTextNode( 'This function is not yet implemented' ) );


twinklearv.choices.appendChild( legend );
twinklearv.socks.appendChild( createInput( {
id:'twArvSockpuppet1',
twinklearv.choices.appendChild( div );
value:'',
text:'Sockpuppet 1 ',
type:'text',
name:'sockpuppet',
size:80,
elem:'div'
} ) );
twinklearv.choices.appendChild( twinklearv.socks );
twinklearv.socks.appendChild( createInput( {
id:'twArvMoreSocks',
value: 'Add more socks',
name:'moresocks',
type:'button',
elem:'div',
event: function(e) {
twinklearv.nbrsocks++;
twinklearv.socks.insertBefore(
createInput( {
id:'twArvSockpuppet' + twinklearv.nbrsocks,
value:'',
text:'Sockpuppet ' + twinklearv.nbrsocks + ' ',
type:'text',
name:'sockpuppet',
size:80,
elem:'div'
} ),
twinklearv.socks.lastChild
);


}
} ) );
twinklearv.choices.appendChild( document.createElement( 'h5' ) ).appendChild( document.createTextNode( 'Evidence' ) );
var textarea = twinklearv.choices.appendChild( document.createElement( 'textarea' ) );
textarea.setAttribute( 'name', 'evidence' );
textarea.setAttribute( 'id', 'twArvEvidence' );
textarea.setAttribute( 'rows', '5' );
textarea.setAttribute( 'cols', '40' );
textarea.setAttribute( 'style', 'width: 90% !important;' );
twinklearv.choices.appendChild( createInput( {
id:'twArvSubmit',
value: 'Submit',
name:'submit',
type:'submit',
elem:'div'
} ) );
break;
break;
}
}
Line 371: Line 433:
twinklearv.evaluate = function(e) {
twinklearv.evaluate = function(e) {
twinklearv.reason = "";
twinklearv.reason = "";
var comment = twinklearv.form.reason.value;
if( twinklearv.form.reason ) {
comment = twinklearv.form.reason.value;
}
switch( twinklearv.form.main_choices.value ) {
switch( twinklearv.form.main_choices.value ) {
default:
default:
Line 529: Line 593:
}
}
twinklearv.xmlhttp.send( null );
twinklearv.xmlhttp.send( null );
break;
case 'sock':
twinklearv.sockpuppets = getTexts( twinklearv.form.sockpuppet );
twinklearv.evidence = twinklearv.form.evidence.value;
Status.init( twinklearv.form );


Status.status( 'Grabbing data of eventual previous reports' );


var xmlhttp = sajax_init_object();
break;
xmlhttp.query = {
}
'title': 'Special:Prefixindex',
}
'from': 'Suspected sock puppets/' + twinklearv.uid,
'namespace': 4
};
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
xmlhttp.onload = function() {
var a_tags = this.responseXML.getElementsByTagName('a');
var re = new RegExp( RegExp.escape( 'Suspected sock puppets/' + twinklearv.uid ) );
var number = 0;
for( var i in a_tags ) {
var title = a_tags[i].title;
if( re.exec( title ) ) {
var n = /\(\s*(\d+)(?:th|nd|rd|st)\s*\)\s*$/.exec( title );
if( n && n[1] > number ) {
number = n[1];
} else if( number == 0 ) {
number = 1;
}
}
}

if( number == 0 ) {
twinklearv.numbering = number = '';
} else {
number = num2order( parseInt( number ) + 1);
twinklearv.numbering = ' (' + number + ')';
}

Status.status( 'Creating report page [[Wikipedia:Suspected sock puppets/' + twinklearv.uid + twinklearv.numbering + ']]');

var xmlhttp = sajax_init_object();
xmlhttp.query = {
'title': 'Wikipedia:Suspected sock puppets/' + twinklearv.uid + twinklearv.numbering,
'action': 'submit'
};
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
xmlhttp.onload = function() {
var form = this.responseXML.getElementById('editform');
var text =
"===[[User:" + twinklearv.uid + "]]===\n" +
";Suspected sockpuppeteer\n" +
":\{\{user5|" + twinklearv.uid + "\}\}\n\n" +
";Suspected sockpuppets\n" +
twinklearv.sockpuppets.map( function(v) { return ":\{\{user5|" + v + "\}\}" } ).join( "\n" ) + "\n\n" +
";Report submission by\n" +
"\~\~\~\~\n\n" +
";Evidence\n" +
twinklearv.evidence + "\n\n" +
";Comments\n\n\n" +
";Conclusions\n\n\n" +
"----\n</div>\n";


var postData = {
'wpMinoredit': form.wpMinoredit.checked,
'wpWatchthis': form.wpWatchthis.checked,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSummary': "Creating report for [[User:" + twinklearv.uid + ']].' + TwinkleConfig.summaryAd,
'wpTextbox1': text
};
var xmlhttp = sajax_init_object();
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true);
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xmlhttp.onload = function() { Status.info( 'Report created' ) }
xmlhttp.send( QueryString.create( postData ) );
}
xmlhttp.send( null );

Status.status( 'Linking report to open cases');
var xmlhttp = sajax_init_object();
xmlhttp.query = {
'title': 'Wikipedia:Suspected sock puppets',
'section': 4,
'action': 'submit'
};
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
xmlhttp.onload = function() {
var form = this.responseXML.getElementById('editform');
text = form.wpTextbox1.value.replace( /(<!-- Add .*? list\. -->)/, "$1\n\{\{Wikipedia:Suspected sock puppets/" + twinklearv.uid + twinklearv.numbering + "\}\}");
var postData = {
'wpMinoredit': form.wpMinoredit.checked,
'wpWatchthis': form.wpWatchthis.checked,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSummary': "Adding report for [[User:" + twinklearv.uid + ']].' + TwinkleConfig.summaryAd,
'wpTextbox1': text
};
var xmlhttp = sajax_init_object();
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true );
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xmlhttp.onload = function() { Status.info( 'Added to open cases' ) }
xmlhttp.send( QueryString.create( postData ) );
}
xmlhttp.send( null );

Status.status( 'Notifying suspected sockpuppeter');
var xmlhttp = sajax_init_object();
xmlhttp.query = {
'title': 'User:' + twinklearv.uid,
'action': 'submit'
};
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
xmlhttp.onload = function() {
var form = this.responseXML.getElementById('editform');
text = form.wpTextbox1.value;
var postData = {
'wpMinoredit': form.wpMinoredit.checked,
'wpWatchthis': form.wpWatchthis.checked,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSummary': "Notifying about suspicion of sockpuppertering." + TwinkleConfig.summaryAd,
'wpTextbox1': text + "\n\{\{subst:socksuspectnotice|1=" + twinklearv.uid + twinklearv.numbering + "\}\} \~\~\~\~"
};
var xmlhttp = sajax_init_object();
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true);
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xmlhttp.onload = function() { Status.info( 'Suspected sockpuppeter notified' ) }
xmlhttp.send( QueryString.create( postData ) );
}
xmlhttp.send( null );

Status.status( 'Tagging suspected socks');
for( var i in twinklearv.sockpuppets ) {
var xmlhttp = sajax_init_object();
xmlhttp.current = twinklearv.sockpuppets[i];
xmlhttp.query = {
'title': 'User:' + xmlhttp.current,
'action': 'submit'
};
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
xmlhttp.onload = function() {
var form = this.responseXML.getElementById('editform');
text = form.wpTextbox1.value;
if( /{{sockpuppet/.exec( text ) ) { // already marked as a sock, just ignore then
return;
}
var postData = {
'wpMinoredit': form.wpMinoredit.checked,
'wpWatchthis': form.wpWatchthis.checked,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSummary': "Adding supsected sockpuppet tag for suspected sockpuppeter [[User:" + twinklearv.uid + ']].' + TwinkleConfig.summaryAd,
'wpTextbox1': "\{\{subst:socksuspect|1=" + twinklearv.uid + "\}\}\n" + text
};
var xmlhttp = sajax_init_object();
xmlhttp.current = this.current;
xmlhttp.overrideMimeType('text/xml');
xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true);
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xmlhttp.onload = function() { Status.info( 'Added tag for ' + this.current ) }
xmlhttp.send( QueryString.create( postData ) );
}
xmlhttp.send( null );

}

}
xmlhttp.send( null );
}
}

Revision as of 20:56, 3 May 2007

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

/**
 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.markAIVReportAsMinor (boolean)
 Defines if a reports to AIV should be marked as minor, if false, default is applied as per preference.
 */
if( typeof( TwinkleConfig.markAIVReportAsMinor ) == 'undefined' ) {
	TwinkleConfig.markAIVReportAsMinor = true;
}

/**
 TwinkleConfig.confirmUsernameToAIV (boolean) (deprecated)
 Defines if a username reports to AIV should be confirmed before sent.
 */
if( typeof( TwinkleConfig.confirmUsernameToAIV ) == 'undefined' ) {
	TwinkleConfig.confirmUsernameToAIV = true;
}

/**
 TwinkleConfig.toolboxButtons (string)
 If id defined in this array, the button of the action is located inthe toolbox instead of in
 the actions bar.
 */
if( typeof( TwinkleConfig.toolboxButtons ) == 'undefined' ) {
	TwinkleConfig.toolboxButtons = [];
}

function getChecked( nodelist ) {
	if( !( nodelist instanceof NodeList ) ) {
		throw nodelist + " not instance of NodeList";
	}
	var result = [];
	for(var i in nodelist ) {
		if( nodelist[i].checked ) {
			result.push( nodelist[i].value );
		}
	}
	return result;
}

function getTexts( nodelist ) {
	if( !( nodelist instanceof NodeList ) ) {
		throw nodelist + " not instance of NodeList";
	}
	var result = [];
	for(var i in nodelist ) {
		if( nodelist[i].type == 'text' && nodelist[i].value != '' ) {
			result.push( nodelist[i].value );
		}
	}
	return result;
}

function num2order( num ) {
	switch( num ) {
	case 1: return '';
	case 2: return '2nd';
	case 3: return '3rd';
	default: return num + 'th';
	}
}

function createOption( data ) {
	var option = document.createElement( 'option' );
	option.setAttribute( 'value', data.value );
	if( data.selected ) {
		option.setAttribute( 'selected', 'selected' );
	}
	option.setAttribute( 'label', data.label );
	option.appendChild( document.createTextNode( data.label ) );

	return option;
}

function createInput( data ) {
	var div = document.createElement( data.elem || 'span' );
	var input = document.createElement( 'input' );
	input.setAttribute( 'value', data.value );
	input.setAttribute( 'name', data.name );
	input.setAttribute( 'id', data.id );
	input.setAttribute( 'type', data.type );
	if( data.size ) {
		input.setAttribute( 'size', data.size );
	}
	if( data.checked ) {
		input.setAttribute( 'checked', 'checked' );
	}
	if( data.disabled ) {
		input.setAttribute( 'disabled', 'disabled' );
	}
	if( data.event && data.type == 'button' ){
		input.addEventListener( 'click', data.event, true );
	} else if( data.event ) {
		input.addEventListener( 'keyup', data.event, true );
	}
	if( data.type == 'button' || data.type == 'submit' || data.type == 'reset' ) {
		div.appendChild( input );
	} else {
		var label = document.createElement( 'label' );
		label.setAttribute( 'for', data.id );
		label.appendChild( document.createTextNode( data.text ) );
		if( [ 'radio', 'checkbox' ].indexOf( data.type ) != -1 ) {
			div.appendChild( input );
			div.appendChild( label );
		} else {
			div.appendChild( label );
			div.appendChild( input );
		}
	}

	return div;
}

function createSimpleCheckbox( label, name, id ) {
	return createInput( {
			id:id,
			name:name,
			value:label,
			text:label + ' ',
			type:'checkbox',
			elem:'div'

		} );
}

function createOptGroup( label ) {
	var optgroup = document.createElement( 'optgroup' );
	optgroup.setAttribute( 'label', label );
	return optgroup;
}


addOnloadHook( twinkleARVBase );
function twinkleARVBase(){
	var username;


	if ( wgNamespaceNumber == 3 || wgNamespaceNumber == 2 || ( wgNamespaceNumber == -1 && wgTitle == "Contributions" )){

		// If we are on the contributions page, need to parse some then
		if( wgNamespaceNumber == -1 && wgTitle == "Contributions" ) {
			username = document.getElementById( 'contentSub' ).getElementsByTagName( 'a' )[0].getAttribute('title').split(':')[1];
		} else {
			username = wgTitle.split( '/' )[0]; // only first part before any slashes
		}

		if( !username ) {
			// Something is fishy, there was no user? lets about everything
			throw "given username was " + username + " and thus makes no sense.";
		}

		var name = isIPAddress( username ) ? 'Report IP' : 'Report';
		var title =  isIPAddress( username ) ? 'Report IP to Administators' : 'Report user to Administrators';

		addPortletLink( chooseBox( 'tw-arv', TwinkleConfig.toolboxButtons ), "javascript:twinklearv(\"" + username + "\")", "arv", "tw-arv", name, title );
	}
}

function twinklearv( uid ) {
	if( uid == wgUserName ){
		alert( 'You don\'t want to report yourself , do you?' );
		return;
	}
	twinklearv.uid = uid;

	twinklearv.Window = new SimpleWindow( 600, 300 );
	twinklearv.Window.setTitle( "Advance Reporting and Vetting" ); //Backronym
	twinklearv.form = document.createElement( 'form' );
	twinklearv.form.setAttribute( 'action', 'javascript:void(0);');
	twinklearv.form.addEventListener( 'submit',twinklearv.evaluate , true );

	var main_choices = document.createElement( 'select' );
	main_choices.addEventListener( 'change',twinklearv.choose , true );
	main_choices.setAttribute('name', 'main_choices');
	main_choices.setAttribute('id', 'twArvMainChoices');

	label = document.createElement( 'label' );
	label.setAttribute( 'for', 'main_choices' );
	label.appendChild( document.createTextNode( 'Type of Report ' ) );

	main_choices.appendChild( createOption( { label:'Vandalism', value:'aiv' } ) );
	if( !isIPAddress( uid ) ) {
		main_choices.appendChild( createOption( { label:'Username', value:'username' } ) );
	}
	main_choices.appendChild( createOption( { label:'Sockpuppet', value:'sock' } ) );

	twinklearv.form.appendChild( label );
	twinklearv.form.appendChild( main_choices );
	twinklearv.form.appendChild( document.createElement( 'br' ) );

	twinklearv.choices = document.createElement( 'fieldset' );
	twinklearv.form.appendChild( twinklearv.choices );

	twinklearv.Window.setContent( twinklearv.form );
	twinklearv.choose();
	twinklearv.Window.display();
}

twinklearv.choose = function(e) {
	while( twinklearv.choices.hasChildNodes() ){
		twinklearv.choices.removeChild( twinklearv.choices.firstChild );
	}
	switch( twinklearv.form.main_choices.value ) {
	default:
	case 'aiv':
		var legend = document.createElement( 'legend' );
		legend.appendChild( document.createTextNode( 'Report user for vandalism' ) );
		twinklearv.choices.appendChild( legend );
		twinklearv.choices.appendChild( createInput( {
					id:'twArvAivPage',
					value: QueryString.exists( 'vanarticle' ) ? QueryString.get( 'vanarticle' ) : '',
					text:'Page (leave empty for no page) ',
					type:'text',
					name:'page',
					size:40,
					elem:'div',
					event: function(e) {
						if( e.target.value == '' ) {
							twinklearv.form.badid.disabled = twinklearv.form.goodid.disabled = true;
						} else {
							twinklearv.form.badid.disabled = false;
							twinklearv.form.goodid.disabled = twinklearv.form.badid.value == '';
						}
					}
				} ) );
		twinklearv.choices.appendChild( createInput( {
					id:'twArvAivBadId',
					value: QueryString.exists( 'vanarticlerevid' ) ? QueryString.get( 'vanarticlerevid' ) : '',
					text:'Vandal revision id ',
					disabled: !QueryString.exists( 'vanarticle' ),
					type:'text',
					name:'badid',
					size:20,
					elem:'div',
					event: function(e) {
						twinklearv.form.goodid.disabled = e.target.value == '';
					}
				} ) );
		twinklearv.choices.appendChild( createInput( {
					id:'twArvAivGoodId',
					value: QueryString.exists( 'vanarticlegoodrevid' ) ? QueryString.get( 'vanarticlegoodrevid' ) : 'prev',
					text:'Last good revision id ',
					disabled: !QueryString.exists( 'vanarticle' ) || QueryString.exists( 'vanarticlerevid' ),
					type:'text',
					name:'goodid',
					size:20,
					elem:'div'
				} ) );


		types = document.createElement( 'div' );
		types.appendChild( createInput( { 
					id:'twArvAivFinal',
					name:'aivtype',
					value:'final',
					text:'Vandalism after final warning given ',
					type:'checkbox',
					elem:'div'
				} ) );

		types.appendChild( createInput( { 
					id:'twArvAivPostBlock',
					name:'aivtype',
					value:'postblock',
					text:'Vandalism after recent release of block ',
					type:'checkbox',
					elem:'div'
				} ) );

		types.appendChild( createInput( {
					id:'twArvAivVandalonly',
					name:'aivtype',
					value:'vandalonly',
					text:'Evidently vandalism only account ',
					type:'checkbox',
					elem:'div'
				} ) );

		types.appendChild( createInput( { 
					id:'twArvAivSpambot',
					name:'aivtype',
					value:'spambot',
					text:'Account is evidently a spambot or a compromized account ',
					type:'checkbox',
					elem:'div'
				} ) );

		twinklearv.choices.appendChild( types );

		twinklearv.choices.appendChild( createInput( {
					id:'twArvReason',
					value:'',
					text:'Comment ',
					type:'text',
					name:'reason',
					size:80,
					elem:'div'
				} ) );

		twinklearv.choices.appendChild( createInput( {
					id:'twArvSubmit',
					value: 'Submit',
					name:'submit',
					type:'submit',
					elem:'div'
				} ) );

		break;
	case 'username':
		var legend = document.createElement( 'legend' );
		legend.appendChild( document.createTextNode( 'Report username violation' ) );
		twinklearv.choices.appendChild( legend );

		var types = document.createElement( 'div' );
		types.appendChild( document.createElement( 'h5' ) ).appendChild( document.createTextNode( 'Missleading username' ) );
		types.appendChild( createSimpleCheckbox( 'Implies the user is an admin or other official figure on Wikipedia, or of the Wikimedia Foundation', 'arvtype', 'uname1' ) );
		types.appendChild( createSimpleCheckbox( 'Closely resembles the name of another Wikipedia user', 'arvtype', 'uname2' ) );
		types.appendChild( createSimpleCheckbox( 'Matches the name of a well-known living or recently deceased person', 'arvtype', 'uname3' ) );
		types.appendChild( createSimpleCheckbox( 'Matches the name of a well-known company or group', 'arvtype', 'uname4' ) );
		types.appendChild( createSimpleCheckbox( 'Resembles an IP address, e-mail address or web page address,', 'arvtype', 'uname5' ) );
		types.appendChild( createSimpleCheckbox( 'Confusingly refers to a Wikipedia process, namespace, or toolbar item', 'arvtype', 'uname6' ) );
		types.appendChild( createSimpleCheckbox( 'Implies an automated account, such as names containing "robot", "bot", or a variation thereof', 'arvtype', 'uname7' ) );
		types.appendChild( createSimpleCheckbox( 'Consists of a lengthy repetition, or apparently random sequence, of characters, e.g. "aaaaaaaaaaaa" or "ghfjkghdfjgkdhfjkg"', 'arvtype', 'uname8' ) );
		types.appendChild( createSimpleCheckbox( 'Is extremely lengthy', 'arvtype', 'uname9' ) );

		types.appendChild( document.createElement( 'h5' ) ).appendChild( document.createTextNode( 'Harrasing username' ) );
		types.appendChild( createSimpleCheckbox( 'Is defamatory or insulting to other people, groups, articles or processes', 'arvtype', 'uname10' ) );
		types.appendChild( createSimpleCheckbox( 'Contains personal information about people, such as a telephone number or street address', 'arvtype', 'uname11' ) );
		types.appendChild( createSimpleCheckbox( 'Gives the impression of intent to cause trouble here, such as by alluding to hacking, spamming, trolling, vandalism, legal threats or computer viruses', 'arvtype', 'uname12' ) );
		types.appendChild( createSimpleCheckbox( 'Is similar to those used by known vandals', 'arvtype', 'uname13' ) );

		types.appendChild( document.createElement( 'h5' ) ).appendChild( document.createTextNode( 'Offensive username' ) );
		types.appendChild( createSimpleCheckbox( 'Is a name of religions or religious figures', 'arvtype', 'uname14' ) );
		types.appendChild( createSimpleCheckbox( 'Describes performing or endorsing violent real-world actions', 'arvtype', 'uname15' ) );
		types.appendChild( createSimpleCheckbox( 'Promotions of a controversial or potentially inflammatory point of view', 'arvtype', 'uname16' ) );
		types.appendChild( createSimpleCheckbox( 'Describes racism, sexism, or sexual orientation', 'arvtype', 'uname17' ) );
		types.appendChild( createSimpleCheckbox( 'Describes illnesses, disabilities, or medical or psychological conditions', 'arvtype', 'uname18' ) );
		types.appendChild( createSimpleCheckbox( 'Describes reproductive or excretory body functions, including genitalia and sexual slang', 'arvtype', 'uname19' ) );
		types.appendChild( createSimpleCheckbox( 'Contains slurs, profanity and obscenities', 'arvtype', 'uname20' ) );

		twinklearv.choices.appendChild( types );
		twinklearv.choices.appendChild( createInput( {
					id:'twArvReason',
					value:'',
					text:'Comment ',
					type:'text',
					name:'reason',
					size:80,
					elem:'div'
				} ) );

		twinklearv.choices.appendChild( createInput( {
					id:'twArvSubmit',
					value: 'Submit',
					name:'submit',
					type:'submit',
					elem:'div'
				} ) );
		break;

	case 'sock':
		var legend = document.createElement( 'legend' );
		legend.appendChild( document.createTextNode( 'Report Suspected Sockpuppeter' ) );
		twinklearv.choices.appendChild( legend );

		twinklearv.socks = document.createElement( 'fieldset' );
		twinklearv.socks.appendChild( document.createElement( 'legend' ) ).appendChild( document.createTextNode( 'Suspected Sockpuppets' ) );
		twinklearv.nbrsocks = 1;

		twinklearv.socks.appendChild( createInput( {
					id:'twArvSockpuppet1',
					value:'',
					text:'Sockpuppet 1 ',
					type:'text',
					name:'sockpuppet',
					size:80,
					elem:'div'
				} ) );
		twinklearv.choices.appendChild( twinklearv.socks );
		twinklearv.socks.appendChild( createInput( {
					id:'twArvMoreSocks',
					value: 'Add more socks',
					name:'moresocks',
					type:'button',
					elem:'div',
					event: function(e) {
						twinklearv.nbrsocks++;
						twinklearv.socks.insertBefore(
							createInput( {
									id:'twArvSockpuppet' + twinklearv.nbrsocks,
									value:'',
									text:'Sockpuppet ' + twinklearv.nbrsocks + ' ',
									type:'text',
									name:'sockpuppet',
									size:80,
									elem:'div'
								} ),
							twinklearv.socks.lastChild
						);

					}
				} ) );
		twinklearv.choices.appendChild( document.createElement( 'h5' ) ).appendChild( document.createTextNode( 'Evidence' ) );
		var textarea = twinklearv.choices.appendChild( document.createElement( 'textarea' ) );
		textarea.setAttribute( 'name', 'evidence' );
		textarea.setAttribute( 'id', 'twArvEvidence' );
		textarea.setAttribute( 'rows', '5' );
		textarea.setAttribute( 'cols', '40' );
		textarea.setAttribute( 'style', 'width: 90% !important;' );
		twinklearv.choices.appendChild( createInput( {
					id:'twArvSubmit',
					value: 'Submit',
					name:'submit',
					type:'submit',
					elem:'div'
				} ) );
		break;
	}

}

twinklearv.evaluate = function(e) {
	twinklearv.reason = "";
	if( twinklearv.form.reason ) {
		comment = twinklearv.form.reason.value;
	}
	switch( twinklearv.form.main_choices.value ) {
	default:
	case 'aiv':
		var types = getChecked( twinklearv.form.aivtype );
		if( types.length == 0 && comment == '' ) {
			alert( 'You must specify some reason' );
			return;
		}

		types = types.map( function(v) {
				switch(v) {
				case 'final':
					return 'vandalism after final warning';
					break;
				case 'postblock':
					return 'vandalism directly after release of block';
					break;
				case 'spambot':
					return 'account is evidently a spambot or a compromized account';
					break;
				case 'vandalonly':
					return 'actions evidently indicate a vandalism only account';
					break;
				}
			} ).join( ', ' );


		if( twinklearv.form.page.value != '' ) {
			twinklearv.reason += 'On [[' + twinklearv.form.page.value.replace( /^(Image|Category):/i, ':$1:' ) + ']]';

			if( twinklearv.form.badid.value != '' ) {
				var query = {
					'title': twinklearv.form.page.value,
					'diff': twinklearv.form.badid.value,
					'oldid': twinklearv.form.goodid.value
				};
				twinklearv.reason += ' ([' +  wgServer + wgScriptPath + '/index.php?' + QueryString.create( query ) + ' diff])';
			}
			twinklearv.reason += ';';
		}

		if( types ) {
			twinklearv.reason += " " + types;
		}
		if (comment != '' ) {
			twinklearv.reason += ". " + comment + '.';
		}
		Status.init( twinklearv.form );

		twinklearv.query = {
			'title': 'Wikipedia:Administrator intervention against vandalism',
			'action': 'submit',
			'section': 1
		};

		Status.status( "Grabbing AIV page" );
		twinklearv.xmlhttp = sajax_init_object();
		twinklearv.xmlhttp.overrideMimeType('text/xml');
		twinklearv.xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( twinklearv.query ), true);
		twinklearv.xmlhttp.onload = function() {
			uid = twinklearv.uid;
			reason = twinklearv.reason;
			var form = twinklearv.xmlhttp.responseXML.getElementById('editform');

			if( !form ) {
				Status.error( 'Failed to retrieve edit form.' );
				return;
			}
			var text = form.wpTextbox1.value;

			var re = new RegExp( "\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*" + RegExp.escape( uid, true ) + "\\s*\\}\\}" );

			var myArr;
			if( ( myArr = re.exec( text ) ) ) {
				Status.info( 'Report already present, will not add a new one' );
				return;
			}
			Status.status( 'Adding new report...' );
			var postData = {
				'wpMinoredit': TwinkleConfig.markAIVReportAsMinor ? true : form.wpMinoredit.checked, 
				'wpWatchthis': form.wpWatchthis.checked,
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSummary': 'Reporting [[Special:Contributions/' + uid + '|' + uid + ']].'+ TwinkleConfig.summaryAd,
				'wpTextbox1': text + '*{{' + ( isIPAddress( uid ) ? 'IPvandal' : 'vandal' ) + '|' + (/\=/.test( uid ) ? '1=' : '' ) + uid + '}} - ' + reason + ' ~~' + '~~'
			};
			twinklearv.xmlhttp = sajax_init_object();
			twinklearv.xmlhttp.overrideMimeType('text/xml');
			twinklearv.xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( twinklearv.query ), true);
			twinklearv.xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
			twinklearv.xmlhttp.onload = function() { window.location =  wgServer + wgArticlePath.replace( '$1', 'Wikipedia:Administrator intervention against vandalism' ); }
			twinklearv.xmlhttp.send( QueryString.create( postData ) );

		}
		twinklearv.xmlhttp.send( null );

		break;

	case 'username':
		var types = getChecked( twinklearv.form.arvtype );
		if( types.length == 0 ) {
			alert( 'You must specify at least one breached violation' );
			return;
		}

		types = types.map( function(v) { return '*' + v + '.' } ).join( "\n" );
		var uid = twinklearv.uid;
		twinklearv.reason = "===" + uid + "===\n:\{\{userlinks|" + uid +"\}\}\n;Violation of username policy because:\n" + types + "\n:";
		if (comment != '' ) {
			twinklearv.reason += "''" + comment + "''. ";
		}
		twinklearv.reason += "\~\~\~\~";
		Status.init( twinklearv.form );

		twinklearv.query = {
			'title': 'Wikipedia:Usernames for administrator attention',
			'action': 'submit',
			'section': 1
		};

		Status.status( "Grabbing UAA page" );
		twinklearv.xmlhttp = sajax_init_object();
		twinklearv.xmlhttp.overrideMimeType('text/xml');
		twinklearv.xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( twinklearv.query ), true);
		twinklearv.xmlhttp.onload = function() {
			uid = twinklearv.uid;
			reason = twinklearv.reason;
			var form = twinklearv.xmlhttp.responseXML.getElementById('editform');

			if( !form ) {
				Status.error( 'Failed to retrieve edit form.' );
				return;
			}
			var text = form.wpTextbox1.value;

			Status.status( 'Adding new report...' );
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked, 
				'wpWatchthis': form.wpWatchthis.checked,
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSummary': 'Reporting [[Special:Contributions/' + uid + '|' + uid + ']].'+ TwinkleConfig.summaryAd,
				'wpTextbox1': text.replace( /-->/, "-->\n" + reason )
			};
			twinklearv.xmlhttp = sajax_init_object();
			twinklearv.xmlhttp.overrideMimeType('text/xml');
			twinklearv.xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( twinklearv.query ), true);
			twinklearv.xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
			twinklearv.xmlhttp.onload = function() { window.location =  wgServer + wgArticlePath.replace( '$1', 'Wikipedia:Usernames for administrator attention' ); }
			twinklearv.xmlhttp.send( QueryString.create( postData ) );

		}
		twinklearv.xmlhttp.send( null );
		break;
	case 'sock':
		twinklearv.sockpuppets = getTexts( twinklearv.form.sockpuppet );
		twinklearv.evidence = twinklearv.form.evidence.value;
		Status.init( twinklearv.form );

		Status.status( 'Grabbing data of eventual previous reports' );

		var xmlhttp = sajax_init_object();
		xmlhttp.query = {
			'title': 'Special:Prefixindex',
			'from': 'Suspected sock puppets/' + twinklearv.uid,
			'namespace': 4
		};
		xmlhttp.overrideMimeType('text/xml');
		xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
		xmlhttp.onload = function() {
			var a_tags = this.responseXML.getElementsByTagName('a');
			var re = new RegExp( RegExp.escape( 'Suspected sock puppets/' + twinklearv.uid ) );
			var number = 0;
			for( var i in a_tags ) {
				var title = a_tags[i].title;
				if( re.exec( title ) ) {
					var n = /\(\s*(\d+)(?:th|nd|rd|st)\s*\)\s*$/.exec( title );
					if( n && n[1] > number ) {
						number = n[1];
					} else if( number == 0 ) {
						number = 1;
					}
				}
			}

			if( number == 0 ) {
				twinklearv.numbering = number = '';
			} else {
				number = num2order( parseInt( number ) + 1);
				twinklearv.numbering = ' (' + number + ')';
			}

			Status.status( 'Creating report page [[Wikipedia:Suspected sock puppets/' +  twinklearv.uid + twinklearv.numbering + ']]');

			var xmlhttp = sajax_init_object();
			xmlhttp.query = {
				'title': 'Wikipedia:Suspected sock puppets/' +  twinklearv.uid + twinklearv.numbering,
				'action': 'submit'
			};
			xmlhttp.overrideMimeType('text/xml');
			xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
			xmlhttp.onload = function() {
				var form = this.responseXML.getElementById('editform');
				var text = 
					"===[[User:" + twinklearv.uid + "]]===\n" +
					";Suspected sockpuppeteer\n" +
					":\{\{user5|" + twinklearv.uid + "\}\}\n\n" +
					";Suspected sockpuppets\n" + 
					twinklearv.sockpuppets.map( function(v) { return ":\{\{user5|" + v + "\}\}" } ).join( "\n" ) + "\n\n" +
					";Report submission by\n" +
					"\~\~\~\~\n\n" +
					";Evidence\n" +
					twinklearv.evidence + "\n\n" +
					";Comments\n\n\n" +
					";Conclusions\n\n\n" +
					"----\n</div>\n";


				var postData = {
					'wpMinoredit': form.wpMinoredit.checked,
					'wpWatchthis': form.wpWatchthis.checked,
					'wpStarttime': form.wpStarttime.value,
					'wpEdittime': form.wpEdittime.value,
					'wpAutoSummary': form.wpAutoSummary.value,
					'wpEditToken': form.wpEditToken.value,
					'wpSummary': "Creating report for [[User:" +  twinklearv.uid + ']].' + TwinkleConfig.summaryAd,
					'wpTextbox1': text
				};
				var xmlhttp = sajax_init_object();
				xmlhttp.overrideMimeType('text/xml');
				xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true);
				xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
				xmlhttp.onload = function() { Status.info( 'Report created' ) }
				xmlhttp.send( QueryString.create( postData ) );
			}
			xmlhttp.send( null );

			Status.status( 'Linking report to open cases');
			var xmlhttp = sajax_init_object();
			xmlhttp.query = {
				'title': 'Wikipedia:Suspected sock puppets',
				'section': 4,
				'action': 'submit'
			};
			xmlhttp.overrideMimeType('text/xml');
			xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
			xmlhttp.onload = function() {
				var form = this.responseXML.getElementById('editform');
				text = form.wpTextbox1.value.replace( /(<!-- Add .*? list\. -->)/, "$1\n\{\{Wikipedia:Suspected sock puppets/" + twinklearv.uid + twinklearv.numbering + "\}\}");
				var postData = {
					'wpMinoredit': form.wpMinoredit.checked,
					'wpWatchthis': form.wpWatchthis.checked,
					'wpStarttime': form.wpStarttime.value,
					'wpEdittime': form.wpEdittime.value,
					'wpAutoSummary': form.wpAutoSummary.value,
					'wpEditToken': form.wpEditToken.value,
					'wpSummary': "Adding report for [[User:" +  twinklearv.uid + ']].' + TwinkleConfig.summaryAd,
					'wpTextbox1': text
				};
				var xmlhttp = sajax_init_object();
				xmlhttp.overrideMimeType('text/xml');
				xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true );
				xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
				xmlhttp.onload = function() { Status.info( 'Added to open cases' ) }
				xmlhttp.send( QueryString.create( postData ) );
			}
			xmlhttp.send( null );

			Status.status( 'Notifying suspected sockpuppeter');
			var xmlhttp = sajax_init_object();
			xmlhttp.query = {
				'title': 'User:' + twinklearv.uid,
				'action': 'submit'
			};
			xmlhttp.overrideMimeType('text/xml');
			xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
			xmlhttp.onload = function() {
				var form = this.responseXML.getElementById('editform');
				text = form.wpTextbox1.value;
				var postData = {
					'wpMinoredit': form.wpMinoredit.checked,
					'wpWatchthis': form.wpWatchthis.checked,
					'wpStarttime': form.wpStarttime.value,
					'wpEdittime': form.wpEdittime.value,
					'wpAutoSummary': form.wpAutoSummary.value,
					'wpEditToken': form.wpEditToken.value,
					'wpSummary': "Notifying about suspicion of sockpuppertering." + TwinkleConfig.summaryAd,
					'wpTextbox1': text + "\n\{\{subst:socksuspectnotice|1=" + twinklearv.uid + twinklearv.numbering + "\}\} \~\~\~\~"
				};
				var xmlhttp = sajax_init_object();
				xmlhttp.overrideMimeType('text/xml');
				xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true);
				xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
				xmlhttp.onload = function() { Status.info( 'Suspected sockpuppeter notified' ) }
				xmlhttp.send( QueryString.create( postData ) );
			}
			xmlhttp.send( null );

			Status.status( 'Tagging suspected socks');
			for( var i in twinklearv.sockpuppets ) {
				var xmlhttp = sajax_init_object();
				xmlhttp.current = twinklearv.sockpuppets[i];
				xmlhttp.query = {
					'title': 'User:' + xmlhttp.current,
					'action': 'submit'
				};
				xmlhttp.overrideMimeType('text/xml');
				xmlhttp.open( 'GET' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( xmlhttp.query ), true);
				xmlhttp.onload = function() {
					var form = this.responseXML.getElementById('editform');
					text = form.wpTextbox1.value;
					if( /{{sockpuppet/.exec( text ) ) { // already marked as a sock, just ignore then
								return;
							}
							var postData = {
								'wpMinoredit': form.wpMinoredit.checked,
								'wpWatchthis': form.wpWatchthis.checked,
								'wpStarttime': form.wpStarttime.value,
								'wpEdittime': form.wpEdittime.value,
								'wpAutoSummary': form.wpAutoSummary.value,
								'wpEditToken': form.wpEditToken.value,
								'wpSummary': "Adding supsected sockpuppet tag for suspected sockpuppeter [[User:" +  twinklearv.uid + ']].' + TwinkleConfig.summaryAd,
								'wpTextbox1': "\{\{subst:socksuspect|1=" + twinklearv.uid + "\}\}\n" + text
							};
							var xmlhttp = sajax_init_object();
							xmlhttp.current = this.current;
							xmlhttp.overrideMimeType('text/xml');
							xmlhttp.open( 'POST' , wgServer + wgScriptPath + '/index.php?' + QueryString.create( this.query ), true);
							xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
							xmlhttp.onload = function() { Status.info( 'Added tag for ' + this.current ) }
							xmlhttp.send( QueryString.create( postData ) );
						}
						xmlhttp.send( null );

					}

				}
				xmlhttp.send( null );
			}
		}

Leave a Reply