Year of the Dragon: Through April 23rd, claim the adventure pack Slice of Life for free! Speak to Xatheral in the Hall of Heroes.
Game mechanics • Newbie guide • In development • DDO Store • Social Media
Challenges • Classes • Collectables • Crafting • Enhancements • Epic Destinies • Favor • Feats
Glossary • Items • Maps • Monsters • Places • Quests • Races • Reincarnation • Skills • Spells
Please create an account or log in to build a reputation and unlock more editing privileges, and then visit DDO wiki's IRC Chat/Discord if you need any help!
MediaWiki:Gadget-spamBlock.js/sandbox.js
Jump to navigation
Jump to search
Note: After saving, you may have to bypass your browser's cache to see the changes, you can click here or try one of the methods below..
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl+F5 or Ctrl+r (⌘ Command+r on a Mac)
- Google Chrome: Press Ctrl+⇧ Shift+R (⌘ Command+⇧ Shift+R on a Mac)
- Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl+F5
- Konqueror: Click Reload or press F5
- Opera: Clear the cache in Tools ‣ Preferences
//<nowiki>
if ( ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Recentchanges' ||// Recent Changes
( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Log' &&// or the log
mw.config.get( 'wgPageName' ) === 'Special:Log/newusers' ) )// ... of new users
&& ( $.inArray( 'sysop', mw.config.get( 'wgUserGroups' ) ) !== -1// You are a sysop
|| $.inArray( 'steward', mw.config.get( 'wgUserGroups' ) ) !== -1 )// or a steward
) {
function deleteLogEntry( entryID, delLogReason ) {
var reasonDelLog = 'Vandalism only account. Removing ';
switch ( delLogReason ) {
case 'phone' :
reasonDelLog += 'possible phone number ';
case 'long' :
reasonDelLog += 'long page name ';
default :
reasonDelLog += 'plausible ';
}
reasonDelLog += '[[Special:RecentChanges|RC]] spam with [[MW:Gadget-spamBlock|DeSpammer]].';
( new mw.Api() ).postWithToken( 'delete', {
action: 'revisiondelete',
type: 'logging',
ids: entryID,
hide: 'content',
reason: reasonDelLog
} ).done( function( rdResult ) {
console.log( '%o', rdResult );
$( 'a#logID-' + entryID ).text( 'log cleaned' ).removeAttr( 'onclick' ).removeAttr( 'style' ).removeAttr( 'title' );// Might change this later so the onclick takes you to the log entry to review it.
} );
}
/* create link */// Create links for each new account to be able to one click deal with obvious spam accounts
var Spammer = '';
if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Recentchanges' ) {
$( '.mw-changeslist-line-not-watched' ).has( 'a[title="Special:Log/newusers"]' ).find( '.mw-usertoollinks' ).find( 'a[title^="Special:Block/"]' ).each( function( i ) {
Spammer = this.title.substr( this.title.lastIndexOf( '/' ) + 1 );
// Create the link to click to block this account and delete all the contributions
$( this ).after( ' | <a href="#' + Spammer + '" id="spammer-link-' + Spammer + '" class="spammer-link" title="Block spam only account (- ' + Spammer + ' -) and delete all contributions">spam</a>' );
} );
} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Log' &&
mw.config.get( 'wgPageName' ) === 'Special:Log/newusers' ) {
$( '.mw-logline-newusers' ).find( '.mw-usertoollinks' ).find( 'a[title^="Special:Block/"]' ).each( function( i ) {
Spammer = this.title.substr( this.title.lastIndexOf( '/' ) + 1 );
// Create the link to click to block this account and delete all the contributions
$( this ).after( ' | <a href="#' + Spammer + '" id="spammer-link-' + Spammer + '" class="spammer-link" title="Block spam only account (- ' + Spammer + ' -) and delete all contributions">spam</a>' );
} );
}
/* process click */// This is what will happen when a link is clicked
$( '.spammer-link' ).click( function ( e ) {
e.preventDefault();
/* get spammer */// Who we cleaning up after?
var thisSpammer = $( this ).attr( 'id' ).replace( 'spammer-link-', '' );
var thisSpammerTalk = '';
/* confirm */// Confirm this because it could be a lot of work to revert the process.
var confirmSpammer = confirm( 'Click OK if you are sure you want to block ' + thisSpammer + ' and delete all of their contributions?' );
if ( confirmSpammer ) {
var domReload = document.createElement( 'a' );
domReload.innerText = 'Click here to reload the page when done.';
domReload.onclick( window.location.reload( true ) );
var despammerStatus = document.createElement( 'p' );
despammerStatus.innerText = 'DeSpammer is processing account: ' + thisSpammer;
despammerStatus.append( document.createElement( 'br' ), domReload );
mw.notify( despammerStatus, { tag: 'DeSpammer', title: 'DeSpammer!', autoHide: false } );
/* block */// First step is to block the account to prevent further damage
( new mw.Api() ).postWithToken( 'block', {
action: 'block',// Blocks the account
user: thisSpammer,
expiry: 'infinite',// If set to 'infinite', 'indefinite' or 'never', the block will never expire.
nocreate: true,// Prevent account creation
autoblock: true,// Automatically block the last used IP address, and any subsequent IP addresses they try to login from
// noemail: true,// Prevent user from sending email through the wiki.
reason: 'Vandalism only account. Blocking with [[MW:Gadget-spamBlock|DeSpammer]].'
} ).done( function( bResult ) {
console.log( '%o', bResult );
despammerStatus += '<p>Account #' + bResult.block.userID + ' blocked</p>';
mw.notify( $( despammerStatus ), { tag: 'DeSpammer', title: 'DeSpammer!', autoHide: false } );
( new mw.Api() ).postWithToken( 'edit', {
action: 'edit',
title: 'User talk:' + thisSpammer,
summary: 'Tagging blocked user\'s talk page with {{[[Template:Spam block|Spam block]]}}',
minor: true,
bot: true,
recreate: true,
watchlist: 'watch',
text: '{{Spam block|admin=' + mw.config.get( 'wgUserName' ) + '}}'
} ).done( function( utResult ){
console.log( '%o', utResult );
thisSpammerTalk = utResult.timestamp;// Save the timestamp for this edit in case the revision needs to be restored below after page deletion
despammerStatus += '<p>Spam block template posted to user talk</p>';
mw.notify( $( despammerStatus ), { tag: 'DeSpammer', title: 'DeSpammer!', autoHide: false } );
console.log( thisSpammerTalk );//TRON
} );
} );
/* contribs */// Get all the contributions of a user to be able to rollback or delete as needed.
( new mw.Api() ).get( {
action: 'query',
list: 'usercontribs',// Get a list of contributions for the user.
ucuser: thisSpammer,
ucprop: 'ids|title|flags',// Get the pageid and new/top(/minor) flags for the edit.
uclimit: 'max'// Get all that you can.
} ).done( function( ucResponse ) {
$.each( ucResponse.query.usercontribs, function( i ) {
if ( this[ 'new' ] !== undefined ) {
/* delete */// This is a new page created by the vandal, just delete it.
( new mw.Api() ).postWithToken( 'delete', {
action: 'delete',// Deletes a single page.
reason: 'Page created by vandalism only account. Deletion by [[MW:Gadget-spamBlock|DeSpammer]].',
pageid: this.pageid
} ).done( function( dResult ) {
console.log( '%o', dResult );
despammerStatus += '<p><a href="' + dResult[ 'delete' ].title + '">' + dResult[ 'delete' ].title + '</a> has been deleted.';
if ( /[0-9-()+]{3,20}/.test( dResult[ 'delete' ].title ) ) {
console.info( '%s has content that matches the formatting of a telephone number.', dResult[ 'delete' ].title );
despammerStatus += ' - <a id="logID-' + dResult[ 'delete' ].logid + '" href="#" onclick="deleteLogEntry( ' + dResult[ 'delete' ].logid + ', \'phone\' );" title="Delete log entry for a title that appears to contain a phone number?" style="color: #AA0000;">delete log</a></p>';
} else if ( dResult[ 'delete' ].title.length >= 20 ) {
console.info( '%s is %d characters long which meets the 20 character threshold.', dResult[ 'delete' ].title, dResult[ 'delete' ].title.length );
despammerStatus += ' - <a id="logID-' + dResult[ 'delete' ].logid + '" href="#" onclick="deleteLogEntry( ' + dResult[ 'delete' ].logid + ', \'long\' );" title="Delete log entry for a title >= 20 characters?" style="color: #FF8800;">delete log</a></p>';
} else {
despammerStatus += '</p>';
}
mw.notify( $( despammerStatus ), { tag: 'DeSpammer', title: 'DeSpammer!', autoHide: false } );
console.log( thisSpammerTalk );//TRON
} );
} else if ( this.top !== undefined ) {
/* rollback */// This is an existing page edited by the vandal, roll it back to what it was.
var thisPageId = this.pageid;// because we're nesting mw.Api() calls, "this" will change.
var thisTitle = this.title;// because we're nesting mw.Api() calls, "this" will change.
( new mw.Api() ).get( {// Won't need to get the token once we get to MW1.24+.
action: 'query',// Won't need to get the token once we get to MW1.24+.
prop: 'revisions',// Won't need to get the token once we get to MW1.24+.
rvtoken: 'rollback',// Won't need to get the token once we get to MW1.24+.
titles: thisTitle// Won't need to get the token once we get to MW1.24+.
} ).done( function( gotToken ) {// Won't need to get the token once we get to MW1.24+.
var thisRollbackToken = gotToken.query.pages[ thisPageId ].revisions[ 0 ].rollbacktoken;
( new mw.Api() ).post( {// Use .postWithToken( 'rollback', ... once we get to MW1.24+.
action: 'rollback',// Rollback all revisions of this page.
summary: 'Page edited by vandalism only account. Rollback by [[MW:Gadget-spamBlock|DeSpammer]].',
token: thisRollbackToken,// Won't need this token once we get to MW1.24+.
markbot: true,
user: thisSpammer,
title: thisTitle
} ).done( function( rbResult ) {
console.log( '%o', rbResult );
despammerStatus += '<p><a href="' + rbResult.rollback.title + '">' + rbResult.rollback.title + '</a> has been rolledback.</p>';
mw.notify( $( despammerStatus ), { tag: 'DeSpammer', title: 'DeSpammer!', autoHide: false } );
console.log( thisSpammerTalk );//TRON
} );
} );
} else {
/* leave alone */// Assume that someone else has edited, reverted, deleted, or otherwise fixed this contribution.
}
} );
} );
} else {
alert( 'PHEW! That was close! Please be much more careful where you click next time!!!' );
}
console.log( thisSpammerTalk );//TRON
} );
}
//</nowiki>[[Category:Gadgets]]
// Will need to undelete revision of tagging user's page with {{Spam block}}
// See https://www.mediawiki.org/wiki/API:Undelete for details
// - note that our method should change once we hit MW 1.24+ (we're on 1.23)
/*
if ( dResult[ 'delete' ].title == 'User talk:' = thisSpammer ) {
despammerStatus += '<p><a href="' + dResult[ 'delete' ].title + '">' + dResult[ 'delete' ].title + '</a> has been restored with the appropriate template.';
mw.notify( $( despammerStatus ), { tag: 'DeSpammer', title: 'DeSpammer!', autoHide: false } );
}
*/