Twitch auto enter chat-page

自動進入 Twitch 聊天室頁面,防止被揪團帶離目標實況主,並可自動導回原實況主頁面

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Twitch auto enter chat-page
// @namespace    http://tampermonkey.net/
// @version      2024-08-25
// @description  自動進入 Twitch 聊天室頁面,防止被揪團帶離目標實況主,並可自動導回原實況主頁面
// @author       BeckerSpace
// @match        https://www.twitch.tv/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=twitch.tv
// @run-at       document-end
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 設定變數
    let redirectEnabled = true; // 是否開啟防揪團功能
    const targetStreamer = "Streamer ID"; // 替換為你的目標實況主帳號
    const checkTimer = 5000 // 自動檢查的秒數

    // 自訂CSS
    const customCSS = {
        toggleButton: {
            color: 'white',
            cursor: 'pointer', // 指标变为手形
            display: 'flex',
            alignItems: 'center', // 水平居中
            justifyContent: 'center', // 垂直居中
            fontWeight: 'bold', // 字体加粗
            marginLeft: '5px', // 与 Twitch 标志之间的间距
            whiteSpace: 'nowrap' // 防止文字折行
        },
        label: {
            fontSize: '12px'
        },
        status: {
            fontSize: '20px',
            backgroundColor: 'green', // 初始背景颜色为绿色
            width: '25px', // 设置宽度
            height: '25px', // 设置高度
            display: 'flex', // 使用 flex 使内容居中
            alignItems: 'center', // 垂直居中
            justifyContent: 'center', // 水平居中
            borderRadius: '5px' // 增加圆角
        }
    }

    // 防揪團開關
    function redirectEnabledToggleBtn(){
        // 檢查按鈕是否已存在,避免重複創建
        if (document.querySelector('#redirect-toggle-button')) return;

        // 創建一個新的 div 元素作為按鈕容器
        const toggleButton = document.createElement('div');

        // 設置按鈕的 ID 以便識別
        toggleButton.id = 'redirect-toggle-button';

        // 应用样式
        Object.assign(toggleButton.style, customCSS.toggleButton);

        // 創建文本行,顯示 "防揪團功能:"
        const label = document.createElement('span');
        label.textContent = '防揪團:';
        Object.assign(label.style, customCSS.label);

        // 創建狀態行,顯示 "O" 或 "X"
        const status = document.createElement('span');
        status.textContent = 'O'; // 初始顯示 O 表示啟用
        Object.assign(status.style, customCSS.status);

        // 點擊事件切換狀態
        toggleButton.addEventListener('click', () => {
            redirectEnabled = !redirectEnabled;
            status.textContent = redirectEnabled ? 'O' : 'X';
            status.style.backgroundColor = redirectEnabled ? 'green' : 'red'; // 使用条件运算符设置背景颜色
            console.log(`防揪團 ${redirectEnabled ? '啟用' : '禁用'}`);
        });

        // 將文本行和狀態行添加到 div
        toggleButton.appendChild(label);
        toggleButton.appendChild(status);

        // 找到指定的LOGO a元素
        const homeLogo = document.querySelector('a[data-a-target="home-link"]');
        // 將新創建的 div 添加到 a 標籤的後面
        if (homeLogo) {
            homeLogo.parentElement.appendChild(toggleButton);
        }
    }

    // 防揪團功能
    function redirectToTargetUrl() {
        // 檢查 防揪團開關
        if(!redirectEnabled) return
        // 檢查網址,若非原實況主則防揪團
        if (window.location.href !== `https://www.twitch.tv/${targetStreamer}`) {
            console.log(`非目標實況主網址,將導回: ${targetStreamer}`)
            window.location.href = `https://www.twitch.tv/${targetStreamer}`;
        }
    }

    // 判斷進入頁面
    function enterChat(){
        // 找尋section,以此判斷目前頁面狀態
        // const streamInfoSection = document.querySelector('section.Layout-sc-1xcs6mc-0.skip-to-target#live-channel-stream-information'); // 待確認實況開啟時的tag id
        const streamInfoSection = document.querySelector('section.Layout-sc-1xcs6mc-0.skip-to-target');
        if(!streamInfoSection) return console.log(`streamInfoSection沒找到`)// 防呆
        // 葉面狀態由 section 的 ariaLabel 提供
        const ariaLabel = streamInfoSection.getAttribute('aria-label');

        // 在實況主首頁
        if(ariaLabel === "主要內容"){
            // 進入聊天室
            const chatTab = document.querySelector('a[tabname="chat"]');
            if (!chatTab) return console.log(`chatTab沒找到`); // 防呆
            chatTab.click();
        }

        // 已經在聊天室內
        if(ariaLabel === "實況資訊"){
            // 目前無內容
        }
    }

    // 主程式
    function main(){
        redirectEnabledToggleBtn(); // 創建並顯示切換按鈕
        enterChat() // 檢查並進入聊天室
        redirectToTargetUrl()
    }
    // 重複執行 主程式
    setInterval(()=>{
        main()
    },checkTimer)

    // 第一次嘗試執行
    window.addEventListener('load', ()=>{
        main()
    });

})();