Reddit Comment Filter

Automatically hides annoying, repetitive, or meaningless Reddit comments

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Reddit Comment Filter
// @namespace    https://codeberg.org/cache_miss
// @version      1.3
// @description  Automatically hides annoying, repetitive, or meaningless Reddit comments
// @author       Logan Kirkland <[email protected]>
// @license      MIT
// @match        https://www.reddit.com/*/comments/*
// @match        https://old.reddit.com/*/comments/*
// @grant        none
// @homepageURL  https://codeberg.org/cache_miss/reddit-comment-filter
// @homepage     https://codeberg.org/cache_miss/reddit-comment-filter
// @supportURL   https://codeberg.org/cache_miss/reddit-comment-filter/issues
// ==/UserScript==

(function () {
    'use strict';

    // Regex patterns for comments to filter
    const FILTERED_PATTERNS = [
        /^.{0,50}laughed .{0,50} harder than .{0,50} should.{0,50}$/im,
        /^.{0,50}spit out .{0,50} coffee.{0,50}$/im,
        /^.{0,50}going to hell for this.{0,50}$/im,
        /^.{0,50}enough reddit for today.{0,50}$/im,
        /^.{0,50}comment right here.{0,50} officer.{0,50}$/im,
        /^.{0,50}how do .{0,50} delete someone else.{0,50} comment.{0,50}$/im,
        /^.{0,50}terrible day to have eyes.{0,50}$/im,
        /^.{0,50}terrible day to be literate.{0,50}$/im,
        /^.{0,50}take my up\w+.{0,50}$/im,
        /^.{0,50}sav(?:e|ing) this for later.{0,50}$/im,
        /^.{0,50}chef'*s kiss.{0,50}$/im,
        /^.{0,50}cutting onions.{0,50}$/im,
        /^.{0,50}who hurt you.{0,50}$/im,
        /^.{0,50}don’*t deserve dogs.{0,50}$/im,
        /^.{0,50}misread instructions.{0,50}now my.{0,50}$/im,
        /^.{0,50}tell me you.{0,50} without telling me.{0,50}$/im,
        /^.{0,50}not all heroe*s wear.{0,50}capes*.{0,50}$/im,
        /^.{0,50}sigh.{0,50}unzip.{0,50}pants.{0,50}$/im,
        /^.{0,50}not.{0,50}proudest.{0,50}$/im,
        /^.{0,50}downvoted for this.*$/im,
        /^.{0,50}will get downvoted.*$/im,
        /^.{0,10}this(?: one right)*.{0,10}$/im,
        /^.*(?:👏.*){5,}.*$/im,
        /^.{0,10}rip.{0,10}$/im,
        /^.{0,50}underrated \w+.{0,10}$/im,
        /^.{0,10}came here to \w+ this.{0,10}$/im,
        /^.{0,50}scroll(?:ed)* \w+ far.{0,50}$/im,
        /^.{0,10}beat\s*(?:me|meat|my meat)\s*to\s*it.{0,10}$/im,
        /^.{0,10}too poor.{0,10}give.{0,10}gold.{0,10}$/im,
        /^.{0,50}not crying.{0,10}you.{0,5}crying.{0,50}$/im,
        /^this \w+ \w+s.{0,10}$/im,
        /^.{0,50}am i the only one who.*$/im,
        /^.{0,50}is it just me.*$/im,
        /^f$/im,
        /^.{0,10}f in the.{0,50}$/im,
        /^.{0,10}must be fun at part.{0,50}$/im,
        /^chat.{0,10}is this real.{0,10}$/im,
        /^is this real.{0,10}chat.{0,10}$/im,
        /^.{0,50}don'*t \w+ (?:how|why) this (?:comment |post )*is so low.{0,50}$/im,
        /^(?:how|why) is this (?:comment |post )*so low.{0,10}$/im,
        /^i hate sand.{0,80}$/im,
        /^.{0,10}play \w+ \w+,* win \w+ \w+.{0,10}$/im,
        /^.{0,10}every \w*\s*thread.{0,10}$/im,
        /^thanks for the .{0,20} kind.{0,50}$/im,
        /^.{0,50}good (?:sir|lady|madam).{0,50}$/im,
        /^.{0,50}believe.{0,50}(top|most).{0,50}comment.{0,50}$/im,
        /^.{0,50}calm down satan.{0,50}$/im,
        /^.{0,50}repost{0,50}$/im,
        /^.{0,50}mom'*s spaghetti{0,50}$/im,
    ];

    function isOldReddit() {
        return document.URL.includes("old.reddit.com")
    }

    function shouldFilter(text) {
        return FILTERED_PATTERNS.some(pattern => pattern.test(text));
    }

    function processComments() {
        const oldReddit = isOldReddit();
        const comments = document.querySelectorAll(oldReddit ? 'div.comment' : 'shreddit-comment')

        for (const comment of comments) {
            const commentTextNode = comment.querySelector(oldReddit ? '.md' : 'div[slot="comment"]')

            // Comment text sometimes doesn't exist, such as when the comment
            // has been deleted
            if (commentTextNode === null) continue;

            const commentText = commentTextNode.textContent.trim().replace(/\n/g, ' ');
            if (shouldFilter(commentText)) {
                comment.remove();
                numFiltered++;
                console.debug("Filtered comment: " + commentText)
            }
        }
    }

    // Initial processing
    let numFiltered = 0;
    processComments();
    console.debug("Total comments filtered: " + numFiltered)


    // Monitor DOM changes for dynamically loaded comments
    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            if (mutation.addedNodes.length) {
                processComments();
                console.debug("Total comments filtered: " + numFiltered)
            }
        });
    });

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