TNN spam filter

By David Severwright Last update Apr 16, 2009 — Installed 578 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

There are 26 previous versions of this script.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name           TNN spam filter
// @namespace      davidsev
// @description    Allows for easy spam filtering on thenethernet.com
// @license        GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html
// @copyright      2008-2009 David Severwright
// @include        http*://thenethernet.com/users/*/messages*
// @include        http*://*.thenethernet.com/users/*/messages*
// @exclude        http*://thenethernet.com/users/*/messages/*
// @exclude        http*://*.thenethernet.com/users/*/messages/*
// ==/UserScript==

/*
	Copyright (C) 2008-2009 David Severwright

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/*
	Documentation:
	This script is for filtering out crappy messages on thenethernet.
	To select messages you can click on the red icon beside a message (only appears on hover) or use the checkboxes to bulk-select.
	Once you have some messages selected you can hit the delete button to get rid of them.
	To change the default selected messages, set the checkboxes how you want them, and click the button in the menu.  (right click on the monkey in the toolbar)
	To filter a specific user you can click the "Tard" button by their name.  Once the page is refreshed they will be added to the filter list.  You can click the X in the list to remove them.
*/

// The ul that holds all messages.
var msgList = document.getElementById("post_list");
// Array of all the messages.
var msgBoxes = msgList.getElementsByTagName("tr");
// Your authenticity_token.
var authenticity_token = document.getElementsByName("authenticity_token")[0].value;
// Need your username in the request.
var username = document.getElementById("navUser").getElementsByTagName("a")[0].textContent;

var ver = "2.5.2";

// One stop shop to change the catagorys and what they match.
// The 5 args to addCB are text, id, username, description (tooltip), and regex.
function addOptions()
{
	addCB("Tools");
	addCB("Mines",				"mines",		"^TheNethernet$",	"Select all mine related messages",			"just tripped one of your mines!|You left this mine at");
	addCB("Crates",				"crates",		"^TheNethernet$",	"Select all crate related messages",		"just looted your.+crate on|just looted one of your crates|just looted the crate you left at|left something on your profile! I wonder what it is\?");
	addCB("St. Nicks",			"nicks",		"^TheNethernet$",	"Select all nick related messages",			"just triggered one of your St. Nicks!|Your St. Nick just caught");
	addCB("'splody Crates",		"tcrate",		"^TheNethernet$",	"Select all exploding crate messages",		"was just blown up looting your exploding crate on");
	addCB("Watchdogs",			"watchdog",		"^TheNethernet$",	"Select all watchdog related messages",		"Your watchdog just hounded.+away from");
	addCB("Portals",			"portal",		"^TheNethernet$",	"Select all portal related messages",		"Someone has taken your portal on|was transported from");
	addCB("Grenades",			"grenades",		"^TheNethernet$",	"Select all grenade related messages",		"Your grenade smashed.+'s armor|just ate your grenade!");
	addCB("Puzzle Crates",		"puzzlecrates",	"^TheNethernet$",	"Select all puzzle crate related messages",	"just looted your.+puzzle crate on|just looted one of your puzzle crates|just looted the puzzle crate you left at|left something on your profile! I wonder what it is\?");
	addCB("DPCards",			"dpcard",		"^TheNethernet$",	"Select all DP card related messages",		"just found your DP Card");
	addCB("Level Up",			"level",		"^TheNethernet$",	"Select level up messages.",				"You have reached level");
	addCB("All from TNN",		"alltnn",		"^TheNethernet$",	"Select all TNN messages",					"");
	addCB("Players");
	addCB("Thank You!",			"thanks",		"",					"Select all of the \"Thanks!\" default messages.", "^Thank You!|^Thanks!$");
	addCB("WTF!?!",				"wtf",			"",					"Select all of the \"Whiskey Tango Foxtrot M8!\" default messages.", "^Whiskey Tango Foxtrot M8!$");
	addCB("Mission Invites",	"mission",		"^TheNethernet$",	"Select spamvites to crappy missions.",		"thinks you should take this mission");
	addCB("All from players",	"all",			"^(?!TheNethernet).*$", "Select all messages from other players",	"");///@bug need a regex guru.
	loadTards();
	addCB("");
	addCB("All Messages",		"all",			"",					"Select all messages",						"");
}

