ガールズちゃんねるのマイナス数の多いコメントを非表示

各コメントのプラスとマイナスが押された数を自動的に集計し、マイナスの数が基準以上のときにコメントを非表示にします。

// ==UserScript==
// @name         ガールズちゃんねるのマイナス数の多いコメントを非表示
// @namespace    https://greasyfork.org/users/1516432
// @version      1.0.0
// @description  各コメントのプラスとマイナスが押された数を自動的に集計し、マイナスの数が基準以上のときにコメントを非表示にします。
// @author       P9DizP
// @license      MIT
// @match        https://girlschannel.net/topics/*
// @match        https://girlschannel.net/comment/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';

    /* 「+」や「-」を除去して整数に変換 */
    function parseNumber(str) {
        const cleaned = str.replace(/[+\-]/g, '').trim();
        const num = parseInt(cleaned, 10);
        return isNaN(num) ? 0 : num;
    }

    /* li 要素の id から「comment」以降の数字だけを取得 */
    function getCommentNumber(elem) {
        const id = elem.id || '';
        const match = id.match(/comment(\d+)/i);
        return match ? match[1] : '(unknown)';
    }

    /* コメントごとにプラスとマイナスを集計し、条件に応じて非表示にする */
    function processComments() {
        const commentItems = document.querySelectorAll('li.comment-item');

        commentItems.forEach(item => {
            const plusElem  = item.querySelector('div.icon-rate-wrap.icon-rate-wrap-plus div.counter p');
            const minusElem = item.querySelector('div.icon-rate-wrap.icon-rate-wrap-minus div.counter p');

            if (!plusElem || !minusElem) return;   // 必要要素が無い場合はスキップ

            const plusCount  = parseNumber(plusElem.textContent);
            const minusCount = parseNumber(minusElem.textContent);
            const totalVotes = plusCount + minusCount;

            /* コメントNo.1(トピ主)は常に表示 */
            if (item.id === 'comment1') {
                // 明示的に表示状態にしておく(他のロジックで hide されても上書き)
                item.style.display = '';
                return;   // 以降の判定は行わない
            }

            /* プラスもマイナスも 0 のコメントは常に表示 */
            if (totalVotes === 0) {
                item.style.display = '';
                return;
            }

            /* プラスとマイナスの合計が 3 以下 かつ プラスが 0 → 非表示 */
            if (totalVotes <= 3 && plusCount === 0) {
                item.style.display = 'none';
                const num = getCommentNumber(item);
                console.log(`コメントNo.${num} を非表示にしました (プラスとマイナスの合計3以下、プラス0)`);
                return;
            }

            /* プラスとマイナスの合計が 4 以上 10 以下 かつ マイナスが合計の 40% 以上 → 非表示 */
            if (totalVotes >= 4 && totalVotes <= 10) {
                const minusThreshold = Math.floor(totalVotes * 0.40); // 40% 超過判定
                if (minusCount > minusThreshold) {
                    item.style.display = 'none';
                    const num = getCommentNumber(item);
                    console.log(`コメントNo.${num} を非表示にしました (プラスとマイナスの合計4以上10以下、マイナス40%以上)`);
                    return;
                }
            }

            /* プラスとマイナスの合計が 11 以上 かつ マイナスが合計の 20% 以上  → 非表示*/
            if (totalVotes >= 11) {
                const minusThreshold = Math.floor(totalVotes * 0.20); // 20% 超過判定
                if (minusCount > minusThreshold) {
                    item.style.display = 'none';
                    const num = getCommentNumber(item);
                    console.log(`コメントNo.${num} を非表示にしました (プラスとマイナスの合計11以上、マイナス20%以上)`);
                    return;
                }
            }

            // それ以外は表示のまま(何もしない)
        });
    }

    // 初回実行
    processComments();

})();