Plugin

SilentMessageToggle

Adds a button to the chat bar to toggle sending a silent message.

Chat Utility
index.tsx
Download

Source

src/plugins/silentMessageToggle/index.tsx
1/*
2 * FiveCord — a Discord client mod
3 * Copyright (c) 2025 FiveCord
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
7import { ChatBarButton, ChatBarButtonFactory } from "@api/ChatButtons";
8import { addMessagePreSendListener, MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";
9import { definePluginSettings } from "@api/Settings";
10import { Devs } from "@utils/constants";
11import definePlugin, { IconComponent, OptionType } from "@utils/types";
12import { React, useEffect, useState } from "@webpack/common";
13
14let lastState = false;
15
16const 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: true
29 }
30});
31
32function 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
44const SilentMessageIcon: IconComponent = ({ height = 20, width = 20, className, children }) => {
45 return (
46 <svg
47 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
59const 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 <ChatBarButton
83 tooltip={enabled ? "Disable Silent Message" : "Enable Silent Message"}
84 onClick={() => setEnabledValue(!enabled)}
85 >
86 {enabled ? <SilentMessageIcon /> : <SilentMessageDisabledIcon />}
87 </ChatBarButton>
88 );
89};
90
91export 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: SilentMessageToggle
101 }
102});
103