// ==UserScript== // @name NGA Filter // @namespace https://greasyfork.org/users/263018 // @version 0.6.1 // @author snyssss // @description troll must die // @match *bbs.nga.cn/thread.php?fid=* // @match *bbs.nga.cn/read.php?tid=* // @match *ngabbs.com/thread.php?fid=* // @match *ngabbs.com/read.php?tid=* // @grant GM_registerMenuCommand // @noframes // @downloadURL none // ==/UserScript== (function() { "use strict"; const dataKey = "troll_data"; const modeKey = "troll_mode"; const keywordKey = "troll_keyword"; let trollMap = (function() { try { return JSON.parse(localStorage.getItem(dataKey)) || {}; } catch (e) { localStorage.setItem(dataKey, "{}"); } return {}; })(); let filterMode = ~~localStorage.getItem(modeKey); let filterKeyword = localStorage.getItem(keywordKey) || ""; const isTroll = function(uid) { uid = ~~uid; if (uid) { return trollMap[uid]; } return false; }; const isMatch = function(text) { if (!!filterKeyword && text.search(filterKeyword) >= 0) { return true; } return false; }; const toggleTroll = function(uid, tag) { uid = ~~uid; if (uid) { if (trollMap[uid] && tag === null) { delete trollMap[uid]; } else { trollMap[uid] = tag ? [tag] : []; } localStorage.setItem(dataKey, JSON.stringify(trollMap)); } }; const getUID = function(e) { let ele = e.getElementsByClassName("author")[0]; if (ele) { return ele.search.match(/uid=(\S*)/)[1]; } }; const getLink = function(e) { let ele = e.getElementsByClassName("topic")[0]; ele.hide = function() { if (filterMode) { e.remove(); } else { ele.style.textDecoration = "line-through"; } }; return ele; }; const getToggleButton = function(e) { let ele = e.getElementsByClassName("author")[0].nextElementSibling; if (ele.nextElementSibling) { ele = ele.nextElementSibling; } let uid = ~~ele.text; if (uid) { if (isTroll(uid)) { ele.style.background = "#CB4042"; } else { ele.style.background = "#AAA"; } return ele; } else { ele.onclick = null; } }; const getAvatar = function(e) { let ele = e.getElementsByClassName("avatar")[0] || { style: { display: "" } }; ele.show = ele.show || function() { ele.style.display = ""; }; ele.hide = ele.hide || function() { ele.style.display = "none"; }; return ele; }; const getContent = function(e) { let uid = getUID(e); let name = "$troll_" + uid; let ele = e.getElementsByClassName("postcontent")[0] || { innerHTML: "" }; ele.content = ele.content || ele.innerHTML; ele.show = ele.show || function() { if (filterMode) { e.style.display = ""; } else { ele.innerHTML = ele.content; } }; ele.hide = ele.hide || function() { if (filterMode) { e.style.display = "none"; } else { ele.innerHTML = '
' + 'Troll must die. ' + '点击查看' + '
' + ele.content + "
" + "
"; } }; return ele; }; const getTag = function(e) { let container = e.getElementsByClassName("posterinfo")[0]; let ele = container.children[1]; if (ele.tagName === "IMG") { ele = container.children[2]; } if (ele.className !== "crimson") { let t = document.createElement("div"); t.className = "crimson"; t.style = "display: none;"; if (ele.getAttribute("name") === "honor") { t.honor = ele; } ele.before(t); ele = t; } let uid = getUID(e); if (isTroll(uid)) { if (typeof trollMap[uid] === "object" && trollMap[uid].length) { ele.innerHTML = trollMap[uid][0]; } else { ele.innerHTML = ""; } } ele.show = ele.show || function() { if (ele.innerHTML) { ele.style.display = ""; } if (ele.honor) { ele.honor.style.display = "none"; } }; ele.hide = ele.hide || function() { ele.style.display = "none"; if (ele.honor) { ele.honor.style.display = ""; } }; return ele; }; const observerElements = [ (function() { let container = document.getElementById("topicrows"); let func = function(e) { if (e.tagName == "SCRIPT") return; let uid = getUID(e); let link = getLink(e); if (isTroll(uid) || isMatch(link.innerHTML)) { link.hide(); } }; return [container, func]; })(), (function() { let container = document.getElementById("m_posts_c"); let func = function(e) { if (e.tagName == "SCRIPT") return; let uid = getUID(e); let toggle = getToggleButton(e); if (toggle) { toggle.onclick = function(e) { let tag = null; if (e.ctrlKey) { tag = window.prompt("标签", (trollMap[uid] || {})[0]); if (tag === null) { return; } } toggleTroll(uid, tag); container.refilter(); }; } else { return; } let avatar = getAvatar(e); let content = getContent(e); let tag = getTag(e); if (isTroll(uid)) { avatar.hide(); content.hide(); tag.show(); } else { avatar.show(); content.show(); tag.hide(); } }; return [container, func]; })() ]; [].slice.call(observerElements).forEach(function(e) { if (!e[0]) return; e[0].refilter = function() { [].slice.call(e[0].children).forEach(function(c) { e[1](c); }); }; e[0].refilter(); let observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.addedNodes.length) { e[1](mutation.addedNodes[0]); } }); }); observer.observe(e[0], { childList: true }); }); if (filterMode) { GM_registerMenuCommand("过滤模式:删除", () => { localStorage.setItem(modeKey, 0); location.reload(); }); } else { GM_registerMenuCommand("过滤模式:标记", () => { localStorage.setItem(modeKey, 1); location.reload(); }); } GM_registerMenuCommand("修改过滤关键词", () => { let result = window.prompt('过滤关键词,用"|"隔开', filterKeyword); if (result === null || result === filterKeyword) { return; } localStorage.setItem(keywordKey, result); location.reload(); }); // 广告错误提示屏蔽 (function() { let observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.addedNodes.length) { mutation.addedNodes.forEach(function(node) { if (node.innerText.indexOf("广告")) { node.style.display = "none"; } }); } }); }); observer.observe(document.body, { childList: true }); })(); })();