Block Twitch Emotes by Channel Author .

Блокировка эмодзи Twitch по каналу с интерфейсом для управления (включение через Tampermonkey)

目前為 2024-12-09 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Block Twitch Emotes by Channel Author .
// @namespace    http://tampermonkey.net/
// @version      1.1
// @license MIT
// @description  Блокировка эмодзи Twitch по каналу с интерфейсом для управления (включение через Tampermonkey)
// @author       lelusandE
// @match        https://www.twitch.tv/*
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @icon         https://avatars.mds.yandex.net/i?id=b92aedab3a27152b2e6ba57a7555951c16d98483-7762396-images-thumbs&ref=rim&n=33&w=200&h=200
// ==/UserScript==

(function () {
    'use strict';

    // Получаем список заблокированных каналов из хранилища
    const blockedChannels = GM_getValue('blockedChannels', []);

    // Флаг, показывающий, отображается ли панель
    let isPanelVisible = false;

    // Создание интерфейса управления (панель с кнопками)
    const controlPanel = document.createElement('div');
    controlPanel.style.position = 'fixed';
    controlPanel.style.top = '20px';
    controlPanel.style.left = '20px';
    controlPanel.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
    controlPanel.style.color = 'white';
    controlPanel.style.padding = '10px';
    controlPanel.style.borderRadius = '10px';
    controlPanel.style.zIndex = '1000';
    controlPanel.style.display = 'none'; // Изначально скрыто

    // Заголовок панели
    const title = document.createElement('h3');
    title.textContent = 'Block Emotes - Manage Channels';
    controlPanel.appendChild(title);

    // Поле для ввода имени канала
    const inputField = document.createElement('input');
    inputField.type = 'text';
    inputField.placeholder = 'Enter channel name';
    controlPanel.appendChild(inputField);

    // Кнопка добавления канала
    const addButton = document.createElement('button');
    addButton.textContent = 'Add Channel';
    addButton.onclick = () => {
        const channelName = inputField.value.trim();
        if (channelName && !blockedChannels.includes(channelName)) {
            blockedChannels.push(channelName);
            GM_setValue('blockedChannels', blockedChannels);
            updateChannelList();
            inputField.value = '';
        }
    };
    controlPanel.appendChild(addButton);

    // Кнопка удаления канала
    const removeButton = document.createElement('button');
    removeButton.textContent = 'Remove Channel';
    removeButton.onclick = () => {
        const channelName = inputField.value.trim();
        const index = blockedChannels.indexOf(channelName);
        if (index !== -1) {
            blockedChannels.splice(index, 1);
            GM_setValue('blockedChannels', blockedChannels);
            updateChannelList();
            inputField.value = '';
        }
    };
    controlPanel.appendChild(removeButton);

    // Список заблокированных каналов
    const channelList = document.createElement('ul');
    controlPanel.appendChild(channelList);

    // Обновляем список каналов
    function updateChannelList() {
        channelList.innerHTML = '';
        blockedChannels.forEach(channel => {
            const listItem = document.createElement('li');
            listItem.textContent = channel;
            channelList.appendChild(listItem);
        });
    }

    // Функция для скрытия смайликов, если они принадлежат заблокированному каналу
    function hideEmotesForChannel(node) {
        const emotes = node.querySelectorAll('.chat-line__message img');
        emotes.forEach(emote => {
            const emoteName = emote.getAttribute('alt');

            // Проверяем, принадлежит ли смайлик каналу из списка
            if (emoteName && isEmoteFromBlockedChannel(emoteName)) {
                console.log('Скрываем смайлик для канала:', emoteName); // Для отладки
                emote.style.display = 'none';
            }
        });
    }

    // Проверка, принадлежит ли смайлик заблокированному каналу
    function isEmoteFromBlockedChannel(emoteName) {
        return blockedChannels.some(channel => emoteName.includes(channel));
    }

    // Наблюдатель за изменениями в DOM для чата
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            if (mutation.addedNodes.length) {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === 1) { // Проверяем, что это элемент
                        hideEmotesForChannel(node);
                    }
                });
            }
        });
    });

    // Функция для ожидания появления контейнера чата
    function waitForChatContainer() {
        const chatContainer = document.querySelector('.chat-scrollable-area__message-container') ||
            document.querySelector('.ScThumbnail__wrapper');

        if (chatContainer) {
            observer.observe(chatContainer, { childList: true, subtree: true });
            console.log("Найден контейнер чата.");
        } else {
            console.log("Чат еще не загружен. Повторная попытка...");
            setTimeout(waitForChatContainer, 1000); // Пробуем снова через 1 секунду
        }
    }

    // Запускаем функцию ожидания контейнера чата
    waitForChatContainer();

    // Функция для переключения видимости панели
    function togglePanelVisibility() {
        isPanelVisible = !isPanelVisible;
        controlPanel.style.display = isPanelVisible ? 'block' : 'none';
    }

    // Добавляем команду в меню Tampermonkey для управления панелью
    GM_registerMenuCommand('Toggle Block Emotes Panel', togglePanelVisibility);

    // Добавляем панель на страницу
    document.body.appendChild(controlPanel);

    // Инициализируем список каналов
    updateChannelList();

})();