WoW Forums Helper

By deleted user Last update Jun 19, 2005 — Installed 1,190 times.
// ==UserScript==
// @name	WoW Forums Helper
// @description	This script contains some useful helper functions for dealing with the WoW forums.\nAs an example, I have included some additional functionality, such as killfiles, targeted post killing, illuminated letters and inline images.
// @include	http://forums.worldofwarcraft.com/thread.aspx?fn=wow-* 
// @include	https://forums.worldofwarcraft.com/thread.aspx?fn=wow-* 
// ==/UserScript==

// $Id: wowforumshelper.user.js,v 1.3 2005/05/25 15:12:01 curious Exp $

(function() {

/* Anon function wrapper. */

var greenIconData = "data:image/gif,GIF89a%17%00%15%00%C6%7F%00%00%14%00%00%1B%00%00%22%00%00%2C%00%002%00%16%23%16%16%26%16%006%01%008%01%16*%16%00%3C%01%16-%16%02%3E%03%161%16%03%40%04%01C%02%165%16%08%40%09%05B%07%168%16%02G%04%01H%02%06E%08%06G%07%16%3D%16%08H%09%11B%11%0BF%0C%03L%04%0DG%0D%16A%16%12E%12%16C%16%02R%04%16E%16%16H%16%16K%16%09T%0B%07V%08%16L%16%16O%16%03%5D%04%16Q%16%12T%12%14V%14%09%5E%09%16U%16%03b%05%16W%16%07d%08%16Z%16%16%5D%16%0Fb%10%0Be%0C%05k%06%16%60%16%11f%11%16d%16%05r%06%16h%16%16j%16%05v%07%16l%16%16o%16%0Bw%0D%16q%16%14t%14%07%7D%08%16s%16%16u%16%07%81%08%16y%16%0F%7F%0F%08%86%09%16~%16%0B%87%0D%11%86%11%07%8D%09%16%83%16%0E%8A%0F%09%8E%0A%16%86%16%0E%8C%0F%14%89%14%0A%90%0C%0C%93%0D%16%8D%16%0A%96%0B%0B%96%0C%16%90%16%10%94%11%0A%98%0C%0C%97%0C%16%93%16%13%95%14%11%97%11%0B%9C%0C%16%95%16%14%98%14%14%9A%14%0D%9F%0D%16%99%16%0B%A2%0D%16%9B%16%14%9E%14%0F%A8%10%11%A9%11%16%A6%16%0D%AF%0F%16%AB%16%14%AE%14%12%B1%12%16%B0%16%14%B2%14%11%B4%12%16%B3%16%16%B4%16%11%BA%12%16%B9%16%16%BD%14%13%C5%14%14%C9%14%16%C8%16%16%CE%16%14%D1%14%16%D9%16%16%DE%16%FF%FF%FF!%F9%04%01%00%00%7F%00%2C%00%00%00%00%17%00%15%00%00%07%FE%80%7F%82%83%82%06%86%7F%86%06%84%8B%8B%09%13%23(%20%13%20(%23%10%8C%8C%0B%22%3E4%16%1D'%1D%168%3B%20%98%84%22G-%0CB0%202B%085D%A5%A6%18%3EH%00bE.%7F0G%5E%00L9%13%A6(Y%04!mNA%3CEQp%0F%0FV%23%A6%3C_%006zpZKZp%7B)%00h9%98%24Qf%00%15u%0A%00%ED%08r%04%00oQ%24%8B%B6sM%00%016%3DlulC%5E%B4%83%02'%08%86A%0Dd%94%09%D7%0E%80%11%3C%7B%F0%F4h%08%80%C3%98%1B%97%FE%88%88%12.%00%82x%00%06p%19%E0%AE%02I%0AQ%A85%98%81%ABG%1E0I%B0%04%A0%E2gK%80-I%AE%F0%A9%02%00%C8%8D%06%10~p%88%01%C7%8E%0E%01~%D4T%C9%C3%25%8D%1F%016%E8%AC%01%C2%C0%07%84%09%3E%18L9b%E5%09%009%7DB%04x%D0G%0E%00)Q%88Dq%B0%A3A%83%1B%97%17~%C0%C8q%8C%40%9E!%D8%F2%10%40%90%E5%06%8A%1C%19%60%2CHpb%03%8B%11*%88%8C%19PA%60%88%14%03%C6%14Q%01%02%14%08E%0DD%90%18Ab%86%15%3BdH%0A%00s'%CB%8C%13%23FxX0h%C2%87%15%3B%7CX%89%C30%9D%9B0D%7C%AC%D0%40%0C%E1%89%08%12J%98%40%10%80%80%8E%03%01%06%84(!!%03%8A%06%84%0A%40%20%E1B%06%0F%25Y%CA%9C)%D3%C5%C9%8F%1B2H%40(%B0%A8%80%81%05%0D%26%60%D0%7C%82%84%08%0F%13%1A%0C%26%2F(%10%00%3B";

var rePlayerInfo = /Level (\d+) (\w+) (\w+)/i;

var posts = []; 

function boardRealm()
{
	var ourHREF = window.location.href;
	if( ourHREF.indexOf( "wow-realm-" ) == -1 )
	{
		return( "" );
	}
	return( ourHREF.substring( ourHREF.indexOf( "wow-realm-" ) + 10, ourHREF.indexOf( "&" ) ) );
}

function getNumberPosts()
{
	if( posts.length != 0 ) return( posts.length );

	var postTables = document.evaluate( "//table[@class='threadTable' and @cellpadding='4']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
	posts = new Array();
	for( var i = 0; i < postTables.snapshotLength; i++ )
	{
		posts[ i ] =  postTables.snapshotItem( i );
	}
	return( posts.length );
}

function getPost( postID )
{
	if( posts.length == 0 )
	{
		getNumberPosts();
	}
	return( posts[ postID ] ); 
}

function getIDPane( postID )
{
	var post = getPost( postID );
	var IDPane = document.evaluate( ".//td[@width='200' and @rowspan='2' and @valign='top' and @align='center']", post, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
	return( IDPane.snapshotItem( 0 ) );
}

function getSubjectArea( postID )
{
	pane = getIDPane( postID );
	var subjPane = pane.parentNode;
	return( subjPane.cells[1] ); 
}

function getSubject( postID )
{
	area = getSubjectArea( postID );
	return( area.getElementsByTagName( "span" )[ 1 ].getElementsByTagName( "b" )[ 0 ].innerHTML );
}

function getBody( postID )
{
	var post = getPost( postID );
	var divs = document.evaluate( ".//div[@class='breakWord']", post, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
	return( divs.snapshotItem( 0 ).childNodes[ 0 ] );	
}

function getPlayer( postID )
{
	var chunk = getIDPane( postID ).childNodes[3].rows[0].cells[0].childNodes[0].innerHTML;
	var startPos = chunk.indexOf( ">" ) + 1;
	return( chunk.substring( startPos, chunk.indexOf( "<", startPos ) ) );
}

function getLevel( postID )
{
	var ar = rePlayerInfo.exec( getIDPane( postID ).innerHTML );
	return( ar[ 1 ] );
}

function getRace( postID )
{
	var ar = rePlayerInfo.exec( getIDPane( postID ).innerHTML );
	return( ar[ 2 ] );
}

function getClass( postID )
{
	var ar = rePlayerInfo.exec( getIDPane( postID ).innerHTML );
	return( ar[ 3 ] );
}

function getGuild( postID )
{
	if( getIDPane( postID ).childNodes[6].rows.length == 3 )
		return( getIDPane( postID ).childNodes[6].rows[1].cells[1].childNodes[0].innerHTML );
	else
		return( "" );
}

function getRealm( postID )
{
	if( getIDPane( postID ).childNodes[6].rows.length == 3 )
		return( getIDPane( postID ).childNodes[6].rows[2].cells[1].childNodes[0].innerHTML );
	else if( getIDPane( postID ).childNodes[6].rows.length == 2 ) 
		return( getIDPane( postID ).childNodes[6].rows[1].cells[1].childNodes[0].innerHTML );
	else
		return( "" );
}

function killPost( postID )
{
	var thePost = getPost( postID );
	thePost.parentNode.removeChild( thePost );
}

function transformRealm( realmstring )
{
	return( realmstring.toLowerCase().replace( " ", "" ).replace( "'", "" ) );
}

function getKillList()
{
	var strlist = GM_getValue( "killFile", "" );
	var bits = strlist.split( "|" );
	var returned = {};
	for( var i = 0; i < bits.length; i++ ) returned[ bits[ i ] ] = true;
	return( returned );
}

function addToKillList( key )
{
	var list = getKillList();
	var listkeys = new Array;
	for( var k in list ) listkeys.push( k );
	listkeys.push( key );
	GM_setValue( "killFile", listkeys.join( "|" ) );
	alert( key + " added to Killfile.\nReloading." );
	window.location.reload();
}
window.GM_wfh_addToKillList = addToKillList;

function clearKillList( e )
{
	GM_setValue( "killFile", "" );
	alert( "Killfile cleared.\nReloading." );
	window.location.reload();
}
window.GM_wfh_clearKillList = clearKillList;
GM_registerMenuCommand( "WoW - Clear Killfile", window.GM_wfh_clearKillList );

function toggleOption( option )
{
	GM_setValue( option, !GM_getValue( option, false ) );
	alert( "Value of " + option + " is now " + GM_getValue( option, false ) + ".\nReloading page." );
	window.location.reload();
}
window.GM_wfh_toggleOption = toggleOption;

function toggleKillLevelOnes( e )
{
	window.GM_wfh_toggleOption( "killLevelOnes" );
}
window.GM_wfh_toggleKillLevelOnes = toggleKillLevelOnes;
GM_registerMenuCommand( "WoW - Newbswatter", window.GM_wfh_toggleKillLevelOnes );


function toggleKillOffRealm( e )
{
	window.GM_wfh_toggleOption( "killOffRealm" );
}
window.GM_wfh_toggleKillOffRealm = toggleKillOffRealm;
GM_registerMenuCommand( "WoW - Border Control", window.GM_wfh_toggleKillOffRealm );


function toggleKillfile( e )
{
	window.GM_wfh_toggleOption( "useKillFile" );
}
window.GM_wfh_toggleKillfile = toggleKillfile;
GM_registerMenuCommand( "WoW - Killfile Engage", window.GM_wfh_toggleKillfile );


function toggleBlackrock( e )
{
	window.GM_wfh_toggleOption( "killBlackrock" );
}
window.GM_wfh_toggleBlackrock = toggleBlackrock;
GM_registerMenuCommand( "WoW - BanBlackrock", window.GM_wfh_toggleBlackrock );

function toggleIllumination( e )
{
	window.GM_wfh_toggleOption( "illuminatePosts" );
}
window.GM_wfh_toggleIllumination = toggleIllumination;
GM_registerMenuCommand( "WoW - Illuminated", window.GM_wfh_toggleIllumination );

function toggleInlineImages( e )
{
	window.GM_wfh_toggleOption( "inlineImages" );
} 
window.GM_wfh_toggleInlineImages = toggleInlineImages;
GM_registerMenuCommand( "WoW - Inline Images", window.GM_wfh_toggleInlineImages );

window.addEventListener( "load", function(e) 
{
	/* Here's some examples of what you can do with this kind of functionality. */
	for( var i = 0; i < getNumberPosts(); i++ )
	{
		var killMe = false;
		
		/* Killing troll alts. */
		if( GM_getValue( "killLevelOnes", false ) == true )
		{
			if( getLevel( i ) == 1 ) killMe = true;
		}

		/* Kill off out of realm characters below level 15. */
		if( GM_getValue( "killOffRealm", false ) == true )
		{
			if( ( getLevel( i ) < 15 ) && ( transformRealm( getRealm( i ) ) != boardRealm() ) ) killMe = true;
		}

		/* Kill folks off my personal hitlist. */
		if( GM_getValue( "useKillFile", false ) == true )
		{
			var key = getPlayer( i ) + ":" + getRealm( i );
			if( key in getKillList() ) killMe = true;
			var linko = document.createElement( "a" );
			linko.href = "javascript: window.GM_wfh_addToKillList( '" + key + "' );";
			var greenIcon = document.createElement( "img" );
			greenIcon.src = greenIconData;
			greenIcon.border = 0;
			linko.appendChild( greenIcon );
			getIDPane( i ).appendChild( linko );
		}

		/* Blackrock shouldn't be allowed out of their playpen. */
		if( ( GM_getValue( "killBlackrock", false ) == true ) && ( transformRealm( getRealm( i ) ) == "blackrock" ) && ( boardRealm() != "blackrock" ) ) killMe = true;

		/* Illuminate first letters. */ 
		if( GM_getValue( "illuminatePosts", false ) == true )
		{
			var post = getBody( i );
			var content = post.innerHTML.replace( /^[\s]+/g, "" );
			var first = content.substring( 0, 1 ).toLowerCase();
			if( first.match( /[a-z]/i ) ) 
			{
				post.innerHTML = content.substring( 1 );
			
				var image = document.createElement( "img" );
				image.src = "http://worldofwarcraft.com/shared/wow-com/images/smallcaps/plain/" + first + ".gif";
				image.align = 'left';
				image.valign = 'top';
				
				post.parentNode.insertBefore( image, post );
			}
		}

		/* Greasemonkey orders you to fire! */		
		if( killMe == true ) killPost( i );
	}

	/* Inline all image links.  We don't seem to have XPath2.0 to do ends-with, bah. */
	if( GM_getValue( "inlineImages", false ) == true )
	{
		var imageLinks = document.evaluate( "//a[@href]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
		for( var i = 0; i < imageLinks.snapshotLength; i++ )
		{
			var link = imageLinks.snapshotItem( i );
			var dest = link.getAttribute( "href" );
			if( dest.toUpperCase().substring( dest.length - 3 ) == "JPG" )
			{
				var newElem = document.createElement( "img" );
				newElem.src = dest;
				link.parentNode.replaceChild( newElem, link );
			}
		}
	}


}, false );

/* Anon function wrapper ends here. */
} )();