Full_Black_List

Supprime totalement les sujets des pseudo blacklistés depuis la blacklist JVC.

目前為 2025-01-29 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Full_Black_List
// @namespace    Full_Black_List
// @version      0.9.7
// @description  Supprime totalement les sujets des pseudo blacklistés depuis la blacklist JVC.
// @author       Atlantis
// @match        *://www.jeuxvideo.com/recherche/forums/0-*
// @match        *://www.jeuxvideo.com/forums/0-*
// @match        *://www.jeuxvideo.com/forums/42-*
// @match        *://www.jeuxvideo.com/forums/1-*
// @match        *://www.jeuxvideo.com/forums/message*
// @match        *://www.jeuxvideo.com/sso/blacklist.php
// @match        *://www.jeuxvideo.com/login*
// @icon         https://images.emojiterra.com/google/noto-emoji/unicode-16.0/color/128px/274c.png
// @license      MIT
// @grant        none
// ==/UserScript==

// FETCH SYNCH BL
async function synchfetchpseudos() { 
    const response = await fetch('https://www.jeuxvideo.com/sso/blacklist.php');
    const htmlText = await response.text();

    const parser = new DOMParser();
    const doc = parser.parseFromString(htmlText, 'text/html');

    let pseudos = doc.querySelectorAll('#blacklist span');

    let pseudoList = [];
    pseudos.forEach(span => {
        pseudoList.push(span.textContent.trim());
    });

    localStorage.setItem('fullblacklistJVC', JSON.stringify(pseudoList));

}

//PAGE DE CONNEXION
if (window.location.href.indexOf('jeuxvideo.com/login') > -1) {
    localStorage.removeItem('fullblacklistJVC');
}

// BLACK LIST SUJETS
if (window.location.href.indexOf('jeuxvideo.com/forums/0-') > -1 || window.location.href.indexOf('jeuxvideo.com/recherche/forums/0-') > -1) {
    // Fonction pour récupérer la liste des pseudos blacklistés depuis JVC ou le local storage
    function getListeBlacklist() {
        let liste = localStorage.getItem('fullblacklistJVC');
        if (liste) {
            return JSON.parse(liste);
        } else {
            synchfetchpseudos(); // Fonction à exécuter si la liste est pseudo connecté
            setTimeout(() => {
                location.reload();
            }, 2000);
        }
    }

    // Fonction pour supprimer des éléments insensible à la casse
    function supprimerParListeDePseudos(pseudos) {
        const pseudosLower = pseudos.map(pseudo => pseudo.toLowerCase()); // liste tout les pseudo en miniusucle
        document.querySelectorAll('li').forEach(item => {
            const auteur = item.querySelector('.topic-author');
            if (auteur && pseudosLower.includes(auteur.textContent.trim().toLowerCase())) {
                // Supprimer le sujet si ateur
                item.remove();
            }
        });
    }



    const pseudosBlacklist = getListeBlacklist();

    // Exécuter la fonction après le chargement initial
    supprimerParListeDePseudos(pseudosBlacklist);
}

// BOUTON BLACK LISTE
if (window.location.href.indexOf('jeuxvideo.com/forums/0-') > -1) {

    var divContainer = document.createElement('div');
    divContainer.classList.add('custom-btn-container');

    // Créer les spans à l'intérieur de la div
    var span1 = document.createElement('span');
    //span1.classList.add('btn');
    span1.classList.add('btn', 'btn-actu-new-list-forum', 'btn-actualiser-forum', 'icon-refresh');
    span1.textContent = 'Synch BL';
    span1.title = 'Actualiser la blacklist des Sujets';
    span1.style.borderRadius = '6px';
    span1.style.minWidth = '5rem';
    //span1.style.textDecoration = 'underline';
    span1.addEventListener('click', synchfetchpseudos);
    span1.addEventListener('click', function () { alert('Filtrage des topics actualisés avec la blacklist JVC ✅'); });
    span1.addEventListener('click', function () { location.reload(); });

    // Vous pouvez ajouter d'autres spans si nécessaire
    var span2 = document.createElement('span');
    //span2.classList.add('btn');
    span2.classList.add('btn', 'btn-actu-new-list-forum', 'btn-actualiser-forum');
    span2.textContent = 'Voir BL';
    span2.title = 'Voir/Editer/Eporter la BlackList';
    span2.style.borderRadius = '6px';
    span2.style.minWidth = '4rem';
    //span2.style.textDecoration = 'underline';
    span2.addEventListener('click', function() { window.open('/sso/blacklist.php', '_blank'); });

    // Ajouter les spans à la div
    divContainer.appendChild(span1);
    divContainer.appendChild(document.createTextNode('\u00A0\u00A0'));
    divContainer.appendChild(span2);

    // Trouver l'élément avec la classe 'bloc-pagi-default px-3 px-lg-0'
    var blocPagiDefault = document.querySelector('.bloc-pagi-default.px-3.px-lg-0');
    var pagiBeforeListTopic = document.querySelector('.pagi-before-list-topic');

    // Ajouter la div juste après cette div spécifique
    pagiBeforeListTopic.parentNode.insertBefore(divContainer, pagiBeforeListTopic.nextSibling);

}


