Reddit Comment Filter

Automatically hides annoying, repetitive, or meaningless Reddit comments

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==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
    });
})();