Greasy Fork

Greasy Fork is available in English.

Messenger Blacklist

This is how you really block people

当前为 2019-07-01 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

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