// ==UserScript== // @name NGA Filter // @namespace https://greasyfork.org/users/263018 // @version 0.4 // @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 // @grant GM_unregisterMenuCommand // @noframes // @downloadURL none // ==/UserScript== (function () { 'use strict'; const dataKey = 'troll_data'; const modeKey = 'troll_mode'; const keyword = [ '魔兽', '拼多多' ]; let filterMode = ~~localStorage.getItem(modeKey); let trollMap = (function () { try { return JSON.parse(localStorage.getItem(dataKey)) || {}; } catch (e) { localStorage.setItem(dataKey, '{}'); } return {}; })(); const isTroll = function (uid) { uid = ~~uid; if (uid) { return trollMap[uid]; } return false; }; const isMatch = function (text) { for (var i in keyword) { if (text.search(keyword[i]) >= 0) { return true; } } return false; }; const toggleTroll = function (uid) { uid = ~~uid; if (uid) { if (trollMap[uid]) { delete trollMap[uid]; } else { trollMap[uid] = true; } 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 = function () { ele.style.display = ''; } 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 = function () { if (filterMode) { e.style.display = ''; } else { ele.innerHTML = ele.content; } } ele.hide = function () { if (filterMode) { e.style.display = 'none'; } else { ele.innerHTML = '
' + 'Troll must die. ' + '点击查看' + '
' + ele.content + '
' + '
'; } } 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 () { toggleTroll(uid); container.refilter(); }; } else { return; } let avatar = getAvatar(e); let content = getContent(e); if (isTroll(uid)) { avatar.hide(); content.hide(); } else { avatar.show(); content.show(); } } 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(); }); } })();