/*
* 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",
predicate: () => settings.store.showIcon,
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 }),
});