Plugin

NoBlockedMessages

Hides all blocked/ignored messages from chat completely

Accessibility Chat
index.ts
Download

Source

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