There are 2 previous versions of this script.
// ==UserScript==
// @name reddit - Ignore Douchebags
// @namespace http://jobson.us
// @description Adds an option to ignore douchebags, flamers, and other assholes.
// @include http://*.reddit.com/*
// @include http://reddit.com/*
// ==/UserScript==
var console = (unsafeWindow.console) ? unsafeWindow.console : '';
var li = setupLI(); // add, del, show
var ul = scanPage(); // Get all comment link sets
var db = {
list: douchebags('get'),
add: function(el) {
var user = getUser(el.parentNode);
douchebags('add',user);
douchebagScan();
},
del: function(el) {
var user = getUser(el.parentNode);
douchebags('del',user);
douchebagScan();
},
show: function(el) {
var u = el.parentNode;
toggle(u.parentNode.getElementsByClassName('commentbody')[0],'show');
toggle(u.getElementsByClassName('dbDel')[0],'show');
toggle(u.getElementsByClassName('dbShow')[0],'hide');
}
}
String.prototype.isDouchebag = function() {
for (var i=0;i<db.list.length;i++) {
if (db.list[i] == this) return true;
}
return false;
}
modifyCSS();
addDBLinks();
douchebagScan();
function douchebagScan() {
for (var i=0;i<ul.length;i++) {
var user = getUser(ul[i]);
if (user.isDouchebag()) {
toggle(ul[i].parentNode.getElementsByClassName('commentbody')[0],'hide');
toggle(ul[i].getElementsByClassName('dbAdd')[0],'hide');
toggle(ul[i].getElementsByClassName('dbDel')[0],'hide');
toggle(ul[i].getElementsByClassName('dbShow')[0],'show');
} else {
toggle(ul[i].parentNode.getElementsByClassName('commentbody')[0],'show');
toggle(ul[i].getElementsByClassName('dbDel')[0],'hide');
toggle(ul[i].getElementsByClassName('dbShow')[0],'hide');
toggle(ul[i].getElementsByClassName('dbAdd')[0],'show');
}
}
}
function toggle(node,state) {
node.style.display = (state=='hide') ? 'none' : '';
}
function addDBLinks() {
for (var i=0;i<ul.length;i++) {
var l;
l = ul[i].appendChild(li.add.cloneNode(true));
l.addEventListener('click',function() { db.add(this); },false);
l = ul[i].appendChild(li.del.cloneNode(true));
l.addEventListener('click',function() { db.del(this); },false);
l = ul[i].appendChild(li.show.cloneNode(true));
l.addEventListener('click',function() { db.show(this); },false);
}
}
function getUser(node) {
return node.parentNode.getElementsByTagName('p')[0].getElementsByTagName('a')[0].innerHTML;
}
function douchebags(key,val) {
switch(key) {
case 'add':
db.list.push(val);
GM_setValue('douchebags',db.list.join(','));
db.list = douchebags('get');
break;
case 'del':
var d = [];
for (var i=0;i<db.list.length;i++) {
if (db.list[i]==val) continue;
d.push(db.list[i]);
}
GM_setValue('douchebags',d.join(','));
db.list = douchebags('get');
break;
case 'get':
return (GM_getValue('douchebags')) ? GM_getValue('douchebags').split(',') : [];
break;
}
}
function scanPage() {
var sets = document.getElementsByClassName('flat-list');
var out = [];
for (var i=0;i<sets.length;i++) {
// Check to make sure we're in the comment section.
if ((sets[i].getElementsByTagName('li').length<3 || sets[i].getElementsByTagName('li').length>4)) continue;
if (sets[i].getElementsByTagName('li')[0].getElementsByTagName('a')[0].innerHTML != 'permalink') continue;
out.push(sets[i]);
}
return out;
}
function setupLI() {
var out = {};
var li = document.createElement('li');
li.style.color = '#888888';
li.style.fontWeight = 'bold';
out.add = li.cloneNode('true');
addClass(out.add,'dbAdd');
out.add.appendChild(document.createTextNode('add douchebag'));
out.del = li.cloneNode('true');
addClass(out.del,'dbDel');
out.del.appendChild(document.createTextNode('not a douchebag'));
out.show = li.cloneNode('true');
addClass(out.show,'dbShow');
out.show.appendChild(document.createTextNode('show douchebag\'s comment'));
return out;
}
function modifyCSS() {
var s = document.styleSheets[0];
s.insertRule('li.dbAdd { cursor: pointer; }',s.cssRules.length);
s.insertRule('li.dbDel { cursor: pointer; }',s.cssRules.length);
s.insertRule('li.dbShow { cursor: pointer; }',s.cssRules.length);
}
function hasClass(ele,cls) {
return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
function addClass(ele,cls) {
if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
if (hasClass(ele,cls)) {
var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
ele.className=ele.className.replace(reg,' ');
}
}