// Deletes one message, and removed it from the list once we hear back that its really gone.
function delmsg(msgid)
{
	GM_xmlhttpRequest({
		method:"POST",
		url:"http://thenethernet.com/users/" + username + "/messages/" + msgid,
		data:"authenticity_token=" + authenticity_token + "&_method=delete",
		headers:{
			"User-Agent":"Mozilla/5.0",
			"Accept":"text/javascript, text/html, application/xml, text/xml, */*",
			"Content-Length":"74",
			"X-DavidSev-Spam-Filter":ver,
			"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
		},
		onload:function(details) {
			if (details.responseText == "ok")
			{
				var tr = document.getElementById("msgrow_" + msgid);
				tr.parentNode.removeChild(tr);
				calcTotals();
			}
		}
	});
}

// Adds a checkbox to the list.
function addCB(text, id, name, title, regex, tard)
{
	// Get the toolbar.
	var toolbar = $("GM_DavidSev_spam_toolbar");
	
	// Make a new row in the table, and colour it.
	var tr = document.createElement("tr");
	if (toolbar.getElementsByTagName("tr").length%2)
		tr.className = "whiteEven";
	else
		tr.className = "whiteOdd";
	toolbar.appendChild(tr);

	// If no id was specified, then this is a title.
	if (!id)
	{
		// Mark it so we know it's not a real check box.
		tr.setAttribute("GM_DavidSev_spam_ignore", true);
		var td = document.createElement("td");
		td.colSpan = 4;
		var strong = document.createElement("strong"); // h3 would be nice, but blows up.
		strong.appendChild(document.createTextNode(text));
		// If it not the first, add a br for padding.  ///@todo bin this for some CSS.
		if (toolbar.getElementsByTagName("tr").length > 1)
			td.appendChild(document.createElement("br"));
		td.appendChild(strong);
		tr.appendChild(td);
		return;
	}

	tr.title = title;
	tr.setAttribute("GM_DavidSev_spam_regex", regex);
	tr.setAttribute("GM_DavidSev_spam_name", name);
	tr.setAttribute("GM_DavidSev_spam_id", id);
	var tdname = document.createElement("td");
	if (!tard)
		tdname.colSpan = 2;
	var label = document.createElement("label");
	label.id = "GM_DavidSev_spam_" + id + "_label";
	label.htmlFor = "GM_DavidSev_spam_" + id + "_CB";
	label.appendChild(document.createTextNode(text));
	tdname.appendChild(label);
	tr.appendChild(tdname);
	// If a tard, add the del button.
	if (tard)
	{
		var deltd = document.createElement("td");
		var deldiv = document.createElement("div");
		deldiv.className = "GM_DavidSev_spam_delTardLink";
		deldiv.addEventListener("click", delTard, false);
		deltd.appendChild(deldiv);
		tr.appendChild(deltd);
	}
	var tdcb = document.createElement("td");
	var cb = document.createElement("input");
	cb.type = "checkbox";
	cb.id = "GM_DavidSev_spam_" + id + "_CB";
	cb.checked = GM_getValue("defaults." + id, false);
	cb.addEventListener("change", recalcTargets, false);
	tdcb.appendChild(cb);
	tr.appendChild(tdcb);
	var tdcount = document.createElement("td");
	tdcount.appendChild(document.createTextNode("0"));
	tdcount.id = "GM_DavidSev_spam_" + id + "_count";
	tdcount.className = "GM_DavidSev_spam_count";
	tr.appendChild(tdcount);
}

// Makes the initial toolbar and fills it.
function makeToolBar()
{
	var toolbar = document.createElement("table");
	toolbar.id = "GM_DavidSev_spam_toolbar";
	
	var newbox = document.createElement("div");
	newbox.className = "module width240";
	newbox.style.marginTop = "20px";
	var head = document.createElement("h2");
	head.appendChild(document.createTextNode("Spam Filter"));
	document.getElementById("copy").getElementsByClassName("column width240")[0].appendChild(newbox);
	newbox.appendChild(head);
	newbox.appendChild(toolbar);
	
	addOptions();
	
	var button = document.createElement("input");
	button.id = "GM_DavidSev_spam_delbutton"
	button.value = "Delete!"
	button.type = "button";
	button.addEventListener("click", deleteSelected, false);
	button.title = "Delete all selected messages.";
	toolbar.appendChild(button);
}

