Facebook Fuck-Off Pseudoanonymní Mrdky.

Skrývá anonymní č****, které si nelze jinak zablokovat díky incestnímu správci.

질문, 리뷰하거나, 이 스크립트를 신고하세요.
// ==UserScript==
// @name         Facebook Fuck-Off Pseudoanonymní Mrdky.
// @namespace    http://tampermonkey.net/
// @version      6.6.9
// @description  Skrývá anonymní č****, které si nelze jinak zablokovat díky incestnímu správci.
// @description:en  Hides anonymous members that cannot be blocked due to the incestuous admin.
// @author       Projekt Darkside - DevIT Brno - EU
// @icon         https://github.githubassets.com/images/icons/emoji/unicode/1f480.png
// @license      Darkside;
// @match        *://*.facebook.com/*
// @grant        none
// @run-at       document-idle
// @require      https://code.jquery.com/jquery-3.7.1.min.js
// ==/UserScript==

/* global $ */

(function () {
    'use strict';


    // Jméno Scriptu pro přehled v logování
    const USR_SCRIPT_NAME = " FCK ANONYMOUS ";

    // Vytvoříme si CSS design pro náš LOG v console
    const USR_CSS_SCRIPT_NAME = [
        'color: lime;',
        'background: black;',
        'font-size: 15px;',
        'border: 1px solid red;',
        'font-weight: bold;',
    ].join(';');

    const USR_CSS_FUNC_NAME = [
        'color: red;',
        'background: black;',
        'font-size: 15px;',
        'border: 1px solid red;',
        'font-weight: bold;',
    ].join(';');

    // Texty, které hledáme
    const Wlang = [
        "Anonymous member", // Angličtina
        "Anonymní člen",     // Čeština
        "Anonymný člen",     // Slovenština
        "Membre anonyme",    // Francouzština
        "Miembro anónimo",   // Španělština
        "Anonymer Mitglied", // Němčina
        "Membro anonimo",    // Italština
        "Membro anônimo",    // Portugalština
        "Анонимный участник",// Ruština
        "匿名メンバー",        // Japonština
    ];

    // Texty, které hledáme pro různé jazyky (Komentář od)
    const anonymousLabels = [
        "Comment from Anonymous member", // Angličtina
        "Komentář od Anonymní člen",     // Čeština
        "Komentár od Anonymný člen",     // Slovenština
        "Commentaire de membre anonyme", // Francouzština
        "Comentario de miembro anónimo", // Španělština
        "Kommentar von Anonymer Mitglied", // Němčina
        "Commento di membro anonimo",    // Italština
        "Comentário de membro anônimo", // Portugalština
        "Комментарий от анонимного члена", // Ruština
        "コメントから匿名メンバー"            // Japonština
    ];

    // Console logy v multilang :)
    const languageLabels = {
        en: {
            anonymousComment: "Comment from Anonymous member",
            hideSection: "Hidden anonymous member section on the main page",
            hideComment: "Hidden anonymous member comment section"
        },
        cs: {
            anonymousComment: "Komentář od Anonymní člen",
            hideSection: "Skrytá sekce anonymního člena na hlavní stránce",
            hideComment: "Skrytá sekce anonymního člena v komentáři"
        },
        sk: {
            anonymousComment: "Komentár od Anonymný člen",
            hideSection: "Skrytá sekcia anonymného člena na hlavnej stránke",
            hideComment: "Skrytá sekcia anonymného člena v komentári"
        },
        fr: {
            anonymousComment: "Commentaire de membre anonyme",
            hideSection: "Section du membre anonyme masquée sur la page principale",
            hideComment: "Section du commentaire du membre anonyme masquée"
        },
        es: {
            anonymousComment: "Comentario de miembro anónimo",
            hideSection: "Sección de miembro anónimo oculta en la página principal",
            hideComment: "Sección de comentario de miembro anónimo oculta"
        },
        de: {
            anonymousComment: "Kommentar von Anonymer Mitglied",
            hideSection: "Verborgenes anonymes Mitgliederbereich auf der Hauptseite",
            hideComment: "Verborgener anonymer Mitgliederkommentarbereich"
        },
        it: {
            anonymousComment: "Commento di membro anonimo",
            hideSection: "Sezione di membro anonimo nascosta nella pagina principale",
            hideComment: "Sezione di commento di membro anonimo nascosta"
        },
        pt: {
            anonymousComment: "Comentário de membro anônimo",
            hideSection: "Seção de membro anônimo oculta na página principal",
            hideComment: "Seção de comentário de membro anônimo oculta"
        },
        ru: {
            anonymousComment: "Комментарий от анонимного члена",
            hideSection: "Скрытая секция анонимного члена на главной странице",
            hideComment: "Скрытая секция комментария анонимного члена"
        },
        ja: {
            anonymousComment: "コメントから匿名メンバー",
            hideSection: "メインページで非表示の匿名メンバーセクション",
            hideComment: "コメントセクションの匿名メンバーが非表示"
        }
    };


    // Funkce pro detekci jazyka prohlížeče
    // Získá jazyk prohlížeče a vrátí jazykový kód (např. 'en' pro angličtinu, 'cs' pro češtinu).
    // Pokud není jazyk k dispozici, vrátí angličtinu jako výchozí jazyk.
    function getBrowserLanguage() {
        const language = navigator.language || navigator.userLanguage; // Získání jazyka prohlížeče
        const languageCode = language.substring(0, 2); // Extrahování prvních dvou znaků (jazykový kód)
        return languageLabels[languageCode] ? languageCode : 'en'; // Pokud jazyk existuje v našem seznamu, vrátí ho, jinak 'en'
    }

    // Funkce pro překlad textu podle detekovaného jazyka
    // Přijímá klíč (např. 'hideSection') a vrací odpovídající překlad v aktuálním jazyce prohlížeče.
    // Pokud není překlad k dispozici pro daný jazyk, použije angličtinu jako fallback.
    function translate(key) {
        const browserLanguage = getBrowserLanguage(); // Získání detekovaného jazyka
        return languageLabels[browserLanguage][key] || languageLabels['en'][key]; // Vrácení překladu, nebo angličtiny pokud není k dispozici
    }


    // Funkce pro skrytí anonymních členů podle textu začínajícího na "Anonymní člen" a následovaného číslem
    function hideAnonymousMembers() {
        // Regulární výraz pro hledání "Anonymní člen" následovaného číslem
        const anonPattern = new RegExp('^' + Wlang.join('|') + '\\s+\\d+$'); // Například: Anonymní člen 868

        // Pro každý text, který hledáme
        $.each(Wlang, function (index, ExistedWords) {
            document.querySelectorAll('div[role="button"]').forEach(button => {
                if (anonPattern.test(button.innerText.trim())) {
                    let parentDiv = button.closest('div'); // Změněno na closest()

                    // Pokud chceš jít výš, změníš číslo v nth-of-type
                    // Tato část ladí dynamiku webu
                    for (let i = 0; i < 15; i++) {
                        if (parentDiv && parentDiv.parentElement) {
                            parentDiv = parentDiv.parentElement;
                        }
                    }

                    // Skrytí divu
                    if (parentDiv) {
                        parentDiv.style.display = 'none';
                        console.log('%c ' + USR_SCRIPT_NAME + ' %c ' + translate('hideSection') + ': ', USR_CSS_SCRIPT_NAME, USR_CSS_FUNC_NAME, parentDiv);
                    }
                }
            });
        });
    }

    // Funkce pro skrytí komentářů s atributy aria-hidden a role="link" obsahujících anonymní text
    function hideAnonymousComments() {
        // Pro každý jazyk v anonymousLabels
        $.each(anonymousLabels, function (index, label) {
            // console.log(`Hledám divy s aria-label začínající na: ${label}`);

            // Hledáme divy podle aria-label
            document.querySelectorAll('div[aria-label^="' + label + '"][role="article"]').forEach(link => {
                console.log('Nalezený prvek:', link);

                let targetDiv = link.closest('div'); // Začínáme u aktuálního divu
                console.log('Začínáme od divu s closest:', targetDiv);

                // Procházíme rodiče zpětně (max. 15 kroků)
                for (let i = 0; i < 2; i++) {
                    if (targetDiv && targetDiv.parentElement) {
                        targetDiv = targetDiv.parentElement; // Procházíme rodiče
                        console.log(`Procházím rodiče: ${targetDiv}`);
                    } else {
                        console.log('Nenalezen více rodičů');
                        break; // Když nejsou žádní rodiče
                    }
                }

                // Skrytí divu
                if (targetDiv) {
                    // targetDiv.style.display = 'none'; // Skrytí divu
                    targetDiv.remove(); // Smazání divu
                    console.log('%c ' + USR_SCRIPT_NAME + ' %c ' + translate('hideComment') + ': ', USR_CSS_SCRIPT_NAME, USR_CSS_FUNC_NAME, parentDiv);
                } else {
                    console.log('Nenašel jsem žádný platný rodič');
                }
            });
        });
    }




    // Spustí skenování každé 2 sekundy pro dynamické změny
    setInterval(() => {
        hideAnonymousMembers(); // Skrytí anonymních členů
        hideAnonymousComments(); // Skrytí anonymních komentářů
    }, 1500);

    // První skrytí při načtení
    hideAnonymousMembers();
    hideAnonymousComments();

})();