NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
(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(); } })();