Greasy Fork

Messenger Blacklist

This is how you really block people

目前为 2019-07-01 提交的版本。查看 最新版本

// ==UserScript==
// @name         Messenger Blacklist
// @namespace    AAAAAAAA.com
// @version      2.4
// @description  This is how you really block people
// @author       ducktrshessami
// @match        *://www.messenger.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
        foo().forEach((name) => { // Member list
            bar("[title^='Seen by " + name + " ']"); // Read receipt
            bar("[aria-label='Messages'] > div > div:has([alt='" + name + "'])", name); // Messages
            bar("[aria-label='Dialog content'] li:has(a[href]:contains('" + name + "'))"); // Nickname change
        });
        foobar(); // Latest message
    }

    async function update(name, nickname) { // Update a blacklisted user's nickname
        const id = $("[aria-relevant='additions text']:not([aria-live='polite']) > div[id]:first", "[aria-label='Conversation List']:first").prop("id"); // Assume nickname is for selected conversation
        if (id) {
            if (!blacklistNicknames[id]) {
                blacklistNicknames[id] = new Object;
            }
            blacklistNicknames[id][name] = nickname;
            window.localStorage.setItem("MessengerBlacklistNicknames", JSON.stringify(blacklistNicknames));
            foobar();
        }
    }

    function foo() { // Check if there are blacklisted users in the current conversation
        return blacklist.filter((name) => {
            if (name) {
                var member = $("li:has(:contains('" + name + "'))", "[data-testid='info_panel']:first");
                member.hide(); // Just spam hide regardless of visibility
                return member.length;
            }
        });
    }

    async function bar(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
                const nickname = targets.first().find("h5[aria-label] > span:first");
                if (nickname.length) {
                    update(name, nickname.prop("innerHTML"));
                }
            }
        }
    }

    async function foobar() { // Check the latest message of every conversation for blacklisted nicknames
        var convo, latest, found;
        for (var id in blacklistNicknames) {
            found = false;
            convo = document.getElementById(id);
            latest = $("div:last-child > span > span:not(:only-child):first", convo);
            for (var name in blacklistNicknames[id]) {
                if (latest.prop("innerHTML") == blacklistNicknames[id][name]) { // Target acquired
                    found = true;
                    latest.parent().parent().hide(); // Also spam hide regardless of visibility
                }
            }
            if (!found) { // Conversation is clear
                $("div > div > div:last-child:hidden", convo).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
        window.localStorage.setItem("MessengerBlacklistNicknames", JSON.stringify(blacklistNicknames));
    });
})();