aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/voiceMessages/DesktopRecorder.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/voiceMessages/DesktopRecorder.tsx')
-rw-r--r--src/plugins/voiceMessages/DesktopRecorder.tsx68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/plugins/voiceMessages/DesktopRecorder.tsx b/src/plugins/voiceMessages/DesktopRecorder.tsx
new file mode 100644
index 0000000..176faf3
--- /dev/null
+++ b/src/plugins/voiceMessages/DesktopRecorder.tsx
@@ -0,0 +1,68 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2023 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 <https://www.gnu.org/licenses/>.
+*/
+
+import { Button, showToast, Toasts, useState } from "@webpack/common";
+
+import type { VoiceRecorder } from ".";
+import { settings } from "./settings";
+
+export const VoiceRecorderDesktop: VoiceRecorder = ({ setAudioBlob, onRecordingChange }) => {
+ const [recording, setRecording] = useState(false);
+
+ const changeRecording = (recording: boolean) => {
+ setRecording(recording);
+ onRecordingChange?.(recording);
+ };
+
+ function toggleRecording() {
+ const discordVoice = DiscordNative.nativeModules.requireModule("discord_voice");
+ const nowRecording = !recording;
+
+ if (nowRecording) {
+ discordVoice.startLocalAudioRecording(
+ {
+ echoCancellation: settings.store.echoCancellation,
+ noiseCancellation: settings.store.noiseSuppression,
+ },
+ (success: boolean) => {
+ if (success)
+ changeRecording(true);
+ else
+ showToast("Failed to start recording", Toasts.Type.FAILURE);
+ }
+ );
+ } else {
+ discordVoice.stopLocalAudioRecording(async (filePath: string) => {
+ if (filePath) {
+ const buf = await VencordNative.pluginHelpers.VoiceMessages.readRecording();
+ if (buf)
+ setAudioBlob(new Blob([buf], { type: "audio/ogg; codecs=opus" }));
+ else
+ showToast("Failed to finish recording", Toasts.Type.FAILURE);
+ }
+ changeRecording(false);
+ });
+ }
+ }
+
+ return (
+ <Button onClick={toggleRecording}>
+ {recording ? "Stop" : "Start"} recording
+ </Button>
+ );
+};