// ==UserScript==
// @name Full_Black_List
// @namespace Full_Black_List
// @version 0.19.0
// @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/messages-prives/message.php*
// @match *://www.jeuxvideo.com/messages-prives/indesirables.php
// @match *://www.jeuxvideo.com/sso/blacklist.php
// @match *://www.jeuxvideo.com/login*
// @icon https://images.emojiterra.com/microsoft/fluent-emoji/15.1/128px/1f6ab_color.png
// @license MIT
// @grant none
// ==/UserScript==
//___FETCH___SYNCH__BL___(FECTH)___
async function synchfetchpseudos() {
let response = await fetch('/sso/blacklist.php');
let htmlText = await response.text();
let parser = new DOMParser();
let 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));
}
//___Fetch_MP_LIST_______(FETCH)___
let idListF = [];
let haListF = [];
async function fetchOnce() {
let response = await fetch('/messages-prives/indesirables.php');
let htmlfofo = await response.text();
let parser = new DOMParser();
let doc = parser.parseFromString(htmlfofo, 'text/html');
let listItems = doc.querySelectorAll('#blacklist i');
listItems.forEach(i => {
let idAlias = i.getAttribute('data-id');
let hashtempo = i.getAttribute('data-hash');
idListF.push(idAlias);
haListF.push(hashtempo);
});
}
//___Clean_MP_LIST_ONE__(FETCH)___
function deleteblacklistMP(cross) {
let listItem = cross.closest('li'); // Trouver l'élément <li> parent
let idAlias = listItem.getAttribute('data-id-alias'); // Récupérer l'id depuis le parent
let index = idListF.indexOf(idAlias); // Trouver l'index de l'élément dans idListF
if (index !== -1) {
let hashtempo = haListF[index];
let url = `/messages-prives/message.php?del_blacklist=${idAlias}&h=${hashtempo}`;
fetch(url);
}
}
//___Clean_MP_LIST_ALL__(FETCH)___
async function removeFromBlacklistMP() {
let fetchPromises = idListF.map((idAlias, index) => {
let hashtempo = haListF[index]; // Récupérer le hash associé à l'index
let url = `/messages-prives/message.php?del_blacklist=${idAlias}&h=${hashtempo}`;
return fetch(url); // Effectuer la suppression
});
await Promise.all(fetchPromises);
}
//_______PAGE_DE______CONNEXION___(Login)___
if (window.location.href.indexOf('jeuxvideo.com/login') > -1) {
localStorage.removeItem('fullblacklistJVC');
}
//______MASQUAGE_____BLOC____MESSAGE____FORUM__(Topic_1_42)____
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
let blacklistBlocks = document.querySelectorAll('.msg-pseudo-blacklist');
blacklistBlocks.forEach(block => {
block.remove();
});
//ajout dun event au bouton blacklist
let 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'
}
}
//______BLACKLIST____LISTE_SUJETS___(Liste_Sujet)(Recherche)___
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().then(() => location.reload());
}
}
// Fonction pour supprimer des éléments insensible à la casse
function supprimerParListeDePseudos(pseudos) {
let pseudosLower = pseudos.map(pseudo => pseudo.toLowerCase()); // liste tout les pseudo en miniusucle
document.querySelectorAll('li').forEach(item => {
let auteur = item.querySelector('.topic-author');
if (auteur && pseudosLower.includes(auteur.textContent.trim().toLowerCase())) {
// Supprimer le sujet si ateur
item.remove();
}
});
}
let pseudosBlacklist = getListeBlacklist();
supprimerParListeDePseudos(pseudosBlacklist);
}
//_______BOUTON_____BLACKLIST___LISTE_SUJET_(Liste_Sujet)_____
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 = 'Actu 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_MP__(Message_MP)____
if (window.location.href.indexOf('jeuxvideo.com/messages-prives/message.php') > -1) {
//ajout dun event au bouton blacklist
let blacklisterBtns = document.querySelectorAll('.picto-msg-tronche');
blacklisterBtns.forEach(function(btn) {
btn.addEventListener('click', function() {
let dataUrl = btn.getAttribute('data-url');
sessionStorage.setItem('fullblacklistJVCIDMP', dataUrl);
sessionStorage.setItem('fullblacklistJVCAwait', 'true');
});
});
// Mise à jour de la Blacklist fofo du script apres actualisation
let bljvcawait = sessionStorage.getItem('fullblacklistJVCAwait');
if (bljvcawait === 'true') {
(async () => {
// Fetch recuperer hash preference forum
let response = await fetch('/forums/0-36-0-1-0-1-0-0.htm');
let htmlfofo = await response.text();
let parser = new DOMParser();
let doc = parser.parseFromString(htmlfofo, 'text/html');
let ajaxHashpref = doc.querySelector('#ajax_hash_preference_user');
// preference_user_hash => necassaire pour ajouter à la blacklist JVC
let fullidmp = sessionStorage.getItem('fullblacklistJVCIDMP');
let match = fullidmp.match(/add_blacklist=(\d+)/); //id_pseudo
let idAlias = match ? match[1] : null;
let url = `/forums/ajax_forum_blacklist.php?id_alias_msg=${idAlias}&action=add&ajax_hash=${ajaxHashpref.value}`;
let result = await fetch(url);
await synchfetchpseudos();
sessionStorage.removeItem('fullblacklistJVCAwait'); // Supprime la clé 'fullblacklistJVCAwait'
sessionStorage.removeItem('fullblacklistJVCIDMP'); // Supprime la clé
let newUrl = location.href.replace(/&add_blacklist=[^&]+&h=[^&]+/, "");
if (newUrl !== location.href) location.replace(newUrl);
})();
}
//liste_local_storage_blacklist_les_MP_+_masquage
function supprimerParListeDePseudos(pseudos) {
let pseudosLower = pseudos.map(pseudo => pseudo.toLowerCase()); // Liste tous les pseudos en minuscules
let blacklistBlocks = document.querySelectorAll('.bloc-message-forum');
let clicked;
blacklistBlocks.forEach(block => {
let auteur = block.querySelector('.bloc-pseudo-msg'); // Cibler l'élément avec le pseudo
let boutonBlacklist = block.querySelector('.picto-msg-tronche');
if (auteur && pseudosLower.includes(auteur.textContent.trim().toLowerCase())) {
boutonBlacklist.click(); // BL_MP
}
});
}
//masquage_message_BL_CLASSIQUE
let blacklistBlocks = document.querySelectorAll('.msg-pseudo-blacklist');
blacklistBlocks.forEach(block => {
block.remove();
});
//recup_local_storage
function getListeBlacklist() {
let liste = localStorage.getItem('fullblacklistJVC');
if (liste) {
return JSON.parse(liste);
} else {
synchfetchpseudos().then(() => location.reload());
}
}
let pseudosBlacklist = getListeBlacklist();
supprimerParListeDePseudos(pseudosBlacklist);
}
//________________Suuppression_combiné_BL___(Page_BlackList_MP)____
if (window.location.href.indexOf('jeuxvideo.com/messages-prives/indesirables.php') > -1) {
document.querySelectorAll('.mp_delete_blacklist').forEach(function(button) {
button.addEventListener('click', function() {
let userId = this.getAttribute('data-id'); // Récupère l'ID depuis l'attribut data-id
fetch(`/sso/ajax_delete_blacklist.php?id_alias_unblacklist=${userId}`)
.then(() => {
localStorage.removeItem('fullblacklistJVC'); //vide black list local storage
});
});
});
}
//________________MISE_A_JOUR_PAGE_BLACK_LISTE__(Page_BlackList_Forums)____
if (window.location.href.indexOf('jeuxvideo.com/sso/blacklist.php') > -1) {
updatepseudos();
// Parcourt chaque élément et ajoute un gestionnaire d'événement
let crosses = document.querySelectorAll('.icon-cross-entypo');
crosses.forEach(cross => {
cross.addEventListener('click', async () => {
updatepseudos(); // Mettre à jour les pseudos si nécessaire
if (typeof hasFetched === 'undefined') {
await fetchOnce(); // Fetch une seule fois idListF et haListF
hasFetched = true; // Marquer que le fetch a été effectué
}
deleteblacklistMP(cross); // Interagir avec l'élément après avoir effectué la suppression
});
});
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__BLACKLIST___(Page_BlackList_Forums)____
if (window.location.href.indexOf('jeuxvideo.com/sso/blacklist.php') > -1) {
'use strict';
//fonction suppression totale black list
async function deleteBlacklist() {
strikeBtn.textContent = 'Loading...';
// Récupérer tous les éléments <li> dans #blacklist
let listItems = document.querySelectorAll('#blacklist li');
let idList = [];
listItems.forEach(li => {
let idAlias = li.getAttribute('data-id-alias');
idList.push(idAlias);
});
// Créer un tableau de promesses pour les requêtes Ajax
let fetchPromises = idList.map(idAlias => {
let url = `/sso/ajax_delete_blacklist.php?id_alias_unblacklist=${idAlias}`;
return fetch(url);
});
// Attendre que toutes les requêtes se terminent
if (typeof hasFetched === 'undefined') {
await fetchOnce(); // Fetch une seule fois idList et haListF
hasFetched = true; // Marquer que le fetch a été effectué
}
await removeFromBlacklistMP();
let results = await Promise.all(fetchPromises);
window.location.reload();
}
// 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_JVC.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;
// Fetch recuperer hash preference forum
let response = await fetch('/forums/0-36-0-1-0-1-0-0.htm');
let htmlfofo = await response.text();
let parser = new DOMParser();
let doc = parser.parseFromString(htmlfofo, 'text/html');
let ajaxHashpref = doc.querySelector('#ajax_hash_preference_user');
// preference_user => necassaire pour ajouter à la blacklist JVC
let reader = new FileReader();
reader.onload = async e => {
try {
importBtn.textContent = 'Load...';
// Lecture et parsing du fichier JSON
let blacklist = JSON.parse(e.target.result);
// Boucle ajax pour ajouter pseudo blacklist de la liste
let fetchPromises = blacklist.map(idAlias => {
let url = `/forums/ajax_forum_blacklist.php?id_alias_msg=${idAlias}&action=add&ajax_hash=${ajaxHashpref.value}`;
return fetch(url);
});
//attendre resultat pour refresh
let results = await Promise.all(fetchPromises);
window.location.reload();
} catch (error) {
alert("Fichier JSON invalide");
window.location.reload();
}
};
reader.readAsText(file);
}
// Creation Boutons Groupes
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
let ull1 = document.createElement('ul');
let ull2 = document.createElement('ul');
// Création du bouton d'export
let exportBtn = document.createElement('button');
exportBtn.textContent = 'Exporter';
exportBtn.title = 'Exporter BlackList JVC en Fichier';
exportBtn.className = 'simpleButton';
exportBtn.style.borderRadius = '6px';
exportBtn.addEventListener('click', exportBlacklist);
// Création du bouton d'import
let importBtn = document.createElement('button');
importBtn.textContent = 'Importer';
importBtn.title = 'Importer BlackList depuis un Fichier';
importBtn.className = 'simpleButton';
importBtn.style.borderRadius = '6px';
importBtn.addEventListener('click', function() {
let input = document.createElement('input');
input.type = 'file';
input.accept = '.json';
input.addEventListener('change', importBlacklist);
input.click();
});
let strikeBtn = document.createElement('button');
strikeBtn.textContent = 'Vider BL Forum et MP';
strikeBtn.title = 'Vider toute la blacklist JVC + MP + Script';
strikeBtn.className = 'simpleButton';
strikeBtn.style.borderRadius = '6px';
strikeBtn.style.backgroundColor = 'red';
strikeBtn.addEventListener('click', () => window.confirm('⚠️ Supprimer toute la blacklist (JVC + MP + Script) ??⚠️') ? deleteBlacklist() : null);
/*
let linkBtn = document.createElement('button');
linkBtn.textContent = 'BL MP';
linkBtn.title = 'BlackList MP';
linkBtn.className = 'simpleButton';
linkBtn.style.borderRadius = '6px';
linkBtn.addEventListener('click', () => window.location.href = '/messages-prives/indesirables.php');
*/
// Ajouter les boutons au container
ull1.appendChild(importBtn);
ull1.appendChild(document.createTextNode('\u00A0\u00A0'));
ull1.appendChild(exportBtn);
ull2.appendChild(strikeBtn);
/*
ull2.appendChild(document.createTextNode('\u00A0\u00A0'));
ull2.appendChild(linkBtn);
*/
container.appendChild(ull1);
container.appendChild(ull2);
}
/*
MIT License
Copyright (c) 2023 Atlantis (https://github.com/Lantea-Git)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/