Plugin
NoBlockedMessages
Hides all blocked/ignored messages from chat completely
1
/*2
* FiveCord — a Discord client mod3
* Copyright (c) 2025 FiveCord4
* SPDX-License-Identifier: GPL-3.0-or-later5
*/6
7
import { definePluginSettings, migratePluginSetting } from "@api/Settings";8
import { Devs } from "@utils/constants";9
import { runtimeHashMessageKey } from "@utils/intlHash";10
import { Logger } from "@utils/Logger";11
import definePlugin, { OptionType } from "@utils/types";12
import { Message } from "@vencord/discord-types";13
import { i18n, RelationshipStore } from "@webpack/common";14
15
interface MessageDeleteProps {16
// Internal intl message for BLOCKED_MESSAGE_COUNT17
collapsedReason: () => any;18
}19
20
// Remove this migration once enough time has passed21
migratePluginSetting("NoBlockedMessages", "ignoreBlockedMessages", "ignoreMessages");22
const 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: true28
},29
applyToIgnoredUsers: {30
description: "Additionally apply to 039;ignored039; users",31
type: OptionType.BOOLEAN,32
default: true,33
restartNeeded: false34
}35
});36
37
export 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: 039;"MessageStore"039;,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