MyFigureCollection Article Blocker

hide articles of specific users on the front page

当前为 2021-03-12 提交的版本,查看 最新版本

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