ATN.DNFTT

By шкіпер Last update Dec 18, 2009 — Installed 85 times.

There are 13 previous versions of this script.

// ==UserScript==
// @name		  ATN.DNFTT
// @namespace	  ant.kharkov.ua
// @description	  Не годуйте тролів - не відповідайте на провокації
// @include		  http://forum.atn.kharkov.ua/viewtopic.php*
// @version		  1.0.2
// @license		  Public domain
// ==/UserScript==

var trolls = getTrolls();
var anonymousGoHome = isAnonymousGoHome();

// Проводимо санитарну обробку сторінки
testLists();
// Додаємо до меню GM пункт редагування списку тролів.
GM_registerMenuCommand("Редагування списку тролів форуму", editTrollList);
// Додаємо до меню GM пункт зміни режиму читання анонімусів.
GM_registerMenuCommand("Перемикач анонімусів", switchAnonymous);

/*
 * Далі йдуть функції, що визиваються під час фільтрації контенту
 */

/*
 * Знаходимо списки повідомлень
 */
function testLists() {
	thread = document.evaluate('id("pagecontent")', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
	if (thread) {
		messages = document.evaluate('child::table[@class="tablebg"]', thread, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
		for (var i = 0; i < messages.snapshotLength; i++)
			doCatchTrolls(messages.snapshotItem(i));
	}
}

/*
 * Головна функція, що керуе відловом повідомлень тролів
 */
function doCatchTrolls(cell) {
	// Перевірка ніка автора
	nick = document.evaluate('child::tbody/tr/td/b[@class="postauthor"]', cell, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
	if (nick) {
		userdetails = document.evaluate('child::tbody/tr/td[@class="profile"]/span', cell, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
		anonymousUser = isAnonymous(userdetails);
		// Перевірив чи не троль це.
		// У випадку, якщо ви ввімкнули фільтрацію анонімусів,
		// також перевіряю - чи це не анонімус часом.
		if (isTroll(nick, anonymousUser) || (anonymousGoHome && anonymousUser))
			markFlame(cell, nick);
		else
			// Якщо це не троль, реєструємо функцію, що дозволяє вам додати його
			// до списку. При бажанні звісно.
			nick.addEventListener("click", addTroll, false);
	}
}

/*
 * Ця функція відновлює список тролів
 */
function getTrolls() {
	trollList = GM_getValue("trollList");
	if (!trollList) {
		GM_setValue("trollList", "Поки що тут нічого немає, додайте нік. Розділяйте ніки знаком \";\".");
		trollList = GM_getValue("trollList");
	}
	return trollList.split(';');
}

/*
 * Перевірка - показувати анонімусів чи ні.
 */
function isAnonymousGoHome() {
	property = GM_getValue("anonymousGoHome");
	if (!property) {
		GM_setValue("anonymousGoHome", false);
		property = GM_getValue("anonymousGoHome");
	}
	return property;
}

/*
 * Ця функція звіряє нік з іменами відомих тролів. Якщо ім'я включає в себе
 * символ ";", такий нік автоматично вважається тролем. Оскільки
 * цей символ розділяє ніки у списку тролів.
 */
function isTroll(nick, anonymousUser) {
	nickname = nick.textContent;

	if (nickname.indexOf(";") >= 0)
		return true; // Спроба обійти скрипт!!
	for (var i = 0; i < trolls.length; i++)
		if (nickname.toLowerCase() == trolls[i].toLowerCase())
			return true;
	if (!anonymousUser)
		return false;

	if (nickname.length < 3 || bzdyschDetected(nickname))
		return true;

	return false;
}

/*
 * Детальная інформація про не зареєстрованих відвідувачів починається зі
 * слова "Гость".
 */
function isAnonymous(userdetails) {
	if (userdetails.textContent.indexOf("Зарегистрирован:") == -1)
		return true;

	return false;
}

/*
 * Зкриваю повідомленя.
 */
function markFlame(cell, nick) {
	nickname = nick.textContent;
	altText = document.createTextNode(nick.textContent + ' шось нацарапав');
	altTD = document.createElement("TD");
	altTR = document.createElement("TR");
	altTD.appendChild(altText);
	altTR.appendChild(altTD);
	cell.parentNode.replaceChild(altTR, cell);
}

/*
 * Ця функція надає вам можливість додати троля до скиску
 * простим кліком миші на його ніку біля повідомлення.
 */
function addTroll(event) {
	nickname = event.target.textContent;
	if (!confirm(nickname + " троль?"))
		return;
	trollList = "";
	for (var i = 0; i <= trolls.length - 1; i++) {
		if (nick == trolls[i])
			return;
		else
			trollList += trolls[i] + ";";
	}
	trolls.push(nickname);
	trollList += nickname;
	GM_setValue("trollList", trollList);
	testLists();
}

/*
 * Ця функція надає можливості редагувати
 * список тролів
 */
function editTrollList() {
	editMessage = "Редагування списку тролів.\nНікі тролів повинні розділятись знаком \";\" (крапка з комою).";
	confirmMessage = "Ви бажаєте зберегти редагування?\n\n";
	trollList = "";
	for (var i = 0; i <= trolls.length - 2; i++) {
		trollList += trolls[i] + ";";
	}
	trollList += trolls[trolls.length - 1];
	trollList = prompt(editMessage, trollList);
	if (trollList && confirm(confirmMessage + trollList)) {
		GM_setValue("trollList", trollList);
		troll = getTrolls();
		window.location.href = window.location.href;
	}
}

/*
 * Гроза усіх анонімусів
 */
function switchAnonymous() {
	property = GM_getValue("anonymousGoHome")
	if (property) {
		message = "Зараз ви не бачите дописів анонімних авторів.\n\nБажаєте вимкнути цей режим?";
	} else {
		message = "Зараз ви маєте змогу читати дописи анонімних авторів.\n\nБажаєте ввімкнути режим \"без анонімусів\"?";
	}
	if (confirm(message)) {
		GM_setValue("anonymousGoHome", !property);
		window.location.href = window.location.href;
	}
}

/*
 * bzdysch detected
 */
function bzdyschDetected(nickname) {
	trollsign = new Array(':', '~', '`', '#', '+', '=', '/', '\\', '$', '%', '^', '*', '&', '{', '}', '[', ']', '|', '<', '>', '?', '!');
	numberPattern = /^[0-9]+$/;
	repeatPattern = /(.)\1{2,}/;
	repeatSignPattern = /(,|\.|-|"|'|@|_|№){2,}/;
	tooManySignPattern = /(,.+|\..+|-.+|".+|'.+|@.+|_.+|№.+|[0-9].+|\s){3,}/;


	if (numberPattern.test(nickname))
		return true;
	if (repeatPattern.test(nickname) || repeatSignPattern.test(nickname))
		return true;
	if (tooManySignPattern.test(nickname))
		return true;
	for (var i = 0; i < trollsign.length; i++)
		if (nickname.indexOf(trollsign[i]) >= 0)
			return true;
}