Greasy Fork

Facebook (Messenger) Blacklist

This is how you really block people

目前为 2019-09-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         Facebook (Messenger) Blacklist
// @namespace    AAAAAAAA.com
// @version      1.3
// @description  This is how you really block people
// @author       ducktrshessami
// @match        *://www.facebook.com/*
// @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 on facebook.com
        if (document.getElementById("ChatTabsPagelet")) {
            blacklist.forEach((name) => {
                foo(name); // Messages
                bar(name); // Read receipt tooltip
            });
            foobar(); // Read receipts and message previews
        }
    }

    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, thread) { // Update a blacklisted user's nickname
        if (!blacklistNicknames[thread]) {
            blacklistNicknames[thread] = new Object;
        }
        blacklistNicknames[thread][name] = nickname;
        cleanup();
        window.localStorage.setItem("MessengerBlacklistNicknames", JSON.stringify(blacklistNicknames));
        foobar();
    }

    async function foo(name) { // Destroy targets and handle nickname parsing
        var chats = $("#ChatTabsPagelet [class='fbNubGroup clearfix'] > div > div > [class*='fantaTabMain-thread:']"), targets;
        chats.each(function() {
            targets = $(".fbNubFlyoutOuter > div > div > div > div > div > div > div > div > div > div:has([aria-label^='" + name + "']):visible", this);
            if (targets.length) { // Target acquired
                targets.hide();
                console.log("Target destroyed");
                const nickname = targets.first().find("div > div:first-child > span:first");
                if (nickname.length) {
                    update(name, nickname.prop("innerHTML"), this.className.split(' ').filter(word => word.startsWith("fantaTabMain-thread:")).join().slice(20));
                }
            }
        });
    }

    async function bar(name) { // Edit the tooltips for read receipts and reactions
        var targets = $("[data-tooltip-content*='" + name + "']:visible");
        if (targets.length) { // Target acquired
            targets.attr("data-tooltip-content", (i, tooltip) => tooltip.replace(name, "").replace("\n" + String.fromCharCode(13) + "\n", "\n"));
            console.log("Target destroyed");
        }
    }

    async function foobar() { // Handle read receipts and latest message previews
        var read, convo, latest, found;
        for (var id in blacklistNicknames) {
            found = false;
            read = $(".seen > span > span", "[class*='fantaTabMain-thread:" + id + "']").get(0);
            convo = $("[href*='" + id + "'] div.content", ".jewelContent");
            latest = $("span > span:not(:only-child):first", convo);
            for (var name in blacklistNicknames[id]) {
                if (read) {
                    if (read.innerHTML.includes(blacklistNicknames[id][name])) { // Read receipt
                        read.innerHTML = read.innerHTML.replace(", " + blacklistNicknames[id][name], "").replace(blacklistNicknames[id][name] + ", ", "");
                        console.log("Target destroyed");
                    }
                }
                if (latest.prop("innerHTML") == blacklistNicknames[id][name]) { // Message preview
                    found = true;
                    latest.parent().parent().parent().hide(); // Also spam hide regardless of visibility
                }
            }
            if (!found) { // Conversation is clear
                convo.children("div:hidden").show();
            }
        }
    }

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