// ==UserScript==
// @name         Discord - Hide Blocked Messages
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Discordのブロック・無視メッセージ、および特定の単語を含む投稿を非表示にする（空になった日付区切りも非表示）
// @match        https://discord.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // ここに非表示にしたい単語を追加してください（部分一致・大文字小文字区別なし）
    const NG_WORDS = [
        // '単語1',
        // '単語2',
    ];

    function hideBlockedMessages() {
        // 無視メッセージ行を丸ごと非表示
        document.querySelectorAll('[class*="blockedSystemMessage"]').forEach(el => {
            let parent = el.closest('li[id^="chat-messages-"]') || el.closest('[class*="groupStart"]');
            if (parent) parent.style.display = 'none';
        });

        // 返信プレビューに「無視したメッセージ」が含まれている場合も非表示
        document.querySelectorAll('[class*="repliedTextPlaceholder"]').forEach(el => {
            if (el.textContent.includes('無視したメッセージ')) {
                let parent = el.closest('[class*="repliedMessage"]');
                if (parent) parent.style.display = 'none';
            }
        });
    }

    function hideKeywordMessages() {
        if (NG_WORDS.length === 0) return;

        document.querySelectorAll('[class*="messageContent"]').forEach(el => {
            const text = el.textContent.toLowerCase();
            if (NG_WORDS.some(word => text.includes(word.toLowerCase()))) {
                const parent = el.closest('li[id^="chat-messages-"]');
                if (parent) parent.style.display = 'none';
            }
        });
    }

    function hideEmptyDateDividers() {
        // メッセージ一覧全体
        const list = document.querySelector('ol[data-list-id="chat-messages"]');
        if (!list) return;

        // 日付区切り（および「未読メッセージ」区切り）を持つ行を探す
        document.querySelectorAll('[role="separator"]').forEach(sep => {
            if (!list.contains(sep)) return;

            // その区切りを含む、リストの直接の子要素（行）まで遡る
            let row = sep;
            while (row.parentElement && row.parentElement !== list) {
                row = row.parentElement;
            }
            if (row.parentElement !== list) return;

            // 次の区切り行が現れるまでの間に、表示中のメッセージがあるか確認
            let hasVisibleMessage = false;
            let sibling = row.nextElementSibling;
            while (sibling) {
                // 区切り自体が次の兄弟要素の場合、querySelectorでは自分自身にヒットしないため matches で判定
                if (sibling.matches('[role="separator"]') || sibling.querySelector('[role="separator"]')) break;
                if (sibling.matches('li[id^="chat-messages-"]') && sibling.style.display !== 'none') {
                    hasVisibleMessage = true;
                    break;
                }
                sibling = sibling.nextElementSibling;
            }

            row.style.display = hasVisibleMessage ? '' : 'none';
        });
    }

    function hideAll() {
        hideBlockedMessages();
        hideKeywordMessages();
        hideEmptyDateDividers();
    }

    hideAll();

    const observer = new MutationObserver(() => {
        hideAll();
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();