// Event handler for when you click a message's delete icon.
function toggleMessage(e)
{
	var tr = this.parentNode.parentNode;
	if (tr.getAttribute("GM_DavidSev_spam_toBeDeleted") == 1)
	{
		tr.setAttribute ("GM_DavidSev_spam_toBeDeleted", 0);
		tr.setAttribute ("GM_DavidSev_spam_customSet", 0);
	}
	else
	{
		tr.setAttribute ("GM_DavidSev_spam_toBeDeleted", 1);
		tr.setAttribute ("GM_DavidSev_spam_customSet", 1);
	}
}

function calcTotals()
{
	var labels = $("GM_DavidSev_spam_toolbar").getElementsByTagName("tr");
	
	for (var j = 0; j < labels.length; j++)
	{
		if (!labels[j].getAttribute("GM_DavidSev_spam_ignore"))
			labels[j].getElementsByClassName("GM_DavidSev_spam_count")[0].firstChild.data = 0;
	}
	
	for (i = 0; i < msgBoxes.length; i++)
	{
		var name = msgBoxes[i].getElementsByTagName("td")[1].getElementsByTagName("a")[0].textContent;
		var text = msgBoxes[i].getElementsByTagName("td")[2].getElementsByTagName("p")[0].textContent;
		
		for (var j = 0; j < labels.length; j++)
		{
			if (labels[j].getAttribute("GM_DavidSev_spam_ignore"))
				continue;

			if (text.match(labels[j].getAttribute("GM_DavidSev_spam_regex"))
				&& name.match(labels[j].getAttribute("GM_DavidSev_spam_name")))
			{
				var counter = labels[j].getElementsByClassName("GM_DavidSev_spam_count")[0].firstChild;
				counter.data = (counter.data*1) + 1;
			}
		}
	}
}

// Recalculates all the messages when a checkbox is hit.
function recalcTargets(e)
{
	var labels = $("GM_DavidSev_spam_toolbar").getElementsByTagName("tr");

	for (i = 0; i < msgBoxes.length; i++)
	{
		if(msgBoxes[i].getAttribute("GM_DavidSev_spam_customSet") == 1)
			continue;
		else
			msgBoxes[i].setAttribute ("GM_DavidSev_spam_toBeDeleted", 0);

		var name = msgBoxes[i].getElementsByTagName("td")[1].getElementsByTagName("a")[0].textContent;
		var text = msgBoxes[i].getElementsByTagName("td")[2].getElementsByTagName("p")[0].textContent;
		
		for (var j = 0; j < labels.length; j++)
		{
			if (labels[j].getAttribute("GM_DavidSev_spam_ignore"))
				continue;
			
			if (labels[j].getElementsByTagName("input")[0].checked
				&& text.match(labels[j].getAttribute("GM_DavidSev_spam_regex"))
				&& name.match(labels[j].getAttribute("GM_DavidSev_spam_name")))
			{
				msgBoxes[i].setAttribute ("GM_DavidSev_spam_toBeDeleted", 1);
			}
		}
	}
}

// Event handler for the delete button.
function deleteSelected()
{
	var count = 0;
	for (i = 0; i < msgBoxes.length; i++)
	{
		if (msgBoxes[i].getAttribute ("GM_DavidSev_spam_toBeDeleted") == 1)
		{
			count++;
		}
	}
	
	if (!confirm("The " + count + " selected messages will go BOOM!\nAre you sure?"))
		return;
	
	for (i = 0; i < msgBoxes.length; i++)
	{
		if (msgBoxes[i].getAttribute ("GM_DavidSev_spam_toBeDeleted") == 1)
		{
			delmsg(msgBoxes[i].id.substr(7));
		}
	}
}

function addTard(e)
{
	var name = this.previousSibling.textContent;
	GM_setValue("tards." + name, true);
}

