Display a verified sign next to user's name in AniList.
目前為
// ==UserScript==
// @name VoidVerified
// @namespace http://tampermonkey.net/
// @version 0.1.1
// @description Display a verified sign next to user's name in AniList.
// @author voidnyan
// @match https://anilist.co/*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
const observer = new MutationObserver(observeMutations);
observer.observe(document.body, {childList: true, subtree: true});
const usernameSelector = ["a.name"];
const verified = {
color: undefined,
sign: "✔",
title: "Verified",
disableOnProfile: false,
};
const verifiedUsers = [
"voidnyan"
];
console.log("VoidVerified loaded.");
function observeMutations(mutations) {
for (const mutation of mutations) {
if (mutation.addedNodes.length > 0) {
mutation.addedNodes.forEach(handleVerified);
}
}
}
function handleVerified(node){
if (!(node instanceof HTMLElement)) {
return;
}
switch (true){
case node.matches("div.reply"):
handleReply(node);
break;
case node.matches("div.activity-anime_list"):
case node.matches("div.activity-manga_list"):
handleListActivity(node);
break;
case node.matches("div.activity-text"):
case node.matches("div.activity-message"):
handleTextActivity(node);
break;
case node.matches("div.user"):
handleProfile(node);
}
}
function handleReply(node) {
const username = node.querySelector(usernameSelector);
addVerifiedMarkToReply(username);
}
function handleListActivity(node) {
const isProfileActivity = node.querySelector(".small") !== null;
if (isProfileActivity) {
return;
}
const username = node.querySelector(usernameSelector);
addVerifiedMark(username);
}
function handleTextActivity(node) {
const username = node.querySelector(usernameSelector);
addVerifiedMark(username);
}
function handleProfile(node){
if (verified.disableOnProfile){
return;
}
const username = node.querySelector("h1.name");
addVerifiedMarkToProfile(username);
}
function addVerifiedMark(username) {
if (verifiedUsers.includes(username.innerHTML.trim())) {
const span = createMarkElement(username);
span.style.width = "min-content";
username.after(span);
}
}
function addVerifiedMarkToReply(username) {
if (verifiedUsers.includes(username.innerHTML.trim())) {
const span = createMarkElement(username);
span.style.display = "inline-block";
span.style.verticalAlign = "top";
span.style.lineHeight = "25px";
span.style.height = "25px";
username.after(span);
}
}
function addVerifiedMarkToProfile(username) {
if (verifiedUsers.includes(username.innerHTML.trim())) {
const span = document.createElement("span");
span.innerHTML = verified.sign;
span.style.color = verified.color;
span.style.marginLeft = "6px";
username.after(span);
}
}
function getLinkColor(username){
var linkColor = getComputedStyle(username).getPropertyValue("--color-blue");
return `rgb(${linkColor})`;
}
function createMarkElement(username){
const span = document.createElement("span");
span.style.color = verified.color ?? getLinkColor(username);
span.style.marginLeft = "6px";
span.innerHTML = verified.sign;
span.title = verified.title;
return span;
}
})();