RonPaul2016 / Troll Cleaner

// ==UserScript==
// @name     Troll Cleaner
// @version  0.1.1
// @description Un petit script pour se débarrasser des trolls blacklistés (et des posts les citant).
// @author RonPaul2016
// @match        http://www.jeuxvideo.com/forums/*
// @require      https://code.jquery.com/jquery-3.3.1.js
// @copyright 2018, RonPaul2016 (https://openuserjs.org//users/RonPaul2016)
// @license MIT
// ==/UserScript==

var pseudos_blacklistes = [];
var messages_a_effacer = [];

(function() {
    trouver_messages_blacklistes();
  	trouver_messages_citations();
    effacer_messages();
})();

// Récupérer tous les éléments "message" sur la page d'un topic.
function lister_posts()
{
  	return $("#content-forum").find(".bloc-message-forum");
}

// Trouver tous les messages dont l'auteur est blacklisté, et ajouter les pseudos correspondants
// et les messages respectivement dans la liste de pseudos blacklistés et de messages à effacer.
function trouver_messages_blacklistes()
{
    var posts = lister_posts();
  
  	// On parcourt les posts de la page
    for(var i = 0; i < posts.length; i++)
    {
      	// Si l'auteur du message est blacklisté, son pseudo est ajouté à la liste des pseudos blacklistés,
      	// et le post à la liste des messages à effacer
        if($(posts[i]).hasClass("msg-pseudo-blacklist"))
        {
            messages_a_effacer.push(posts[i]);
          	
            var pseudo = $(posts[i]).find(".conteneur-message").not(".conteneur-message-blacklist").find(".inner-head-content").find(".bloc-header").find(".bloc-pseudo-msg").text();
          	pseudo = pseudo.replace(/\s/g, '').toLowerCase();
          	
          	if(!pseudos_blacklistes.includes(pseudo))
            {
              	pseudos_blacklistes.push(pseudo);
            }
        }
    }
}

// Trouver les messages citant un utilisateur blacklisté.
function trouver_messages_citations()
{
  	var posts = lister_posts();
		
  	// On parcourt tous les posts de la page
  	for(var i = 0; i < posts.length; i++)
    {
      	var message = $(posts[i]).find(".conteneur-message").not(".conteneur-message-blacklist").find(".inner-head-content").find(".bloc-contenu").find(".txt-msg");
  			
      	var blacklister_message = analyser_citation(message);
      	
      	// On ajoute le message à la liste des posts à effacer si nécessaire
      	if(blacklister_message)
        {
          	messages_a_effacer.push(posts[i]);
        }
    }
}

function analyser_citation(message)
{
  	var citations = message.children("blockquote");
      
    var blacklister_message = false;

    // On parcourt tous les blocs "citation" dans le post
    for(var i = 0; i < citations.length; i++)
    {
      	var paragraphes = $(citations[i]).children("p");

        // On parcourt chaque paragraphe dans la citation
        for(var j = 0; j < paragraphes.length; j++)
        {
          // On vérifie si le paragraphe contient le début d'une citation d'un pseudo blacklisté
            var a_blacklister = contient_citation_blackliste($(paragraphes[j]).text());

            if(a_blacklister)
            {
                blacklister_message = true;
                break;
            }
        }
      
      	if (!blacklister_message)
        {
          	blacklister_message = analyser_citation($(citations[i]));
          	
          	if (blacklister_message)
            {
              	break;
            }
          	
        }
      	
      	if (blacklister_message)
        {
          	break;
        }
    }
  
  	return blacklister_message;
}

// Vérifier si un texte contient le début d'une citation, et si le pseudo cité est blacklisté
function contient_citation_blackliste(text)
{
  	var res = false;
  
  	// On cherche les débuts de citation potentiels dans le texte
  	var formes_citation = [
      {"forme": /Le\s+\d+\s+[a-z]+\s+\d+\s+à\s+\d+:\d+:\d+\s+[A-Za-z0-9_\-]+\s+a\s+écrit\s+:/g, "indice_pseudo": 6},
      {"forme": /\[\d+:\d+:\d+]\s+<[A-Za-z0-9_\-]+>/g, "indice_pseudo": 1}
    ];
  	
    var match = [];
  	for(var i = 0; i < formes_citation.length; i++)
    {
      	match.push.apply(match, [{
          "match": text.match(formes_citation[i].forme),
          "indice_pseudo": formes_citation[i].indice_pseudo
        }]);
    }
  
    // Pour chaque citation, on vérifie si le pseudo cité est blacklisté
    for(var i = 0; i < match.length; i++)
    {
      	if(match[i].match !== null)
        {
          	for(var j = 0; j < match[i].match.length; j++)
            {
              	match[i].match[j] = match[i].match[j].replace(/\s+/g, " ").replace(/</g, "").replace(/>/g, "");
                citation_split = match[i].match[j].split(" ");
                pseudo = citation_split[match[i].indice_pseudo].toLowerCase();

                if(pseudos_blacklistes.includes(pseudo))
                {
                  res = true;
                  break;
                }
            }
        }
    }
  	
  	return res;
}

// Effacer les messages blacklistés
function effacer_messages()
{
  	for(var i = 0; i < messages_a_effacer.length; i++)
    {
      	$(messages_a_effacer[i]).hide();
    }
}