Plugin

NoBlockedMessages

Hides all blocked/ignored messages from chat completely

Accessibility Chat
index.ts
Download

Source

src/plugins/noBlockedMessages/index.ts
1/*
2 * FiveCord — a Discord client mod
3 * Copyright (c) 2025 FiveCord
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
7import { definePluginSettings, migratePluginSetting } from "@api/Settings";
8import { Devs } from "@utils/constants";
9import { runtimeHashMessageKey } from "@utils/intlHash";
10import { Logger } from "@utils/Logger";
11import definePlugin, { OptionType } from "@utils/types";
12import { Message } from "@vencord/discord-types";
13import { i18n, RelationshipStore } from "@webpack/common";
14
15interface MessageDeleteProps {
16 // Internal intl message for BLOCKED_MESSAGE_COUNT
17 collapsedReason: () => any;
18}
19
20// Remove this migration once enough time has passed
21migratePluginSetting("NoBlockedMessages", "ignoreBlockedMessages", "ignoreMessages");
22const settings = definePluginSettings({
23 ignoreMessages: {
24 description: "Completely ignores incoming messages from blocked and ignored (if enabled) users",
25 type: OptionType.BOOLEAN,
26 default: false,
27 restartNeeded: true
28 },
29 applyToIgnoredUsers: {
30 description: "Additionally apply to 'ignored' users",
31 type: OptionType.BOOLEAN,
32 default: true,
33 restartNeeded: false
34 }
35});
36
37export default definePlugin({
38 name: "NoBlockedMessages",
39 description: "Hides all blocked/ignored messages from chat completely",
40 authors: [Devs.rushii, Devs.Samu, Devs.jamesbt365],
41 tags: ["Accessibility", "Chat"],
42 settings,
43
44 patches: [
45 {
46 find: ".__invalid_blocked,",
47 replacement: [
48 {
49 match: /let{messages:\i,[^}]*?collapsedReason[^}]*}/,
50 replace: "if($self.shouldHide(arguments[0]))return null;$&"
51 }
52 ]
53 },
54 {
55 find: '"MessageStore"',
56 predicate: () => settings.store.ignoreMessages,
57 replacement: [
58 {
59 match: /(?<=MESSAGE_CREATE:function\((\i)\){)/,
60 replace: (_, props) => `if($self.shouldIgnoreMessage(${props}.message))return;`
61 }
62 ]
63 },
64 {
65 find: &#039;"ReadStateStore"&#039;,
66 predicate: () => settings.store.ignoreMessages,
67 replacement: [
68 {
69 match: /(?<=MESSAGE_CREATE:function\((\i)\){)/,
70 replace: (_, props) => `if($self.shouldIgnoreMessage(${props}.message))return;`
71 }
72 ]
73 }
74 ],
75
76 shouldIgnoreMessage(message: Message) {
77 try {
78 if (RelationshipStore.isBlocked(message.author.id)) {
79 return true;
80 }
81 return settings.store.applyToIgnoredUsers && RelationshipStore.isIgnored(message.author.id);
82 } catch (e) {
83 new Logger("NoBlockedMessages").error("Failed to check if user is blocked or ignored:", e);
84 return false;
85 }
86 },
87
88 shouldHide(props: MessageDeleteProps): boolean {
89 try {
90 const collapsedReason = props.collapsedReason();
91 const is = (key: string) => collapsedReason === i18n.t[runtimeHashMessageKey(key)]();
92
93 return is("BLOCKED_MESSAGE_COUNT") || (settings.store.applyToIgnoredUsers && is("IGNORED_MESSAGE_COUNT"));
94 } catch (e) {
95 new Logger("NoBlockedMessages").error("Failed to check if message should be hidden:", e);
96 return false;
97 }
98 }
99});
100