Twitch Following linker

Link following tool in user card

Versione datata 08/02/2023. Vedi la nuova versione l'ultima versione.

// ==UserScript==
// @name         Twitch Following linker
// @namespace    TODO
// @version      0.1
// @description  Link following tool in user card
// @author       buzz
// @match        *://*.twitch.tv/*
// @grant        none
// @license      GPLv3 or later
// ==/UserScript==

(function() {
  'use strict';

  const moderator = window.location.pathname.startsWith('/moderator/');

  let bodyObserver;
  let userCardObserver;
  let followingLink;

  const observerOptions = {
    childList: true,
    attributes: false,
    subtree: true
  }

  function addFollowingLink(headerNode) {
    const username = headerNode.innerText.trim();
    followingLink = document.createElement('a');
    followingLink.setAttribute('target', '_blank');
    followingLink.setAttribute('style', 'margin-left: 0.5rem; font-size: 50%;');
    followingLink.setAttribute('href', `https://twitch-tools.rootonline.de/followinglist_viewer.php?username=${username}`);
    followingLink.innerHTML = 'Following';
    headerNode.appendChild(followingLink);
  }

  function userCardObserverCallback(records) {
    // Detect user card removal
    if (records.length > 0 && records[0].removedNodes.length > 0 && records[0].removedNodes[0].getAttribute('class').match(moderator ? 'user-details' : 'viewer-card-layer')) {
      followingLink = undefined;
    }

    // Add link
    else if (!followingLink) {
      for (let i = 0; i < records.length; ++i) {
        const record = records[i];
        const headerNode = record.target.querySelector('h4');
        if (headerNode) {
          addFollowingLink(headerNode);
          return;
        }
      }
    }
  }

  function createUserCardObserver() {
    if (moderator) {
      // moderator page
      const userListNode = document.querySelector('.users-in-chat');
      if (userListNode) {
        removeBodyObserver();
        userCardObserver = new MutationObserver(userCardObserverCallback);
        userCardObserver.observe(userListNode, observerOptions);
      }
    } else {
      // normal stream page
      const userCardNode = document.querySelector('*[data-a-target="chat-user-card"]');
      if (userCardNode) {
        removeBodyObserver();
        userCardObserver = new MutationObserver(userCardObserverCallback);
        userCardObserver.observe(userCardNode, observerOptions);
      }
    }
  }

  // Body observer

  function removeBodyObserver() {
    if (bodyObserver) {
      bodyObserver.disconnect()
      bodyObserver = undefined;
    }
  }

  function bodyObserverCallback() {
    if (!userCardObserver) {
      createUserCardObserver();
    }
  }

  const bodyNode = document.querySelector("body");

  if (bodyNode) {
    bodyObserver = new MutationObserver(bodyObserverCallback);
    bodyObserver.observe(bodyNode, observerOptions);
  }
})();
长期地址
遇到问题?请前往 GitHub 提 Issues,或加Q群1031348184

赞助商

Fishcpy

广告

Rainyun

注册一下就行

Rainyun

一年攒够 12 元