Torn - Chat Blocklist

Hides chat messages from specified users (useful for faction, company, global, trade)

// ==UserScript==
// @name         Torn - Chat Blocklist
// @namespace    Titanic
// @version      1.1
// @description  Hides chat messages from specified users (useful for faction, company, global, trade)
// @license      MIT
// @author       Titanic_ [2968477]
// @match        https://www.torn.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

// Array of names that need to be auto filtered; please add words enclosed in quotes, separated by commas, in lowercase, e.g.
// const names = ['titanic_', 'dedesiregar'];
const names = [];

(function() {
    'use strict';

    function filterMessages() {
        if (names.length === 0) return;

        document.querySelectorAll("[class*='group-chat-box__chat-box-wrapper__']").forEach((chat) => {
            chat.querySelectorAll("[class*='chat-box-body__'] [class*='chat-box-message__box__']").forEach((message) => {
                const sender = message.querySelector("[class*='chat-box-message__sender__']");
                if (sender && names.includes(sender.textContent.toLowerCase().replace(/:/g, ""))) {
                    console.log("Hiding", sender.textContent);
                    message.closest("[class*='chat-box-message___']").remove();
                }
            });
        });
    }

    function debounce(func, wait) {
        let timeout;
        return function executedFunction(...args) {
            const later = () => {
                timeout = null;
                func(...args);
            };
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
        };
    }

    const observer = new MutationObserver((mutations) => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === Node.ELEMENT_NODE && node.matches("[class*='group-chat-box__chat-box-wrapper__']")) {
                    console.log("New chat opened:", node);
                    debouncedFilterMessages();
                }
            });
        });

        debouncedFilterMessages();
    });

    const debouncedFilterMessages = debounce(filterMessages, 100);

    const chatRoot = document.querySelector("#chatRoot");
    if (chatRoot) {
        observer.observe(chatRoot, { childList: true, subtree: true });
    }

    debouncedFilterMessages();
})();