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
1import { ChatBarButton, ChatBarButtonFactory } from "@api/ChatButtons";
2import { addMessagePreSendListener, MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";
3import { definePluginSettings } from "@api/Settings";
4import { Devs } from "@utils/constants";
5import definePlugin, { IconComponent, OptionType } from "@utils/types";
6import { React, useEffect, useState } from "@webpack/common";
7
8let lastState = false;
9
10const settings = definePluginSettings({
11 persistState: {
12 type: OptionType.BOOLEAN,
13 description: "Whether to persist the state of the silent message toggle when changing channels",
14 default: false,
15 onChange(newValue: boolean) {
16 if (newValue === false) lastState = false;
17 }
18 },
19 autoDisable: {
20 type: OptionType.BOOLEAN,
21 description: "Automatically disable the silent message toggle again after sending one",
22 default: true
23 }
24});
25
26function SilentMessageDisabledIcon() {
27 return (
28 <SilentMessageIcon>
29 <mask id="vc-silent-msg-mask">
30 <path fill="#fff" d="M0 0h24v24H0Z" />
31 <path stroke="#000" strokeWidth="5.99068" d="M0 24 24 0" />
32 </mask>
33 <path fill="var(--status-danger)" d="m21.178 1.70703 1.414 1.414L4.12103 21.593l-1.414-1.415L21.178 1.70703Z" />
34 </SilentMessageIcon>
35 );
36}
37
38const SilentMessageIcon: IconComponent = ({ height = 20, width = 20, className, children }) => {
39 return (
40 <svg
41 width={width}
42 height={height}
43 viewBox="0 0 24 24"
44 className={className}
45 style={{ scale: "1.2" }}
46 >
47 <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" />
48 {children}
49 </svg>
50 );
51};
52
53const SilentMessageToggle: ChatBarButtonFactory = ({ isMainChat }) => {
54 const [enabled, setEnabled] = useState(lastState);
55
56 function setEnabledValue(value: boolean) {
57 if (settings.store.persistState) lastState = value;
58 setEnabled(value);
59 }
60
61 useEffect(() => {
62 const listener: MessageSendListener = (_, message) => {
63 if (enabled) {
64 if (settings.store.autoDisable) setEnabledValue(false);
65 if (!message.content.startsWith("@silent ")) message.content = "@silent " + message.content;
66 }
67 };
68
69 addMessagePreSendListener(listener);
70 return () => void removeMessagePreSendListener(listener);
71 }, [enabled]);
72
73 if (!isMainChat) return null;
74
75 return (
76 <ChatBarButton
77 tooltip={enabled ? "Disable Silent Message" : "Enable Silent Message"}
78 onClick={() => setEnabledValue(!enabled)}
79 >
80 {enabled ? <SilentMessageIcon /> : <SilentMessageDisabledIcon />}
81 </ChatBarButton>
82 );
83};
84
85export default definePlugin({
86 name: "SilentMessageToggle",
87 authors: [Devs.Nuckyz, Devs.CatNoir],
88 description: "Adds a button to the chat bar to toggle sending a silent message.",
89 tags: ["Chat", "Utility"],
90 settings,
91
92 chatBarButton: {
93 icon: SilentMessageIcon,
94 render: SilentMessageToggle
95 }
96});
97