// MASQUAGE BLOC MESSAGE
if (window.location.href.indexOf('jeuxvideo.com/forums/1-') > -1 || window.location.href.indexOf('jeuxvideo.com/forums/42-') > -1 || window.location.href.indexOf('jeuxvideo.com/forums/message/') > -1) {

    //masquage_message
    const blacklistBlocks = document.querySelectorAll('.msg-pseudo-blacklist');
    blacklistBlocks.forEach(block => {
        block.remove();
    });

    //ajout dun event au bouton blacklist
    const blacklisterBtns = document.querySelectorAll('.picto-msg-tronche');
    blacklisterBtns.forEach(function(btn) {
        btn.addEventListener('click', function() {
            sessionStorage.setItem('fullblacklistJVCAwait', 'true');
        });
    });

    // Mise à jour de la Blacklist du script apres actualisation 
    let bljvcawait = sessionStorage.getItem('fullblacklistJVCAwait');
    if (bljvcawait === 'true') {
        synchfetchpseudos(); // fullblacklistJVCAwait est 'true'
        sessionStorage.removeItem('fullblacklistJVCAwait'); // Supprime la clé 'fullblacklistJVCAwait'
    }

}

// MISE A JOUR PAGE BLACK LISTE
if (window.location.href.indexOf('jeuxvideo.com/sso/blacklist.php') > -1) {

    updatepseudos();

    // Parcourt chaque élément et ajoute un gestionnaire d'événement
    const crosses = document.querySelectorAll('.icon-cross-entypo');
    crosses.forEach(cross => {
        cross.addEventListener('click', updatepseudos);
    });

    function updatepseudos() {
        setTimeout(() => {
            let pseudos = document.querySelectorAll('#blacklist span');

            let pseudoList = [];
            pseudos.forEach(span => {
                pseudoList.push(span.textContent.trim());
            });

            localStorage.setItem('fullblacklistJVC', JSON.stringify(pseudoList));
        }, 1000); //delais pour capturer la page à jour
    }
}

// EXPORT PAGE BLACK LIST
if (window.location.href.indexOf('jeuxvideo.com/sso/blacklist.php') > -1) {
    'use strict';

    // Fonction d'exportation de la Blacklist
    function exportBlacklist() {

        let listItems = document.querySelectorAll('#blacklist li');
        let idList = [];
        listItems.forEach(li => {
            let idAlias = li.getAttribute('data-id-alias');
            idList.push(idAlias);
        });
        let jsonBlob = new Blob([JSON.stringify(idList, null, 2)], { type: 'application/json' });

        //creation_lien_telechargement
        let link = document.createElement('a');
        link.href = URL.createObjectURL(jsonBlob);
        link.download = 'blacklist.json';
        link.click();
    }

    // Fonction d'importation de la Blacklist depuis un fichier JSON
    async function importBlacklist(event) {
        let file = event.target.files[0];
        if (!file) return;

        const response = await fetch('https://www.jeuxvideo.com/forums/0-51-0-1-0-1-0-0.htm');
        const htmlfofo = await response.text();
        const parser = new DOMParser();
        const doc = parser.parseFromString(htmlfofo, 'text/html');
        const ajaxHashpref = doc.querySelector('#ajax_hash_preference_user');
        console.log(ajaxHashpref.value)
    
        let reader = new FileReader();
        reader.onload = async e => {
            // Lecture et parsing du fichier JSON
            let blacklist = JSON.parse(e.target.result);
    
            // Créer un tableau de promesses pour chaque ajout pseudo blacklist
            let fetchPromises = blacklist.map(idAlias => {
                let url = `https://www.jeuxvideo.com/forums/ajax_forum_blacklist.php?id_alias_msg=${idAlias}&action=add&ajax_hash=${ajaxHashpref.value}`;
                return fetch(url)
            });
            // Attendre que toutes les requêtes fetch soient terminées
            let results = await Promise.all(fetchPromises);
            window.location.reload();
        };
        reader.readAsText(file);
    }

    // Ajouter les boutons Export et Import
    let container = document.querySelector('.layout__row.layout__content.layout__row--gutter.mb-5');
    if (!container) return; // Si le container n'existe pas, ne rien faire

    // Création du bouton d'export
    let exportBtn = document.createElement('button');
    exportBtn.textContent = 'Export JSON';
    exportBtn.className = 'simpleButton';
    exportBtn.addEventListener('click', exportBlacklist);

    // Création du bouton d'import
    let importBtn = document.createElement('button');
    importBtn.textContent = 'Import JSON';
    importBtn.className = 'simpleButton';
    importBtn.addEventListener('click', function() {
        let input = document.createElement('input');
        input.type = 'file';
        input.accept = '.json';
        input.addEventListener('change', importBlacklist);
        input.click();
    });

    // Ajouter les boutons au container
    container.appendChild(document.createTextNode('\u00A0\u00A0\u00A0'));
    container.appendChild(importBtn);
    container.appendChild(document.createTextNode('\u00A0\u00A0')); // Espace entre les boutons
    container.appendChild(exportBtn);

}