phpBB User Hide engl

Hide posts of the selected users on any phpBB system.

  1. // ==UserScript==
  2. // @name phpBB User Hide engl
  3. // @include */viewtopic.php*
  4. // @description Hide posts of the selected users on any phpBB system.
  5. // @exclude
  6. // @version 0.0.1.20141027081832
  7. // @namespace https://greasyfork.org/users/6356
  8. // ==/UserScript==
  9.  
  10. (function() {
  11. // Get stored hidden users from cookie
  12. var users = [];
  13. var cookieName = "phpUserHide";
  14. for (var i = 0; i < document.cookie.split('; ').length; i++) {
  15. var oneCookie = document.cookie.split('; ')[i].split('=');
  16. if (oneCookie[0] == cookieName) {
  17. users = oneCookie[1].split(', ');
  18. break;
  19. }
  20. }
  21.  
  22. // Cursor functions
  23. var curPointer = function(event) {
  24. event.target.style.cursor = 'pointer';
  25. event.preventDefault();
  26. };
  27. var curDefault = function(event) {
  28. event.target.style.cursor = 'default';
  29. event.preventDefault();
  30. };
  31.  
  32. // Add or remove a user from the cookie
  33. var addRemoveUser = function(event) {
  34. // Parse current cookie
  35. for(j = 0; j < document.cookie.split('; ').length; j++ ) {
  36. var oneCookie = document.cookie.split('; ')[j].split('=');
  37. if (oneCookie[0] == cookieName) {
  38. users = oneCookie[1].split(', ');
  39. break;
  40. }
  41. }
  42. var user = escape(event.target.nextSibling.innerHTML)
  43. notFound = true;
  44. for (var j = 0; j < users.length; j++) {
  45. if (users[j] == user) {
  46. users.splice(j, 1);
  47. notFound = false;
  48. }
  49. }
  50. if (notFound)
  51. users.push(user);
  52. if (users.length > 0) {
  53. var date = new Date();
  54. var days = 365;
  55. date.setTime(date.getTime() + (days*24*60*60*1000));
  56. var expires = '; expires=' + date.toGMTString();
  57. var value = users.join(', ');
  58. document.cookie = cookieName + '=' + value + expires + '; path=/';
  59. } else {
  60. document.cookie = cookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
  61. }
  62. window.alert(unescape(user) + ' has been ' + (notFound ? 'added to' : 'removed from')
  63. + ' your hide list\n'
  64. + 'You must refresh the page to view the changes.');
  65. event.preventDefault();
  66. };
  67. // Toggle display of user's post
  68. var togglePost = function(event) {
  69. var displayState = event.target.getAttribute('displaystate');
  70. if (displayState == 'none')
  71. displayState = '';
  72. else
  73. displayState = 'none';
  74. event.target.setAttribute('displaystate', displayState);
  75.  
  76. containingRow = event.target.parentNode.parentNode;
  77. var innerTags = containingRow.getElementsByTagName('*');
  78. for (var i = 0; i < innerTags.length; i++) {
  79. var tagClass = innerTags[i].getAttribute('class');
  80. if (tagClass == 'postbody' || tagClass == 'postsig'
  81. || tagClass == 'postdetails' || innerTags[i].tagName == 'TABLE')
  82. innerTags[i].style.display = displayState;
  83. }
  84. event.preventDefault();
  85. };
  86. // Toggle display of user's quote
  87. var toggleQuote = function(event) {
  88. var displayState = event.target.getAttribute('displaystate');
  89. if (displayState == 'none')
  90. displayState = 'table-row';
  91. else
  92. displayState = 'none';
  93. event.target.setAttribute('displaystate', displayState);
  94.  
  95. // Jump to parent row
  96. var containingRow = event.target.parentNode.parentNode.parentNode.parentNode.nextSibling;
  97. // Find containing row
  98. while (containingRow.nodeType != 1)
  99. containingRow = containingRow.nextSibling;
  100. containingRow.style.display = displayState;
  101.  
  102. event.preventDefault();
  103. };
  104.  
  105. // Find all the usernames in the page
  106. var results = document.evaluate("//span[@class='name']/b|//span[@class='name']/strong", document, null,
  107. XPathResult.ANY_TYPE, null);
  108. var resultNodes = [];
  109. var aResult;
  110. while (aResult = results.iterateNext())
  111. resultNodes.push(aResult);
  112.  
  113. // Loop through every user post on the page
  114. for (var i in resultNodes) {
  115. var containingRow = resultNodes[i].parentNode.parentNode.parentNode;
  116. // Format whitespace
  117. var user = escape(resultNodes[i].innerHTML);
  118.  
  119. // Flag whether the user is in our hide list
  120. var notFound = true;
  121. for (var j = 0; j < users.length; j++) {
  122. if (users[j] == user) {
  123. notFound = false;
  124. }
  125. }
  126.  
  127. // Add relevant event handlers to user's name and a toggler node
  128. var toggler = document.createElement('span');
  129. toggler.setAttribute('title', "click to add or remove this user from your hide list");
  130. toggler.appendChild(document.createTextNode('[X] '));
  131. toggler.style.fontSize = "7pt";
  132. toggler.addEventListener('mouseover', curPointer, true);
  133. toggler.addEventListener('mouseout', curDefault, true);
  134. toggler.addEventListener('click', addRemoveUser, true);
  135.  
  136. resultNodes[i].parentNode.insertBefore(toggler, resultNodes[i]);
  137.  
  138. // If this user isn't in our hide list, skip to the next user
  139. if (notFound)
  140. continue;
  141.  
  142. // Find the first element node (td) in the containing row
  143. var elem = containingRow.firstChild;
  144. while (elem.nodeType != 1)
  145. elem = elem.nextSibling;
  146.  
  147. // Create a span to control toggling
  148. var span = document.createElement('span');
  149. span.appendChild(document.createTextNode('Toggle Display'));
  150. span.appendChild(document.createElement('br'));
  151. span.setAttribute('class', 'gensmallbold');
  152. span.style.textDecoration = 'underline';
  153. span.setAttribute('displaystate', 'none');
  154. span.addEventListener('mouseover', curPointer, true);
  155. span.addEventListener('mouseout', curDefault, true);
  156. span.addEventListener('click', togglePost, true);
  157.  
  158. // Insert the span after the username and before the <br>
  159. elem.insertBefore(span, elem.firstChild.nextSibling.nextSibling);
  160. // Insert a <br> after the username and before the span
  161. elem.insertBefore(document.createElement('br'), elem.firstChild.nextSibling.nextSibling);
  162.  
  163. var innerTags = containingRow.getElementsByTagName('*');
  164. for (var i = 0; i < innerTags.length; i++) {
  165. var tagClass = innerTags[i].getAttribute('class');
  166. if (tagClass == 'postbody' || tagClass == 'postsig'
  167. || tagClass == 'postdetails' || innerTags[i].tagName == 'TABLE')
  168. innerTags[i].style.display = 'none';
  169. }
  170. }
  171.  
  172. // Find all the usernames quoted in the page
  173. var results = document.evaluate("//td[@class='quote']/parent::*/preceding-sibling::*/td/span/b|"
  174. + "//td[@class='quote']/parent::*/preceding-sibling::*/td/span/strong", document, null,
  175. XPathResult.ANY_TYPE, null);
  176. var resultNodes = [];
  177. var aResult;
  178. while (aResult = results.iterateNext())
  179. resultNodes.push(aResult);
  180.  
  181. // Loop through every user quote on the page
  182. for (var i in resultNodes) {
  183. var containingRow = resultNodes[i].parentNode.parentNode.parentNode.nextSibling;
  184. while (containingRow.nodeType != 1)
  185. containingRow = containingRow.nextSibling;
  186.  
  187. // Find username
  188. var usermatch = resultNodes[i].innerHTML.match(/(.*) wrote:$/);
  189. if (usermatch)
  190. var user = escape(usermatch[1]);
  191. else
  192. continue;
  193.  
  194. // Flag whether the user is in our hide list
  195. var notFound = true;
  196. for (var j = 0; j < users.length; j++) {
  197. if (users[j] == user) {
  198. notFound = false;
  199. }
  200. }
  201.  
  202. // If this user isn't in our hide list, skip to the next user
  203. if (notFound)
  204. continue;
  205.  
  206. // Create a span to control toggling
  207. var span = document.createElement('span');
  208. span.appendChild(document.createElement('br'));
  209. span.appendChild(document.createTextNode('Toggle Display'));
  210. span.setAttribute('class', 'gensmallbold');
  211. span.style.textDecoration = 'underline';
  212. span.setAttribute('displaystate', 'none');
  213. span.addEventListener('mouseover', curPointer, true);
  214. span.addEventListener('mouseout', curDefault, true);
  215. span.addEventListener('click', toggleQuote, true);
  216.  
  217. resultNodes[i].appendChild(span);
  218. // Hide the quote
  219. containingRow.style.display = 'none';
  220. }
  221.  
  222. })();