VoidVerified

Display a verified sign next to user's name in AniList.

当前为 2023-09-17 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name VoidVerified
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.1
  5. // @description Display a verified sign next to user's name in AniList.
  6. // @author voidnyan
  7. // @match https://anilist.co/*
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14. const observer = new MutationObserver(observeMutations);
  15. observer.observe(document.body, {childList: true, subtree: true});
  16.  
  17. const usernameSelector = ["a.name"];
  18.  
  19. const verified = {
  20. color: undefined,
  21. sign: "✔",
  22. title: "Verified",
  23. disableOnProfile: false,
  24. };
  25.  
  26. const verifiedUsers = [
  27. "voidnyan"
  28. ];
  29.  
  30. console.log("VoidVerified loaded.");
  31.  
  32. function observeMutations(mutations) {
  33. for (const mutation of mutations) {
  34. if (mutation.addedNodes.length > 0) {
  35. mutation.addedNodes.forEach(handleVerified);
  36. }
  37. }
  38. }
  39.  
  40. function handleVerified(node){
  41. if (!(node instanceof HTMLElement)) {
  42. return;
  43. }
  44.  
  45. switch (true){
  46. case node.matches("div.reply"):
  47. handleReply(node);
  48. break;
  49. case node.matches("div.activity-anime_list"):
  50. case node.matches("div.activity-manga_list"):
  51. handleListActivity(node);
  52. break;
  53. case node.matches("div.activity-text"):
  54. case node.matches("div.activity-message"):
  55. handleTextActivity(node);
  56. break;
  57. case node.matches("div.user"):
  58. handleProfile(node);
  59. }
  60. }
  61.  
  62. function handleReply(node) {
  63. const username = node.querySelector(usernameSelector);
  64. addVerifiedMarkToReply(username);
  65. }
  66.  
  67. function handleListActivity(node) {
  68. const isProfileActivity = node.querySelector(".small") !== null;
  69.  
  70. if (isProfileActivity) {
  71. return;
  72. }
  73.  
  74. const username = node.querySelector(usernameSelector);
  75. addVerifiedMark(username);
  76. }
  77.  
  78. function handleTextActivity(node) {
  79. const username = node.querySelector(usernameSelector);
  80. addVerifiedMark(username);
  81. }
  82.  
  83. function handleProfile(node){
  84. if (verified.disableOnProfile){
  85. return;
  86. }
  87. const username = node.querySelector("h1.name");
  88. addVerifiedMarkToProfile(username);
  89. }
  90.  
  91. function addVerifiedMark(username) {
  92. if (verifiedUsers.includes(username.innerHTML.trim())) {
  93. const span = createMarkElement(username);
  94. span.style.width = "min-content";
  95.  
  96. username.after(span);
  97. }
  98. }
  99.  
  100. function addVerifiedMarkToReply(username) {
  101. if (verifiedUsers.includes(username.innerHTML.trim())) {
  102. const span = createMarkElement(username);
  103.  
  104. span.style.display = "inline-block";
  105. span.style.verticalAlign = "top";
  106. span.style.lineHeight = "25px";
  107. span.style.height = "25px";
  108.  
  109. username.after(span);
  110. }
  111. }
  112.  
  113. function addVerifiedMarkToProfile(username) {
  114. if (verifiedUsers.includes(username.innerHTML.trim())) {
  115. const span = document.createElement("span");
  116. span.innerHTML = verified.sign;
  117. span.style.color = verified.color;
  118. span.style.marginLeft = "6px";
  119.  
  120. username.after(span);
  121. }
  122. }
  123.  
  124. function getLinkColor(username){
  125. var linkColor = getComputedStyle(username).getPropertyValue("--color-blue");
  126. return `rgb(${linkColor})`;
  127. }
  128.  
  129. function createMarkElement(username){
  130. const span = document.createElement("span");
  131.  
  132. span.style.color = verified.color ?? getLinkColor(username);
  133. span.style.marginLeft = "6px";
  134. span.innerHTML = verified.sign;
  135. span.title = verified.title;
  136.  
  137. return span;
  138. }
  139. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址