Plugin
SilentMessageToggle
Adds a button to the chat bar to toggle sending a silent message.
1
/*2
* FiveCord — a Discord client mod3
* Copyright (c) 2025 FiveCord4
* SPDX-License-Identifier: GPL-3.0-or-later5
*/6
7
import { ChatBarButton, ChatBarButtonFactory } from "@api/ChatButtons";8
import { addMessagePreSendListener, MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";9
import { definePluginSettings } from "@api/Settings";10
import { Devs } from "@utils/constants";11
import definePlugin, { IconComponent, OptionType } from "@utils/types";12
import { React, useEffect, useState } from "@webpack/common";13
14
let lastState = false;15
16
const settings = definePluginSettings({17
persistState: {18
type: OptionType.BOOLEAN,19
description: "Whether to persist the state of the silent message toggle when changing channels",20
default: false,21
onChange(newValue: boolean) {22
if (newValue === false) lastState = false;23
}24
},25
autoDisable: {26
type: OptionType.BOOLEAN,27
description: "Automatically disable the silent message toggle again after sending one",28
default: true29
}30
});31
32
function SilentMessageDisabledIcon() {33
return (34
<SilentMessageIcon>35
<mask id="vc-silent-msg-mask">36
<path fill="#fff" d="M0 0h24v24H0Z" />37
<path stroke="#000" strokeWidth="5.99068" d="M0 24 24 0" />38
</mask>39
<path fill="var(--status-danger)" d="m21.178 1.70703 1.414 1.414L4.12103 21.593l-1.414-1.415L21.178 1.70703Z" />40
</SilentMessageIcon>41
);42
}43
44
const SilentMessageIcon: IconComponent = ({ height = 20, width = 20, className, children }) => {45
return (46
<svg47
width={width}48
height={height}49
viewBox="0 0 24 24"50
className={className}51
style={{ scale: "1.2" }}52
>53
<path fill="currentColor" mask="url(#vc-silent-msg-mask)" d="M18 10.7101C15.1085 9.84957 13 7.17102 13 4c0-.30736.0198-.6101.0582-.907C12.7147 3.03189 12.3611 3 12 3 8.686 3 6 5.686 6 9v5c0 1.657-1.344 3-3 3v1h18v-1c-1.656 0-3-1.343-3-3v-3.2899ZM8.55493 19c.693 1.19 1.96897 2 3.44497 2s2.752-.81 3.445-2H8.55493ZM18.2624 5.50209 21 2.5V1h-4.9651v1.49791h2.4411L16 5.61088V7h5V5.50209h-2.7376Z" />54
{children}55
</svg>56
);57
};58
59
const SilentMessageToggle: ChatBarButtonFactory = ({ isMainChat }) => {60
const [enabled, setEnabled] = useState(lastState);61
62
function setEnabledValue(value: boolean) {63
if (settings.store.persistState) lastState = value;64
setEnabled(value);65
}66
67
useEffect(() => {68
const listener: MessageSendListener = (_, message) => {69
if (enabled) {70
if (settings.store.autoDisable) setEnabledValue(false);71
if (!message.content.startsWith("@silent ")) message.content = "@silent " + message.content;72
}73
};74
75
addMessagePreSendListener(listener);76
return () => void removeMessagePreSendListener(listener);77
}, [enabled]);78
79
if (!isMainChat) return null;80
81
return (82
<ChatBarButton83
tooltip={enabled ? "Disable Silent Message" : "Enable Silent Message"}84
onClick={() => setEnabledValue(!enabled)}85
>86
{enabled ? <SilentMessageIcon /> : <SilentMessageDisabledIcon />}87
</ChatBarButton>88
);89
};90
91
export default definePlugin({92
name: "SilentMessageToggle",93
authors: [Devs.Nuckyz, Devs.CatNoir],94
description: "Adds a button to the chat bar to toggle sending a silent message.",95
tags: ["Chat", "Utility"],96
settings,97
98
chatBarButton: {99
icon: SilentMessageIcon,100
render: SilentMessageToggle101
}102
});103