function loadTards()
{
	var settings = GM_listValues();
	var firstTard = true;
	
	for (var i = 0; i < settings.length; i++)
	{
		if (matches = settings[i].match("^tards\.(.*)$"))
		{
			if(firstTard)
				addCB("Tards");
			firstTard = false;
			var name = matches[1];
			addCB(name, "tard-"+name, "^"+name+"$", "Select all crate messages from user " + name, "", true);
		}
	}
}

function delTard(e)
{
	var name = this.parentNode.parentNode.getAttribute("GM_DavidSev_spam_id").substr(5);
	GM_deleteValue("tards." + name);
	GM_deleteValue("defaults.tard-" + name);
	this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);
}

function addDeleteIcons()
{
	for (i = 0; i < msgBoxes.length; i++)
	{
		var theDiv = document.createElement("div");
		theDiv.addEventListener("click", toggleMessage, false);
		var td = msgBoxes[i].getElementsByTagName("td")[0];
		td.insertBefore(theDiv, td.firstChild);
		
		var nameLink = msgBoxes[i].getElementsByTagName("td")[1].getElementsByTagName('a')[0];
		var tardLink = document.createElement("div");
		tardLink.className = "GM_DavidSev_spam_addTardLink";
		tardLink.addEventListener("click", addTard, false);
		nameLink.parentNode.appendChild(tardLink);
	}
}

function initMenu()
{
	GM_registerMenuCommand("Set default filter.", saveDefaults);
}

function saveDefaults()
{
	var labels = $("GM_DavidSev_spam_toolbar").getElementsByTagName("tr");
	for (var i = 0; i < labels.length; i++)
	{
		if (labels[i].getAttribute("GM_DavidSev_spam_ignore"))
			continue;
		GM_setValue("defaults." + labels[i].getAttribute("GM_DavidSev_spam_id"), labels[i].getElementsByTagName("input")[0].checked);
	}
}

// Gets an element or array or elements.
function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}

GM_addStyle((<r><![CDATA[
	#GM_DavidSev_spam_toolbar
	{
		overflow: hidden;
		width: 210px;
	}
	#GM_DavidSev_spam_toolbar td label
	{
		float: left;
		width: 100%;
	}
	div#post_list td.avatar > div:first-child
	{
		background-image: url('data:image/png;base64,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');
		background-position: center right;
		background-repeat: no-repeat;
		width: 50px;
		height: 50px;
		position: absolute;
		margin-top: 5px;
		margin-left: -75px;
		opacity: 0;
	}
	div#post_list tr:hover td.avatar > div:first-child
	{
		opacity:0.25;
	}
	div#post_list tr[GM_DavidSev_spam_toBeDeleted="1"] td.avatar > div:first-child
	{
		opacity:1;
	}
	div.GM_DavidSev_spam_addTardLink
	{
		display: inline;
		position: absolute;
		background-image: url('data:image/gif;base64,R0lGODlhEAAQAPcHAAAAAAATyDdK/1Vl/3OA/5Gb/6+3/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAHACwAAAAAEAAQAAAIhQAPCBQYoKDBgQgPFBTAsGHBhAEASBxAcYBEAQEGBmAIgCIBAhYBMMyoUIDFjx8BgBSZcaNJlQViSryIcSNFADENGMBJoGNNkx8L6NRZ4OOAnwOCDjVQFCTSmUJ3Tjy6UIDKnjJTjiw5E6VKixgJWr2Z8mZYgiLHhmQJ0WXDmgk1GnyIMCAAOw==');
		margin-left: 2px;
		border: none;
		width: 16px;
		height: 16px;
	}
	div.GM_DavidSev_spam_delTardLink
	{
		background-image: url('data:image/gif;base64,R0lGODlhEAAQAPcAAJwAAJxjY84AAM4xMdbWzv8AAP9jAP+cMf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAQALAAAAAAQABAAAAhWAAkIHEiw4MAAAgIYHCiA4YECAAwKiEhQQAGIFSlKxEhg4kKBFil6/NgR4kiSJTWSDMnxY0iBLQu+HBhT4AADDQsWMHgzJ8GdBAc8VEkzaE2SRHUSCAgAOw==');
		border: none;
		width: 16px;
		height: 16px;
	}
]]></r>).toString());

makeToolBar();
addDeleteIcons();
initMenu();
calcTotals();
recalcTargets();