NGA Filter

troll must die

当前为 2019-09-01 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name NGA Filter
  3. // @namespace https://greasyfork.org/users/263018
  4. // @version 0.3
  5. // @author snyssss
  6. // @description troll must die
  7. // @match *bbs.nga.cn/thread.php?fid=*
  8. // @match *bbs.nga.cn/read.php?tid=*
  9. // @match *ngabbs.com/thread.php?fid=*
  10. // @match *ngabbs.com/read.php?tid=*
  11. // @grant none
  12. // @noframes
  13. // ==/UserScript==
  14.  
  15. (function () {
  16. 'use strict';
  17.  
  18. const key = 'troll';
  19.  
  20. const keyword = [
  21. '拼多多'
  22. ];
  23.  
  24. let trollMap = (function () {
  25. try {
  26. return JSON.parse(localStorage.getItem(key));
  27. } catch (e) {
  28. localStorage.setItem(key, '{}');
  29. }
  30. return {};
  31. })();
  32.  
  33. const isTroll = function (uid) {
  34. uid = ~~uid;
  35. if (uid) {
  36. return trollMap[uid];
  37. }
  38. return false;
  39. };
  40.  
  41. const isMatch = function (text) {
  42. for (var i in keyword) {
  43. if (text.search(keyword[i]) >= 0) {
  44. return true;
  45. }
  46. }
  47. return false;
  48. };
  49.  
  50. const toggleTroll = function (uid) {
  51. uid = ~~uid;
  52. if (uid) {
  53. if (trollMap[uid]) {
  54. delete trollMap[uid];
  55. } else {
  56. trollMap[uid] = true;
  57. }
  58. localStorage.setItem(key, JSON.stringify(trollMap));
  59. }
  60. };
  61.  
  62. const getUID = function (e) {
  63. let ele = e.getElementsByClassName('author')[0];
  64. if (ele) {
  65. return ele.search.match(/uid=(\S*)/)[1];
  66. }
  67. };
  68.  
  69. const getLink = function (e) {
  70. let ele = e.getElementsByClassName('topic')[0];
  71. ele.hide = function () {
  72. ele.style.textDecoration = 'line-through';
  73. }
  74. return ele;
  75. };
  76.  
  77. const getToggleButton = function (e) {
  78. let ele = e.getElementsByClassName('author')[0].nextElementSibling;
  79. if (ele.nextElementSibling) {
  80. ele = ele.nextElementSibling;
  81. }
  82. let uid = ~~ele.text;
  83. if (uid) {
  84. if (isTroll(uid)) {
  85. ele.style.background = '#CB4042';
  86. } else {
  87. ele.style.background = '#AAA';
  88. }
  89. return ele;
  90. }
  91. else {
  92. ele.onclick = null;
  93. }
  94. };
  95.  
  96. const getAvatar = function (e) {
  97. let ele = e.getElementsByClassName('avatar')[0] || { style: { display: '' } };
  98. ele.show = function () {
  99. ele.style.display = '';
  100. }
  101. ele.hide = function () {
  102. ele.style.display = 'none';
  103. }
  104. return ele;
  105. };
  106.  
  107. const getContent = function (e) {
  108. let uid = getUID(e);
  109. let name = '$troll_' + uid;
  110. let ele = e.getElementsByClassName('postcontent')[0] || { innerHTML: '' };
  111. ele.content = ele.content || ele.innerHTML;
  112. ele.show = function () {
  113. ele.innerHTML = ele.content;
  114. }
  115. ele.hide = function () {
  116. ele.innerHTML =
  117. '<div class="lessernuke" style="background: #81C7D4; border-color: #66BAB7;">' +
  118. '<span class="crimson">Troll must die.</span> ' +
  119. '<a href="javascript:void(0)" onclick="var x = document.getElementsByName(&quot;' + name + '&quot;);for(var i=0;i<x.length;i++){x[i].style.display=&quot;&quot;}">点击查看</a>' +
  120. '<div style="display:none" name="' + name + '">' + ele.content + '</div>' +
  121. '</div>';
  122. }
  123. return ele;
  124. };
  125.  
  126. const observerElements = [
  127. (function () {
  128. let container = document.getElementById('topicrows');
  129. let func = function (e) {
  130. if (e.tagName == 'SCRIPT') return;
  131. let uid = getUID(e);
  132. let link = getLink(e);
  133. if (isTroll(uid) ||
  134. isMatch(link.innerHTML)) {
  135. link.hide();
  136. }
  137. }
  138. return [
  139. container,
  140. func
  141. ]
  142. })(),
  143. (function () {
  144. let container = document.getElementById('m_posts_c');
  145. let func = function (e) {
  146. if (e.tagName == 'SCRIPT') return;
  147. let uid = getUID(e);
  148. let toggle = getToggleButton(e);
  149. if (toggle) {
  150. toggle.onclick = function () {
  151. toggleTroll(uid);
  152. container.refilter();
  153. };
  154. } else {
  155. return;
  156. }
  157. let avatar = getAvatar(e);
  158. let content = getContent(e);
  159. if (isTroll(uid)) {
  160. avatar.hide();
  161. content.hide();
  162. }
  163. else {
  164. avatar.show();
  165. content.show();
  166. }
  167. }
  168. return [
  169. container,
  170. func
  171. ]
  172. })()
  173. ];
  174.  
  175. [].slice.call(observerElements).forEach(function (e) {
  176. if (!e[0]) return;
  177.  
  178. e[0].refilter = function () {
  179. [].slice.call(e[0].children).forEach(function (c) {
  180. e[1](c);
  181. });
  182. }
  183.  
  184. e[0].refilter();
  185.  
  186. let observer = new MutationObserver(function (mutations) {
  187. mutations.forEach(function (mutation) {
  188. if (mutation.addedNodes.length) {
  189. e[1](mutation.addedNodes[0]);
  190. }
  191. });
  192. });
  193.  
  194. observer.observe(e[0], {
  195. childList: true
  196. });
  197. });
  198. })();