// ==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();
})();