🏠 Home 

Messenger Blacklist

This is how you really block people


Install this script?
Author's suggested script

You may also like Facebook (Messenger) Blacklist.


Install this script
// ==UserScript==
// @name         Messenger Blacklist
// @namespace    AAAAAAAA.com
// @version      3.6
// @description  This is how you really block people
// @author       ducktrshessami
// @match        *://www.messenger.com/*
// @match        *://www.facebook.com/messages/*
// @run-at       document-end
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
// ==/UserScript==
(function() {
const blacklist = [ // Fill this list with their Facebook names
""
];
/***************** ^^ Edit above list ^^ *****************/
function main() { // Triggered by page change
var dialog = $("[aria-label='Dialog content']");
present().forEach((name) => { // Member list
donk("[title^='Seen by " + name + " ']"); // Read receipt
donk("[aria-label='Messages'] > div > div:has([alt='" + name + "'])", name); // Messages
if (dialog.length) {
donk_box("li:has(a[href]:contains('" + name + "'))", dialog); // Nickname change
donk_box(":contains('Message Reactions') div[class] > div[class]:has(div[class]:contains('" + name + "'))", dialog);
}
reaction(name); // Reactions
});
latest_message(); // Latest message
}
function cleanup() { // Check for removed names from the blacklist
for (var id in blacklistNicknames) {
for (var name in blacklistNicknames[id]) {
if (!blacklist.includes(name)) {
delete blacklistNicknames[id][name];
}
}
if (jQuery.isEmptyObject(blacklistNicknames[id])) {
delete blacklistNicknames[id];
}
}
}
async function update(name, nickname) { // Update a blacklisted user's nickname
const url = location.href; // Assume nickname is for current conversation
if (url) {
if (!blacklistNicknames[url]) {
blacklistNicknames[url] = new Object;
}
blacklistNicknames[url][name] = nickname;
window.localStorage.setItem("MessengerBlacklistNicknames", JSON.stringify(blacklistNicknames));
latest_message();
}
}
function present() { // Check if there are blacklisted users in the current conversation
return blacklist.filter((name) => {
if (name) {
var member = $("li:has(:contains('" + name + "'))", ".uiScrollableAreaContent:contains('Conversation Information')");
member.hide(); // Just spam hide regardless of visibility
return member.length;
}
});
}
async function donk(selector, name) { // Destroy targets and handle nickname parsing
var targets = $(selector + ":visible");
if (targets.length) { // Target acquired
targets.hide();
console.log("Target destroyed");
if (name) { // Nickname parsing
var nickname = targets.first().find("h5[aria-label]");
if (nickname.length) { // Nickname located
if (nickname.children().length) {
nickname = nickname.children();
}
update(name, nickname.prop("innerHTML"));
}
}
}
}
async function donk_box(selector, context) {
var targets = $(selector + ":visible", context);
if (targets.length) { // Target acquired
targets.hide();
console.log("Target destroyed");
}
}
async function latest_message() { // Check the latest message of every conversation for blacklisted nicknames
var convo, latest, found, a, b, c;
for (var url in blacklistNicknames) {
found = false;
convo = $("[data-href='" + url + "']");
if (convo) {
latest = $("div > div > div[class]:last-child:not(:only-child)", convo); // Messenger has multiple HTML arrangements for displaying nicknames
a = latest.children().get(0);
b = $("div:last-child > span > span:not(:only-child)", convo);
c = $("span:not([class])", b);
for (var name in blacklistNicknames[url]) {
if (!found) {
if (a.textContent.startsWith(blacklistNicknames[url][name]) || b.prop("innerHTML") == blacklistNicknames[url][name] || c.prop("innerHTML") == blacklistNicknames[url][name]) { // Target acquired
found = true;
latest.hide(); // Also spam hide regardless of visibility
}
}
}
if (!found) { // Conversation is clear
latest.show();
}
}
}
}
async function reaction(name) { // Edit the tooltip for reactions
var targets = $("[data-tooltip-content*='" + name + "']:visible"), n;
if (targets.length) { // Target acquired
$("[role='button'] > span:last-child", targets).text((i, s) => {
if (s == 1) {
$("[role='button']", targets).hide();
}
return s - 1;
});
targets.attr("data-tooltip-content", (i, tooltip) => tooltip.replace(name, "").replace("\n\n", "\n"));
console.log("Target destroyed");
}
}
var blacklistNicknames, observer = new MutationObserver(main);
if (!(blacklistNicknames = JSON.parse(window.localStorage.getItem("MessengerBlacklistNicknames")))) { // Check for stored value
blacklistNicknames = new Object;
window.localStorage.setItem("MessengerBlacklistNicknames", JSON.stringify(blacklistNicknames));
}
cleanup();
observer.observe(document.body, { // Wait for page change
childList: true,
subtree: true
});
window.addEventListener("beforeunload", () => { // Store before leaving
cleanup();
window.localStorage.setItem("MessengerBlacklistNicknames", JSON.stringify(blacklistNicknames));
});
})();