🏠 Home 

nga.blocker

Block threads by titles and authors


Install this script?
  1. // ==UserScript==
  2. // @name nga.blocker
  3. // @namespace http://ngacn.cc/
  4. // @version 0.1
  5. // @description Block threads by titles and authors
  6. // @author OpenGG
  7. // @match https://bbs.ngacn.cc/thread.php?fid=*
  8. // @grant none
  9. // ==/UserScript==
  10. (function () {
  11. 'use strict';
  12. var MatchWithArr = function MatchWithArr(fn) {
  13. return function (compare, arr) {
  14. for (var i = arr.length - 1; i > -1; --i) {
  15. if (fn(compare, arr[i])) {
  16. return true;
  17. }
  18. }
  19. return false;
  20. };
  21. };
  22. var random = Math.floor(Math.random() * Math.pow(2, 53));
  23. var clsHide = '_hydra_hidden_nga_' + random;
  24. var clsOptions = '_hydra_options_nga_' + random;
  25. var clsBtn = '_hydra_btn_nga_' + random;
  26. var css = '.' + clsHide + '{display:none}.' + clsBtn + '{position:absolute;top:100px;right:30px;opacity:0.6}.' + clsBtn + ':hover{opacity:1}.' + clsOptions + '{position:absolute;top:130px;right:30px;width:600px;padding:10px;background:#abc}.' + clsOptions + ' label{display:block}';
  27. var addStyle = function addStyle() {
  28. var style = document.createElement('style');
  29. style.textContent = css;
  30. (document.head || document.documentElement).appendChild(style);
  31. };
  32. var hideEl = function hideEl(el) {
  33. el.classList.add(clsHide);
  34. };
  35. var blockedTopics = (localStorage.blockedTopics || '').split(/\r?\n/);
  36. var blockedAuthors = (localStorage.blockedAuthors || '').split(/\r?\n/);
  37. var block = function block() {
  38. var rows = document.querySelectorAll('.topicrow');
  39. var matchAuthor = MatchWithArr(function (compare, item) {
  40. var matches = compare.match(/uid=(\d+)$/);
  41. var uid = matches && matches[1];
  42. return item === uid;
  43. });
  44. var matchTopic = MatchWithArr(function (compare, item) {
  45. return compare.indexOf(item) !== -1;
  46. });
  47. for (var i = rows.length - 1; i > -1; --i) {
  48. var row = rows[i];
  49. if (blockedAuthors.length > 0) {
  50. var author = row.querySelector('a.author');
  51. if (matchAuthor(author.href, blockedAuthors)) {
  52. hideEl(row);
  53. continue;
  54. }
  55. }
  56. if (blockedAuthors.length > 0) {
  57. var topic = row.querySelector('.topic');
  58. if (matchTopic(topic.textContent, blockedTopics)) {
  59. hideEl(row);
  60. continue;
  61. }
  62. }
  63. }
  64. };
  65. var optionsShow = false;
  66. var hideOptions = function hideOptions() {
  67. optionsShow = false;
  68. var el = document.querySelector('.' + clsOptions);
  69. if (el) {
  70. el.parentNode.removeChild(el);
  71. }
  72. };
  73. var showOptions = function showOptions() {
  74. optionsShow = true;
  75. var container = document.createElement('div');
  76. container.className = clsOptions;
  77. container.innerHTML = '<label>屏蔽标题关键字(每行一个):<textarea placeholder="一行一个关键字"></textarea></label><label>屏蔽楼主UID(每行一个):<textarea placeholder="一行一个UID"></textarea></label><button>保存</button>';
  78. var _container$querySelec = container.querySelectorAll('textarea'),
  79. blockTopicEl = _container$querySelec[0],
  80. blockAuthorEl = _container$querySelec[1];
  81. var save = container.querySelector('button');
  82. blockTopicEl.value = blockedTopics.join('\n');
  83. blockAuthorEl.value = blockedAuthors.join('\n');
  84. save.addEventListener('click', function () {
  85. localStorage.blockedTopics = blockTopicEl.value;
  86. localStorage.blockedAuthors = blockAuthorEl.value;
  87. hideOptions();
  88. location.reload();
  89. }, false);
  90. document.body.appendChild(container);
  91. };
  92. var addControls = function addControls() {
  93. var el = document.createElement('button');
  94. el.className = clsBtn;
  95. el.textContent = '屏蔽设置';
  96. el.onclick = function () {
  97. if (optionsShow) {
  98. hideOptions();
  99. } else {
  100. showOptions();
  101. }
  102. };
  103. document.body.appendChild(el);
  104. };
  105. var init = function init() {
  106. document.removeEventListener('DOMContentLoaded', init, false);
  107. addStyle();
  108. addControls();
  109. block();
  110. };
  111. if (document.readyState === 'interactive' || document.readyState === 'complete') {
  112. init();
  113. } else {
  114. document.addEventListener('DOMContentLoaded', init, false);
  115. }
  116. })();