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, |
|||
name:name, |
|||
value:label, |
|||
text:label + ' ', |
|||
type:'checkbox', |
|||
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( ' |
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' ) ); |
|||
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. |
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 = ""; |
||
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 );
}
}