(function () {
"use strict";
// ==UserScript==
// @name uso - Spam Zapper
// @namespace http://userscripts.org/users/37004
// @description Background requests for spam buttons and native USO alteration to the post when marked as spam.
// @copyright 2013+, Marti Martz (http://userscripts.org/users/37004)
// @contributor Jesse Andrews (http://userscripts.org/users/2)
// @contributor LouCypher (http://userscripts.org/users/12)
// @contributor Ryan Chatham (http://userscripts.org/users/220970)
// @license CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
// @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @version 1.1.13.1eol
// @icon https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/Spam%20Zapper/res/icon48.png
// @homepageURL https://github.com/Martii/UserScripts/tree/master/src/uso/Spam%20Zapper
// @homepageURL https://openuserjs.org/scripts/Marti/uso_-_Spam_Zapper
// @homepageURL http://userscripts.org/scripts/show/398715
// @supportURL http://userscripts.org/topics/197997
// @include /^https?://userscripts\.org(?::\d{1,5})?/posts/
// @include /^https?://userscripts\.org(?::\d{1,5})?/topics/
// @include /^https?://userscripts\.org(?::\d{1,5})?/groups/.*/topics/
// @include /^https?://userscripts\.org(?::\d{1,5})?/scripts/discuss//
// @include /^https?://userscripts\.org(?::\d{1,5})?/forums//
// @include /^https?://userscripts\.org(?::\d{1,5})?/users/.*/posts/
// @include /^https?://userscripts\.org(?::\d{1,5})?/scripts/show/398715/
// @include http://userscripts.org:8080/posts*
// @include http://userscripts.org:8080/topics*
// @include http://userscripts.org:8080/groups/*/topics*
// @include http://userscripts.org:8080/scripts/discuss/*
// @include http://userscripts.org:8080/forums/*
// @include http://userscripts.org:8080/users/*/posts*
// @include http://userscripts.org:8080/scripts/show/398715
// @include http://userscripts.org/posts*
// @include http://userscripts.org/topics*
// @include http://userscripts.org/groups/*/topics*
// @include http://userscripts.org/scripts/discuss/*
// @include http://userscripts.org/forums/*
// @include http://userscripts.org/users/*/posts*
// @include http://userscripts.org/scripts/show/398715
// @include https://userscripts.org/posts*
// @include https://userscripts.org/topics*
// @include https://userscripts.org/groups/*/topics*
// @include https://userscripts.org/scripts/discuss/*
// @include https://userscripts.org/forums/*
// @include https://userscripts.org/users/*/posts*
// @include https://userscripts.org/scripts/show/398715
// @resource icon https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/Spam%20Zapper/res/icon32.png
// @resource gmc https://raw.githubusercontent.com/sizzlemctwizzle/GM_config/master/gm_config_icon.png
// @require https://raw.githubusercontent.com/sizzlemctwizzle/GM_config/44d73b4a5418a6fb6a0e03c59ae1dc173eb4e353/gm_config.js
// @grant GM_addStyle
// @grant GM_deleteValue
// @grant GM_getResourceURL
// @grant GM_getValue
// @grant GM_log
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
/**
*
*/
var
gDEBUG,
gRETRIES = 3,
gLOGGEDIN = document.querySelector("body.loggedin"),
gPROTOCOL = location.protocol,
gPATHNAME = location.pathname,
gSEARCH = location.search,
gSPAMQSP = (/^(?:1)$/.test(getQsp(gSEARCH, "spam"))),
gUSERPOSTS = /^\/users\/\d+\/posts/.test(gPATHNAME),
gISHOMEPAGE = /^\/scripts\/show\//.test(gPATHNAME),
gISFRAMELESS = false,
gUSERNAME
;
try {
gISFRAMELESS = (window == window.top);
}
catch (e) {}
/**
*
*/
function getQsp(aQs, aName) {
aQs = aQs.replace(/^\?/, "");
var qsps = aQs.split("&");
for (var i = 0, qsp; qsp = qsps[i++];) {
var qspnv = qsp.split("=");
var name = qspnv[0];
var value = qspnv[1];
if (name == aName)
return value;
}
return null;
}
/**
*
*/
function replaceQsp(aQs, aName, aValue) {
aQs = aQs.replace(/^\?/, "");
var newQs = [];
var found;
var qsps = aQs.split("&");
for (var i = 0, qsp; qsp = qsps[i++];) {
var qspnv = qsp.split("=");
var name = qspnv[0];
var value = qspnv[1];
if (name == aName) {
value = aValue;
found = true;
}
newQs.push(name + "=" + value);
}
if (!found)
newQs.push(aName + "=" + aValue);
if (newQs.length > 0)
return ("?" + newQs.join("&"));
}
/**
*
*/
function autoPaging() {
var currPage = getQsp(gSEARCH, "page");
if (!currPage) {
currPage = "1";
}
var currPagex = parseInt(currPage);
if (direction == "prev") {
if (currPage != 1) {
var paginationNode = document.querySelector('.pagination');
var prev_pageNode = paginationNode.querySelector('.prev_page');
if (prev_pageNode && !prev_pageNode.classList.contains('disabled'))
location.replace(replaceQsp(gSEARCH, "page", currPagex - 1));
}
}
else {
var paginationNode = document.querySelector('.pagination');
var next_pageNode = paginationNode.querySelector('.next_page');
if (next_pageNode && !next_pageNode.classList.contains('disabled'))
location.replace(replaceQsp(gSEARCH, "page", currPagex + 1));
}
}
/**
*
*/
function hidePost(aNode) {
aNode.classList.add("hide");
if (aNode.nextSibling && aNode.nextSibling.nextSibling)
aNode.nextSibling.nextSibling.classList.add("hide");
}
/**
*
*/
function submitSpam(aRetries, aNode) {
var data;
var formNode = aNode.querySelector('form[method="post"][action="/spam"]');
if (formNode) {
var authenticity_tokenNode = formNode.querySelector('input[name="authenticity_token"]'),
target_idNode = formNode.querySelector('input#target_id'),
target_typeNode = formNode.querySelector('input#target_type')
;
if (authenticity_tokenNode && target_idNode && target_typeNode) {
var authenticity_token = authenticity_tokenNode.getAttribute("value"),
target_id = target_idNode.getAttribute("value"),
target_type = target_typeNode.getAttribute("value")
;
data = (
"authenticity_token=" + encodeURIComponent(authenticity_token)
+ "&target_id=" + target_id
+ "&target_type=" + target_type
+ "&spam=true&commit=SPAM"
);
}
}
if (gDEBUG)
console.log('SPAM: ' + data);
var req = new XMLHttpRequest();
req.open('POST', "/spam");
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.setRequestHeader("Content-length", data.length);
req.onreadystatechange = function () {
if (this.readyState == this.DONE) {
switch (this.status) {
case 502:
if (aRetries-- > 0)
setTimeout(submitSpam, 500, aRetries, aNode);
break;
case 200:
if (gSPAMQSP && !aNode.classList.contains("spam")) {
var countNode = aNode.querySelector(".body p.topic em");
var matches = countNode.textContent.match(/(\d+)/);
if (matches) {
var count = parseInt(matches[1]);
countNode.textContent = "(" + ++count + ")";
}
}
aNode.classList.add("spam");
aNode.classList.remove("bad-ham");
postids[target_id] = new Date().getTime();
GM_setValue("postids", JSON.stringify(postids, null, ""));
break;
default:
console.log('ERROR: Untrapped status code: ' + this.status);
break;
}
}
}
req.send(data);
}
/**
*
*/
function submitSpams(aRetries) {
idle = false;
var
node = queue[0],
data
;
var formNode = node.querySelector('form[method="post"][action="/spam"]');
if (formNode) {
var authenticity_tokenNode = formNode.querySelector('input[name="authenticity_token"]'),
target_idNode = formNode.querySelector('input#target_id'),
target_typeNode = formNode.querySelector('input#target_type')
;
if (authenticity_tokenNode && target_idNode && target_typeNode) {
var authenticity_token = authenticity_tokenNode.getAttribute("value"),
target_id = target_idNode.getAttribute("value"),
target_type = target_typeNode.getAttribute("value")
;
data = (
"authenticity_token=" + encodeURIComponent(authenticity_token)
+ "&target_id=" + target_id
+ "&target_type=" + target_type
+ "&spam=true&commit=SPAM"
);
}
}
if (gDEBUG)
console.log('SPAMS: ' + data);
var req = new XMLHttpRequest();
req.open('POST', "/spam");
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.setRequestHeader("Content-length", data.length);
req.onreadystatechange = function () {
if (this.readyState == this.DONE) {
switch (this.status) {
case 502:
if (aRetries-- > 0)
setTimeout(submitSpams, 500, aRetries);
break;
case 200:
if (gSPAMQSP && !node.classList.contains("spam")) {
var countNode = node.querySelector(".body p.topic em");
var matches = countNode.textContent.match(/^\((\d+)\)$/);
if (matches) {
var count = parseInt(matches[1]);
countNode.textContent = "(" + ++count + ")";
}
}
node.classList.add("spam");
node.classList.remove("bad-ham");
postids[target_id] = new Date().getTime();
GM_setValue("postids", JSON.stringify(postids, null, ""));
queue.shift();
var spamsNodes = document.querySelectorAll(".spams");
for (var i = 0, spamsNode; spamsNode = spamsNodes[i++];)
spamsNode.textContent = queue.length + ' Spams Queued';
if (queue.length > 0)
submitSpams(gRETRIES);
else {
idle = true;
var tbodyNode = node.parentNode,
postedNodes = tbodyNode.querySelectorAll("tr.post"),
spammedNodes = tbodyNode.querySelectorAll("tr.spam")
;
if (!gSPAMQSP && postedNodes.length > 0 && postedNodes.length == spammedNodes.length && direction != "")
autoPaging();
}
break;
default:
console.log('ERROR: Untrapped status code: ' + this.status);
break;
}
}
}
req.send(data);
}
/**
*
*/
function submitHam(aRetries, aNode) {
var data;
var formNode = aNode.querySelector('form[method="post"][action="/spam"]');
if (formNode) {
var authenticity_tokenNode = formNode.querySelector('input[name="authenticity_token"]'),
target_idNode = formNode.querySelector('input#target_id'),
target_typeNode = formNode.querySelector('input#target_type')
;
if (authenticity_tokenNode && target_idNode && target_typeNode) {
var authenticity_token = authenticity_tokenNode.getAttribute("value"),
target_id = target_idNode.getAttribute("value"),
target_type = target_typeNode.getAttribute("value")
;
data = (
"authenticity_token=" + encodeURIComponent(authenticity_token)
+ "&target_id=" + target_id
+ "&target_type=" + target_type
+ "&spam=false&commit=NOT+SPAM"
);
}
}
if (gDEBUG)
console.log('HAM: ' + data);
var req = new XMLHttpRequest();
req.open('POST', "/spam");
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.setRequestHeader("Content-length", data.length);
req.onreadystatechange = function () {
if (this.readyState == this.DONE) {
switch (this.status) {
case 502:
if (aRetries-- > 0)
setTimeout(submitHam, 500, aRetries, aNode);
break;
case 200:
if (gSPAMQSP && aNode.classList.contains("spam")) {
var countNode = aNode.querySelector(".body p.topic em");
var matches = countNode.textContent.match(/^\((\d+)\)$/);
if (matches) {
var count = parseInt(matches[1]);
countNode.textContent = "(" + --count + ")";
}
}
aNode.classList.remove("spam");
aNode.classList.remove("bad-ham");
var spampollNode = aNode.querySelector(".spam_poll");
if (spampollNode)
spampollNode.classList.add("hide");
delete postids[target_id];
GM_setValue("postids", JSON.stringify(postids, null, ""));
break;
default:
console.log('ERROR: Untrapped status code: ' + this.status);
break;
}
}
}
req.send(data);
}
/**
*
*/
function spamClick(ev) {
ev.preventDefault();
ev.stopPropagation();
var thisNode = ev.target;
var trNode;
if (thisNode.parentNode.parentNode.classList.contains("spam_poll"))
trNode = thisNode.parentNode.parentNode.parentNode.parentNode;
else
trNode = thisNode.parentNode.parentNode.parentNode;
trNode.classList.add("bad-ham");
if (gUSERPOSTS)
trNode.classList.add("clip");
if (!gSPAMQSP && !gUSERPOSTS && gmcHome.get('hideTaggedSpams'))
hidePost(trNode);
submitSpam(gRETRIES, trNode);
}
/**
*
*/
function spamsClick(ev) {
ev.preventDefault();
ev.stopPropagation();
var thisNode = ev.target;
var trNode = thisNode.parentNode.parentNode;
var authoridNode = trNode.querySelector('.author a[user_id]') || trNode.querySelector('.author a[href^="/users/"]') || document.querySelector('#root #section h2 a[href^="/users/"]');
if (confirm('Are you absolutely sure you want to permanently mark user\n\n\t' + authoridNode.textContent + '\n\nas a spammer?\n\u00A0')) {
var authorid = authoridNode.getAttribute("user_id") || authoridNode.getAttribute("href").match(/(\d+)$/)[1];
authorids[authorid] = new Date().getTime();
GM_setValue("authorids", JSON.stringify(authorids, null, ""));
var postNodes = document.querySelectorAll('.post');
for (var i = 0, postNode; postNode = postNodes[i]; ++i) {
var authorNode = postNode.querySelector('.author a[user_id]') || postNode.querySelector('.author a[href^="/users/"]') || document.querySelector('#root #section h2 a[href^="/users/"]');
if (authorNode) {
var id = authorNode.getAttribute("user_id") || authorNode.getAttribute("href").match(/(\d+)$/)[1];
if (id == authorid) {
postNode.classList.add("bad-ham");
if (gUSERPOSTS)
postNode.classList.add("clip");
if (!gSPAMQSP && !gUSERPOSTS && gmcHome.get('hideTaggedSpams'))
hidePost(postNode);
queue.push(postNode);
}
}
}
var queued = queue.length;
if (queued > 0) {
var spamsNodes = document.querySelectorAll(".spams");
for (var i = 0, spamsNode; spamsNode = spamsNodes[i++];)
spamsNode.textContent = queue.length + ' Spams Queued';
if (idle)
submitSpams(gRETRIES);
}
}
}
/**
*
*/
function hamClick(ev) {
ev.preventDefault();
ev.stopPropagation();
var thisNode = ev.target;
var trNode;
if (thisNode.parentNode.parentNode.classList.contains("spam_poll"))
trNode = thisNode.parentNode.parentNode.parentNode.parentNode;
else
trNode = thisNode.parentNode.parentNode;
submitHam(gRETRIES, trNode);
}
function insertHook() {
var hookNode = document.getElementById("full_description");
if (hookNode && !hookNode.firstChild)
return hookNode.appendChild(document.createElement("div"));
else if (hookNode)
return (hookNode.insertBefore(document.createElement("div"), hookNode.firstChild));
else {
hookNode = document.getElementById("content");
if (hookNode) {
var nodeDiv = document.createElement("div");
var full_descriptionNodeDiv = document.createElement("div");
full_descriptionNodeDiv.id = "full_description";
full_descriptionNodeDiv.appendChild(nodeDiv);
return hookNode.appendChild(full_descriptionNodeDiv);
}
else {
if (gmcHome.get("enableDebugging"))
console.log("ERROR: USO DOM change detected... appending GMC remote to EoD");
return document.body.appendChild(document.createElement("div"));
}
}
}
/**
* Init
*/
var usernameNode = document.querySelector('.login_status a[href^="/home"]');
if (usernameNode)
gUSERNAME = usernameNode.textContent;
/** **/
if (typeof GM_configStruct == "undefined") {
if (gDEBUG)
console.error('Fatal error. GM_config not found');
return;
}
GM_config = null;
var gWriteSpammers = false,
gWriteSpams = false
;
var gmcHome = new GM_configStruct();
gmcHome.init({
id: "gmc398715home",
frame: (gISHOMEPAGE ? insertHook() : ""),
title:
[
'<img alt="Spam Zapper" title="uso – Spam Zapper" src="' + GM_getResourceURL("icon") + '" />',
'<p>Preferences</p>',
'<span>',
'<a href="' + gPROTOCOL + '//github.com/sizzlemctwizzle/GM_config/wiki/">',
'<img alt="GM_config" title="Powered in part by GM_config" src="' + GM_getResourceURL("gmc") + '" />',
'</a>',
'</span>'
].join(""),
css:
[
"@media screen, projection {",
"#gmc398715home { position: static !important; z-index: 0 !important; width: auto !important; height: auto !important; max-height: none !important; max-width: none !important; margin: 0 0 0.5em 0 !important; border: 1px solid #ddd !important; clear: right !important; }",
"#gmc398715home_header a { display: inline; }",
"#gmc398715home_header img { max-height: 32px; margin-right: 0.125em; vertical-align: middle; }",
"#gmc398715home_header > p { display: inline; margin: 0; vertical-align: middle; }",
"#gmc398715home_header span { float: right; }",
"#gmc398715home_header span > a { display: inline; margin-left: 0.25em; }",
"#gmc398715home_wrapper { background-color: #eee; padding-bottom: 0.25em; }",
"#gmc398715home .config_header { background-color: #333; color: #fff; font-size: 1.57em; margin: 0; padding: 0 0.5em; text-align: left; }",
"#gmc398715home .config_var { clear: both; margin: 0.33em; padding: 0; }",
"#gmc398715home .field_label { color: #333; font-size: 100%; font-weight: normal; margin: 0 0.25em; position: relative; top: -0.2em; }",
"#gmc398715home .section_header_holder { margin: 0.25em 0.5em !important; }",
"#gmc398715home .section_desc { margin: 0.25em 1.5em !important; }",
".gmc-yellownote { background-color: #ffd; font-size: 0.66em !important; }",
".gmc398715home-invisilink { text-decoration: none; color: #000; }",
".gmc398715home-invisilink:hover { color: #000; }",
"#gmc398715home_copySpammers_var,",
"#gmc398715home_mergeSpammers_var",
"{ display: inline; }",
"#gmc398715home .reset, #gmc398715home .reset a, #gmc398715home_buttons_holder { text-align: inherit; }",
"#gmc398715home_buttons_holder { margin: 2em 0.5em 0.5em; }",
"#gmc398715home_saveBtn { margin: 0.5em !important; padding: 0 3.0em !important; }",
"#gmc398715home_resetLink { margin-right: 1.5em; }",
"#gmc398715home_closeBtn { display: none; }",
"}",
"@media print {",
"#gmc398715home { display: none !important; }",
"}"
].join("\n")
,
fields: {
'hideTaggedSpams': {
"section": ["Manage Spams List", "This section handles posts"],
"type": "checkbox",
"label": 'Hide tagged in mixed User areas',
"default": false
},
'clearSpams': {
"type": "button",
"label": 'Clear',
"click": function () {
postids = {};
gWriteSpams = true;
}
},
'copySpams': {
"type": "button",
"label": 'Copy to Clipboard',
"click": function () {
var ids = { spams: [] },
spams = ids["spams"];
for (var postid in postids)
spams.push(postid);
if (spams.length > 0) {
spams.sort(function (a, b) { return a - b }).reverse();
GM_setClipboard(JSON.stringify(ids, null, " "), "text");
}
}
},
'hideTaggedSpammers': {
"section": ["Manage Spammers List", "This section handles authors"],
"type": "checkbox",
"label": 'Hide tagged in mixed User areas',
"default": false
},
'clearSpammers': {
"type": "button",
"label": 'Clear',
"click": function () {
authorids = {};
gWriteSpammers = true;
}
},
'copySpammers': {
"type": "button",
"label": 'Copy to Clipboard',
"click": function () {
var ids = { spammers: [] },
spammers = ids["spammers"];
for (var authorid in authorids)
spammers.push(authorid);
if (spammers.length > 0) {
spammers.sort(function (a, b) { return a - b }).reverse();
GM_setClipboard(JSON.stringify(ids, null, " "), "text");
}
}
},
'mergeSpammers': {
"type": "button",
"label": 'Merge Upstream List',
"click": function () {
if (confirm(
[
'NETWORK OF TRUST CONFIRMATION',
'',
'Do you wish to proceed merging the upstream spammers list into your own?',
'',
'\u00A0'
].join('\n')
))
GM_xmlhttpRequest({
method: "GET",
url: "http://beta.usocheckup.dune.net/spammers.json",
onload: function(aR) {
var write = false,
ids = JSON.parse(aR.responseText),
spammers = ids["spammers"]
;
for (var i = 0, spammer; spammer = spammers[i++];)
if (!authorids[spammer]) {
authorids[spammer] = new Date().getTime();
write = true;
}
if (write)
gWriteSpammers = true;
}
});
}
}
},
events: {
open: function () {
if (typeof GM_setClipboard == "undefined") {
gmcHome.fields["copySpams"].node.setAttribute("disabled", "disabled");
gmcHome.fields["copySpammers"].node.setAttribute("disabled", "disabled");
}
},
save: function () {
if (gWriteSpammers) {
GM_setValue("authorids", JSON.stringify(authorids, null, ""));
gWriteSpammers = false;
}
if (gWriteSpams) {
GM_setValue("postids", JSON.stringify(postids, null, ""));
gWriteSpams = false;
}
},
reset: function () {
authorids = {};
gWriteSpammers = true;
postids = {};
gWriteSpams = true;
}
}
});
/** **/
var
postids = JSON.parse(GM_getValue("postids", "{}")),
authorids = JSON.parse(GM_getValue("authorids", "{}")),
lastdirection = JSON.parse(GM_getValue("lastdirection", "{}")),
queue = [],
idle = true
;
// TODO: Remove after a while
GM_deleteValue("lastpage");
if (gISFRAMELESS && /\/scripts\/show\/398715\/?$/.test(gPATHNAME)) {
gmcHome.open();
}
/**
*
*/
GM_addStyle(
[
'.post form[action="/spam"] { clear: left; padding-top: 0.25em; }',
'.actions { float: right; font-size: 0.9em; margin-left: 1em; }',
'.action { color: #444; margin-left: 0.5em; text-decoration: none; }',
'.action:hover { color: #444; text-decoration: underline !important; }',
'.clip .body { display: block; max-height: 12em; overflow: auto !important; }',
'.spam small:not(a) { background: none repeat scroll 0 0 #fad8da; color: #666; }',
'#footer-content .footer_status { margin-bottom: 1.5em; }'
].join('\n')
);
if (!gLOGGEDIN) {
var spampollNodes = document.querySelectorAll(".spam_poll");
for (var i = 0, spampollNode; spampollNode = spampollNodes[i++];) {
spampollNode.textContent = spampollNode.textContent.replace(/\s+Do\s+you\s+or\s+$/, "");
}
}
if (gSPAMQSP) {
GM_addStyle(
[
'.post .body { display: block; max-height: 12em; overflow: auto; }'
].join('\n')
);
}
if (gLOGGEDIN) {
var login_statusNode = document.querySelector("#root #top .login_status");
if (login_statusNode) {
var topNodeA = document.createElement("a");
topNodeA.classList.add("spams");
topNodeA.href = "/scripts/show/398715";
topNodeA.textContent = "0 Spams Queued";
var nodeLi = document.createElement("li");
nodeLi.appendChild(topNodeA);
login_statusNode.insertBefore(nodeLi, login_statusNode.firstChild);
}
var footer_contentNode = document.querySelector("#footer #footer-content");
if (footer_contentNode) {
var thisNode = footer_contentNode.firstChild.nextSibling;
if (thisNode) {
var bottomNodeA = document.createElement("a");
bottomNodeA.classList.add("spams");
bottomNodeA.href = "/scripts/show/398715";
bottomNodeA.textContent = "0 Spams Queued";
var footer_statusNode = document.createElement("div");
footer_statusNode.classList.add("footer_status");
footer_statusNode.appendChild(bottomNodeA);
thisNode.insertBefore(footer_statusNode, thisNode.firstChild);
}
}
}
var direction = (lastdirection[gPATHNAME] ? lastdirection[gPATHNAME] : "");
if (!gSPAMQSP) {
var paginationNodes = document.querySelectorAll('.pagination');
for (var i = 0, paginationNode; paginationNode = paginationNodes[i++];) {
var pageNodes = paginationNode.querySelectorAll('a');
for (var j = 0, pageNode; pageNode = pageNodes[j++];) {
pageNode.addEventListener("click", function () {
delete lastdirection[gPATHNAME];
GM_setValue("lastdirection", JSON.stringify(lastdirection, null, ""));
}, false);
}
var prev_pageNode = paginationNode.querySelector('.prev_page');
if (prev_pageNode) {
if (prev_pageNode.classList.contains("disabled")) {
var nodeSpan = document.createElement("span");
nodeSpan.classList.add("disabled");
nodeSpan.classList.add("autoprev_page");
nodeSpan.textContent = "\u00AB\u00AB";
delete lastdirection[gPATHNAME];
GM_setValue("lastdirection", JSON.stringify(lastdirection, null, ""));
direction = "";
paginationNode.insertBefore(nodeSpan, prev_pageNode);
paginationNode.insertBefore(document.createTextNode(" "), prev_pageNode);
}
else {
var nodeA = document.createElement("a");
nodeA.classList.add("autoprev_page");
nodeA.href = prev_pageNode.href;
nodeA.textContent = "\u00AB\u00AB";
nodeA.addEventListener("click", function () {
lastdirection[gPATHNAME] = "prev";
GM_setValue("lastdirection", JSON.stringify(lastdirection, null, ""));
direction = "prev";
}, false);
paginationNode.insertBefore(nodeA, prev_pageNode);
paginationNode.insertBefore(document.createTextNode(" "), prev_pageNode);
}
}
var next_pageNode = paginationNode.querySelector('.next_page');
if (next_pageNode) {
if (next_pageNode.classList.contains("disabled")) {
var nodeSpan = document.createElement("span");
nodeSpan.classList.add("disabled");
nodeSpan.classList.add("autonext_page");
nodeSpan.textContent = "\u00BB\u00BB";
delete lastdirection[gPATHNAME];
GM_setValue("lastdirection", JSON.stringify(lastdirection, null, ""));
direction = "";
paginationNode.appendChild(document.createTextNode(" "));
paginationNode.appendChild(nodeSpan);
}
else {
var nodeA = document.createElement("a");
nodeA.classList.add("autonext_page");
nodeA.href = next_pageNode.href;
nodeA.textContent = "\u00BB\u00BB";
nodeA.addEventListener("click", function () {
lastdirection[gPATHNAME] = "next";
GM_setValue("lastdirection", JSON.stringify(lastdirection, null, ""));
direction = "next";
}, false);
paginationNode.appendChild(document.createTextNode(" "));
paginationNode.appendChild(nodeA);
}
}
}
}
var countSpammersTopics = 0;
var topicNodes = document.querySelectorAll('#topics-index #content table tr, #content table.topics tr');
for (var i = 0, topicNode; topicNode = topicNodes[i++];) {
var authorNode = topicNode.querySelector('td:nth-child(2) .author');
if (authorNode) {
var matches = authorNode.href.match(/(\d+)$/);
if (matches) {
var aid = matches[1];
var thisColumn = authorNode.parentNode.parentNode;
if (thisColumn) {
var actionsNodeDiv = thisColumn.querySelector('.actions');
if (!actionsNodeDiv) {
actionsNodeDiv = document.createElement("div");
actionsNodeDiv.classList.add("actions");
thisColumn.insertBefore(actionsNodeDiv, thisColumn.firstChild);
}
if (authorNode.textContent != "by ") {
var nodeA = document.createElement("a");
nodeA.classList.add("action");
nodeA.textContent = "posts";
nodeA.href = "/users/" + aid + "/posts";
actionsNodeDiv.appendChild(nodeA);
}
}
for (var authorid in authorids)
if (aid == authorid) {
topicNode.classList.add("spam");
if (gmcHome.get('hideTaggedSpammers'))
topicNode.classList.add("hide");
countSpammersTopics++;
break;
}
if (authorNode.textContent == "by ") {
authorNode.outerHTML = 'by deleted user';
topicNode.classList.add("spam");
if (gmcHome.get('hideTaggedSpammers'))
topicNode.classList.add("hide");
countSpammersTopics++;
}
}
}
}
if (topicNodes.length > 0 && countSpammersTopics == topicNodes.length - 1 && direction != "")
autoPaging();
var countSpamsPosts = 0;
var postNodes = document.querySelectorAll('.post');
for (var i = 0, postNode; postNode = postNodes[i++];) {
var pid = null, aid = null;
var matches = postNode.id.match(/\-(\d+)$/);
if (matches)
pid = matches[1];
var authorNode = postNode.querySelector('.author a[user_id]')
|| postNode.querySelector('.author a[href^="/users/"]')
|| document.querySelector('#root #section h2 a[href^="/users/"]');
if (authorNode)
aid = authorNode.getAttribute("user_id")
|| authorNode.getAttribute("href").match(/(\d+)$/)[1]
|| document.querySelector('#root #section h2 a[href^="/users/"]').match(/(\d+)$/)[1];
if (gLOGGEDIN) {
var spampollNode = postNode.querySelector('.body .spam_poll form input[value="SPAM"]');
if (spampollNode) {
if (authorNode.textContent != gUSERNAME)
spampollNode.addEventListener("click", spamClick, true);
else {
spampollNode.classList.add("hide");
if (spampollNode.parentNode.nextSibling && spampollNode.parentNode.nextSibling.textContent)
spampollNode.parentNode.nextSibling.textContent = "";
}
}
var hampollNode = postNode.querySelector('.body .spam_poll form input[value="NOT SPAM"]');
if (hampollNode) {
hampollNode.value = "HAM";
hampollNode.addEventListener("click", hamClick, true);
}
var spamNode = postNode.querySelector('form input[value="SPAM"]');
if (spamNode) {
if (authorNode.textContent != gUSERNAME) {
spamNode.addEventListener("click", spamClick, true);
var anchorNode = spamNode.parentNode.parentNode;
var spamsNodeInput = document.createElement("input");
spamsNodeInput.type = "button";
spamsNodeInput.value = "SPAMS";
spamsNodeInput.addEventListener("click", spamsClick, true);
anchorNode.appendChild(spamsNodeInput);
anchorNode.appendChild(document.createElement("p"));
}
else
spamNode.classList.add("hide");
if (gSPAMQSP) {
var hamNodeInput = document.createElement("input");
hamNodeInput.type = "button";
hamNodeInput.value = "HAM";
hamNodeInput.addEventListener("click", hamClick, true);
anchorNode.appendChild(hamNodeInput);
anchorNode.appendChild(document.createElement("p"));
}
}
}
var authorFound = false, postFound = false;
for (var postid in postids)
if (pid == postid) {
postFound = true;
postids[postid] = new Date().getTime();
GM_setValue("postids", JSON.stringify(postids, null, ""));
break;
}
for (var authorid in authorids)
if (aid == authorid) {
authorFound = true;
authorids[authorid] = new Date().getTime();
GM_setValue("authorids", JSON.stringify(authorids, null, ""));
break;
}
if (authorFound || postFound) {
if (!gSPAMQSP)
postNode.classList.add("clip");
if (postFound) {
postNode.classList.add("spam");
countSpamsPosts++;
}
else
postNode.classList.add("bad-ham");
if (!gSPAMQSP && !gUSERPOSTS && gmcHome.get('hideTaggedSpams'))
hidePost(postNode);
}
if (gLOGGEDIN && authorFound && !postFound)
queue.push(postNode);
}
if (gLOGGEDIN) {
var queued = queue.length;
if (queued > 0) {
var spamsNodes = document.querySelectorAll(".spams");
for (var i = 0, spamsNode; spamsNode = spamsNodes[i++];)
spamsNode.textContent = queue.length + ' Spams Queued';
if (idle)
submitSpams(gRETRIES);
}
if (!gSPAMQSP && postNodes.length > 0 && countSpamsPosts == postNodes.length && direction != "")
autoPaging();
}
else {
if (!gSPAMQSP && postNodes.length > 0 && countSpamsPosts == postNodes.length && direction != "")
autoPaging();
}
})();
Donate for the site OpenUserJS
Are you sure you want to go to an external site to donate a monetary value?
WARNING: Some countries laws may supersede the payment processors policy such as the GDPR and PayPal. While it is highly appreciated to donate, please check with your countries privacy and identity laws regarding privacy of information first. Use at your utmost discretion.