Plugin
SilentMessageToggle
Adds a button to the chat bar to toggle sending a silent message.
1
import { ChatBarButton, ChatBarButtonFactory } from "@api/ChatButtons";2
import { addMessagePreSendListener, MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";3
import { definePluginSettings } from "@api/Settings";4
import { Devs } from "@utils/constants";5
import definePlugin, { IconComponent, OptionType } from "@utils/types";6
import { React, useEffect, useState } from "@webpack/common";7
8
let lastState = false;9
10
const 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: true23
}24
});25
26
function 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
38
const SilentMessageIcon: IconComponent = ({ height = 20, width = 20, className, children }) => {39
return (40
<svg41
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
53
const 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
<ChatBarButton77
tooltip={enabled ? "Disable Silent Message" : "Enable Silent Message"}78
onClick={() => setEnabledValue(!enabled)}79
>80
{enabled ? <SilentMessageIcon /> : <SilentMessageDisabledIcon />}81
</ChatBarButton>82
);83
};84
85
export 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: SilentMessageToggle95
}96
});97