/* * Vencord, a modification for Discord's desktop app * Copyright (c) 2022 Vendicated and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { ApplicationCommandInputType, ApplicationCommandOptionType, findOption, sendBotMessage } from "@api/Commands"; import { definePluginSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import { Button, ButtonLooks, ButtonWrapperClasses, FluxDispatcher, React, Tooltip } from "@webpack/common"; const settings = definePluginSettings({ showIcon: { type: OptionType.BOOLEAN, default: false, description: "Show an icon for toggling the plugin", restartNeeded: true, }, isEnabled: { type: OptionType.BOOLEAN, description: "Toggle functionality", default: true, } }); function SilentTypingToggle(chatBoxProps: { type: { analyticsName: string; }; }) { const { isEnabled } = settings.use(["isEnabled"]); const toggle = () => settings.store.isEnabled = !settings.store.isEnabled; if (chatBoxProps.type.analyticsName !== "normal") return null; return ( {(tooltipProps: any) => (
)}
); } export default definePlugin({ name: "SilentTyping", authors: [Devs.Ven, Devs.Rini], description: "Hide that you are typing", patches: [ { find: '.dispatch({type:"TYPING_START_LOCAL"', replacement: { match: /startTyping\(\i\){.+?},stop/, replace: "startTyping:$self.startTyping,stop" } }, { find: "ChannelTextAreaButtons", replacement: { match: /(\i)\.push.{1,30}disabled:(\i),.{1,20}\},"gift"\)\)/, replace: "$&,(()=>{try{$2||$1.push($self.chatBarIcon(arguments[0]))}catch{}})()", } }, ], dependencies: ["CommandsAPI"], settings, commands: [{ name: "silenttype", description: "Toggle whether you're hiding that you're typing or not.", inputType: ApplicationCommandInputType.BUILT_IN, options: [ { name: "value", description: "whether to hide or not that you're typing (default is toggle)", required: false, type: ApplicationCommandOptionType.BOOLEAN, }, ], execute: async (args, ctx) => { settings.store.isEnabled = !!findOption(args, "value", !settings.store.isEnabled); sendBotMessage(ctx.channel.id, { content: settings.store.isEnabled ? "Silent typing enabled!" : "Silent typing disabled!", }); }, }], async startTyping(channelId: string) { if (settings.store.isEnabled) return; FluxDispatcher.dispatch({ type: "TYPING_START_LOCAL", channelId }); }, chatBarIcon: ErrorBoundary.wrap(SilentTypingToggle, { noop: true }), });