Greasy Fork is available in English.

Messenger Blacklist

This is how you really block people

Pasang skrip ini?
Sugesti pemilik skrip

Kamu mungkin juga suka Facebook (Messenger) Blacklist.

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