diff --git a/src/main/cli.ts b/src/main/cli.ts index 3b227af..bda1bb6 100644 --- a/src/main/cli.ts +++ b/src/main/cli.ts @@ -6,7 +6,6 @@ import { app } from "electron"; import { basename } from "path"; -import { ShortcutAction } from "renderer/globalShortcuts/ShortcutSettings"; import { stripIndent } from "shared/utils/text"; import { parseArgs, ParseArgsOptionDescriptor } from "util"; @@ -48,12 +47,7 @@ const options = { type: "string", description: "Run a predefined shortcut action (for custom key binds). Vesktop has to be open for this to have any effect", - options: [ - "toggleMute", - "toggleDeafen", - "toggleStreamerMode", - "disconnectFromVoiceChannel" - ] satisfies Array + argumentName: "action" } } satisfies Record; diff --git a/src/renderer/globalShortcuts/ShortcutSettings.tsx b/src/renderer/globalShortcuts/ShortcutSettings.tsx index e35c8f3..29bb127 100644 --- a/src/renderer/globalShortcuts/ShortcutSettings.tsx +++ b/src/renderer/globalShortcuts/ShortcutSettings.tsx @@ -30,9 +30,17 @@ const cl = classNameFactory("vcd-shortcuts-"); const ShortcutActions = { unassigned: "Unassigned", + mute: "Mute", + unmute: "Unmute", toggleMute: "Toggle Mute", toggleDeafen: "Toggle Deafen", toggleStreamerMode: "Toggle Streamer Mode", + pushToTalkNormalToggle: "Push-to-Talk (Normal) Toggle", + pushToTalkNormalStart: "Push-to-Talk (Normal) Start", + pushToTalkNormalStop: "Push-to-Talk (Normal) Stop", + pushToTalkPriorityToggle: "Push-to-Talk (Priority) Toggle", + pushToTalkPriorityStart: "Push-to-Talk (Priority) Start", + pushToTalkPriorityStop: "Push-to-Talk (Priority) Stop", disconnectFromVoiceChannel: "Disconnect from VC" } as const; @@ -173,7 +181,7 @@ export function KeyBindSettings() { export function openKeybindsModal() { openModal(props => ( - + Keybinds diff --git a/src/renderer/globalShortcuts/keybindHandler.ts b/src/renderer/globalShortcuts/keybindHandler.ts index a7ad191..49fc7f8 100644 --- a/src/renderer/globalShortcuts/keybindHandler.ts +++ b/src/renderer/globalShortcuts/keybindHandler.ts @@ -5,51 +5,84 @@ */ import { Logger } from "@vencord/types/utils"; -import { findByPropsLazy } from "@vencord/types/webpack"; -import { FluxDispatcher, StreamerModeStore } from "@vencord/types/webpack/common"; +import { waitFor } from "@vencord/types/webpack"; +import { FluxDispatcher } from "@vencord/types/webpack/common"; import { ShortcutAction } from "./ShortcutSettings"; const logger = new Logger("VesktopKeyBindHandler"); -const { selectVoiceChannel } = findByPropsLazy("selectVoiceChannel"); +interface KeyBindAction { + onTrigger(...args: any[]): void; + isPressed?: boolean; +} + +let KeyBindActions: Record; + +waitFor(["dispatch", "subscribe"], FluxDispatcher => { + FluxDispatcher.subscribe("KEYBINDS_REGISTER_GLOBAL_KEYBIND_ACTIONS", event => { + KeyBindActions = event.keybinds; + }); +}); export function handleKeyBind(keyBind: ShortcutAction) { logger.debug(`Handling key bind action: ${keyBind}`); + if (!KeyBindActions) { + logger.error("Failed to retrieve KeyBindActions, cannot handle key bind"); + return; + } + switch (keyBind) { - case "toggleMute": - FluxDispatcher.dispatch({ - type: "AUDIO_TOGGLE_SELF_MUTE", - context: "default", - syncRemote: true, - playSoundEffect: true - }); - break; - - case "toggleDeafen": - FluxDispatcher.dispatch({ - type: "AUDIO_TOGGLE_SELF_DEAF", - context: "default", - syncRemote: true - }); - break; - - case "toggleStreamerMode": - FluxDispatcher.dispatch({ - type: "STREAMER_MODE_UPDATE", - key: "enabled", - value: !StreamerModeStore.enabled - }); - break; - - case "disconnectFromVoiceChannel": - selectVoiceChannel(null); - break; - case "unassigned": break; + case "mute": + case "unmute": + FluxDispatcher.dispatch({ + type: "AUDIO_SET_SELF_MUTE", + context: "default", + syncRemote: true, + playSoundEffect: true, + mute: keyBind === "mute" + }); + break; + case "toggleMute": + KeyBindActions.TOGGLE_MUTE.onTrigger(); + break; + + case "toggleDeafen": + KeyBindActions.TOGGLE_DEAFEN.onTrigger(); + break; + + case "toggleStreamerMode": + KeyBindActions.TOGGLE_STREAMER_MODE.onTrigger(); + break; + + case "disconnectFromVoiceChannel": + KeyBindActions.DISCONNECT_FROM_VOICE_CHANNEL.onTrigger(); + break; + + case "pushToTalkNormalStart": + case "pushToTalkNormalStop": + case "pushToTalkNormalToggle": { + const isPressed = keyBind.includes("Toggle") + ? !KeyBindActions.PUSH_TO_TALK.isPressed + : keyBind.includes("Start"); + + KeyBindActions.PUSH_TO_TALK.onTrigger(isPressed, "default"); + break; + } + case "pushToTalkPriorityStart": + case "pushToTalkPriorityStop": + case "pushToTalkPriorityToggle": { + const isPressed = keyBind.includes("Toggle") + ? !KeyBindActions.PUSH_TO_TALK_PRIORITY.isPressed + : keyBind.includes("Start"); + + KeyBindActions.PUSH_TO_TALK_PRIORITY.onTrigger(isPressed, "default"); + break; + } default: logger.warn(`Unknown key bind action: ${keyBind}`); }