MyFigureCollection Article Blocker

hide articles of specific users on the front page

  1. // ==UserScript==
  2. // @name MyFigureCollection Article Blocker
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.2
  5. // @description hide articles of specific users on the front page
  6. // @author IxianNavigator
  7. // @match https://myfigurecollection.net/
  8. // @icon https://icons.duckduckgo.com/ip2/myfigurecollection.net.ico
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14. const blockedUsers = localStorage.blockedUsers ? JSON.parse(localStorage.blockedUsers) : [];
  15.  
  16. Array.from(document.querySelectorAll('.stamp-anchor > a[href*="myfigurecollection.net/blog/"')).forEach((aElem) => {
  17. const url = aElem.getAttribute('href');
  18. if (!url.match(/myfigurecollection\.net\/blog\/\d+$/)) {
  19. return;
  20. }
  21. const blogPostListItem = aElem.closest("li.listing-item");
  22. if (!blogPostListItem) {
  23. return;
  24. }
  25. blogPostListItem.setAttribute("style", "display: none;");
  26. const blogId = url.match(/myfigurecollection\.net\/blog\/(\d+)$/)[1];
  27.  
  28. fetch(url).then((response) => response.text()).then((responseText) => {
  29. const regex = /<a class="anchor user\-anchor user-access-rank-(\d+) user-honorific-rank-(\d+)" href="https:\/\/myfigurecollection\.net\/profile\/(\S+)">/;
  30. const match = responseText.match(regex);
  31. if (!match) {
  32. return;
  33. }
  34. const userName = match[3];
  35. if (blockedUsers.includes(userName)) {
  36. return;
  37. }
  38. blogPostListItem.setAttribute("style", "display: block;");
  39.  
  40. const userLink = document.createElement('a');
  41. userLink.innerHTML = userName;
  42. userLink.href = `https://myfigurecollection.net/profile/${userName}`;
  43. userLink.style.fontWeight = "normal";
  44. const blockButton = document.createElement('span');
  45. blockButton.innerHTML = "×";
  46. blockButton.setAttribute("title", "block user");
  47. blockButton.setAttribute("role", "button");
  48. blockButton.setAttribute("style", "cursor: pointer;");
  49. blockButton.classList.add("block-user-button");
  50. blockButton.addEventListener("click", function() {
  51. blockedUsers.push(userName);
  52. localStorage.blockedUsers = JSON.stringify(blockedUsers);
  53. blogPostListItem.setAttribute("style", "display: none;");
  54. addBlockedUsersList();
  55. });
  56. const metaContainer = blogPostListItem.querySelector(".stamp-meta");
  57. metaContainer.appendChild(document.createTextNode(" • "));
  58. metaContainer.appendChild(userLink);
  59. metaContainer.appendChild(document.createTextNode(" • "));
  60. metaContainer.appendChild(blockButton);
  61. const articleLinkContainer = blogPostListItem.querySelector(".stamp-anchor");
  62. articleLinkContainer.appendChild(document.createTextNode(" • "));
  63. const commentCount = responseText.match(/(\d+) comment/)[1];
  64. const commentCountElement = document.createElement("a");
  65. commentCountElement.style = "display: inline";
  66. commentCountElement.href = `https://myfigurecollection.net/blog/${blogId}/comments/`;
  67. commentCountElement.innerHTML = `
  68. <span class="tiny-icon-before icon-comments" style="margin-right: 0"></span>
  69. ${commentCount}
  70. `;
  71. articleLinkContainer.appendChild(commentCountElement);
  72.  
  73. });
  74. });
  75. function addBlockedUsersList() {
  76. const existingBlockedUsersList = document.querySelector(".blocked-users-list");
  77. if (existingBlockedUsersList) {
  78. existingBlockedUsersList.remove();
  79. }
  80. const blockedUsersList = document.createElement("div");
  81. blockedUsersList.classList.add("blocked-users-list");
  82. document.querySelector(".copyright").after(blockedUsersList);
  83. blockedUsers.forEach((userName, i) => {
  84. const userSpan = document.createElement("span");
  85. userSpan.setAttribute("role", "button");
  86. userSpan.setAttribute("style", "cursor: pointer;");
  87. userSpan.innerHTML = userName;
  88. userSpan.addEventListener("click", function() {
  89. const index = blockedUsers.indexOf(userName);
  90. if (index > -1) {
  91. blockedUsers.splice(index, 1);
  92. }
  93. localStorage.blockedUsers = JSON.stringify(blockedUsers);
  94. addBlockedUsersList();
  95. });
  96. blockedUsersList.appendChild(userSpan);
  97. if (i < blockedUsers.length - 1) {
  98. blockedUsersList.appendChild(document.createTextNode(" • "));
  99. }
  100. });
  101. }
  102. addBlockedUsersList();
  103.  
  104. })();