Messenger Blacklist

This is how you really block people

安装此脚本
作者推荐脚本

您可能也喜欢Facebook (Messenger) Blacklist

安装此脚本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

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