LearnCpp Comment Antispam

Hide obvious wpDiscuz spam without breaking page behaviour

Per 08-11-2025. Zie de nieuwste versie.

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         LearnCpp Comment Antispam
// @namespace    https://github.com/rawafh
// @version      1.2
// @author       rawafh
// @license      MIT
// @description  Hide obvious wpDiscuz spam without breaking page behaviour
// @match        https://www.learncpp.com/*
// @run-at       document-end
// @grant        none
// ==/UserScript==

(() => {
  const MAX_BR = 80;           // was too low; wpDiscuz uses many <br> for layout
  const MAX_SHORT_LINES = 80;  // raise threshold so normal long comments stay
  const MAX_LENGTH = 8000;     // only nuke absurd walls
  const BAD_WORDS = [
    /nigg/i, /retard/i, /antisemit/i, /hamas/i, /zion/i, /kill all/i, /israel/i, /zion/i
  ];

  function isSpam(text, html) {
    if (!text) return false;

    // ignore normal spacing wpDiscuz uses
    const brCount = (html.match(/<br/gi) || []).length;
    if (brCount > MAX_BR) return true;

    const shortLines = text.split(/\r?\n/).filter(l => l.trim().length <= 2).length;
    if (shortLines > MAX_SHORT_LINES) return true;

    if (text.length > MAX_LENGTH) return true;
    if (BAD_WORDS.some(rx => rx.test(text))) return true;

    return false;
  }

  function cleanComment(el) {
    const body = el.querySelector('.wpd-comment-text');
    if (!body) return;

    const txt = body.innerText;
    const html = body.innerHTML;

    if (isSpam(txt, html)) {
      body.textContent = '[Spam comment hidden]';
      body.style.color = '#888';
    }
  }

  function scan() {
    document.querySelectorAll('.wpd-comment').forEach(cleanComment);
  }

  // run once after DOM settles
  window.addEventListener('load', () => {
    setTimeout(scan, 1500);
  });

  // observe only comment container to avoid global interference
  const target = document.querySelector('.wpd-thread') || document.body;
  const obs = new MutationObserver(() => scan());
  obs.observe(target, { childList: true, subtree: true });
})();