From cff7492f37cf6fb308ab37b3b64fa8377c398de6 Mon Sep 17 00:00:00 2001 From: fox3000foxy Date: Sat, 22 Feb 2025 16:48:43 +0100 Subject: [PATCH] CustomVoiceFilter: Add open model folder functionality --- .../customVoiceFilter/VoiceFiltersModal.tsx | 6 + src/plugins/customVoiceFilter/native.ts | 183 +++++++++--------- 2 files changed, 100 insertions(+), 89 deletions(-) diff --git a/src/plugins/customVoiceFilter/VoiceFiltersModal.tsx b/src/plugins/customVoiceFilter/VoiceFiltersModal.tsx index ef430cddd..bd0696ec1 100644 --- a/src/plugins/customVoiceFilter/VoiceFiltersModal.tsx +++ b/src/plugins/customVoiceFilter/VoiceFiltersModal.tsx @@ -20,6 +20,11 @@ import { openWikiHomeModal } from "./WikiHomeModal"; const Native = VencordNative.pluginHelpers.CustomVoiceFilters as PluginNative; +function openModelFolder() { + const { modulePath } = useVoiceFiltersStore.getState(); + const modelFolder = Native.openFolder(modulePath); +} + export function openVoiceFiltersModal(): string { const key = openModal(modalProps => ( Export + Voice filters list: diff --git a/src/plugins/customVoiceFilter/native.ts b/src/plugins/customVoiceFilter/native.ts index ed0f26e76..d407beee4 100644 --- a/src/plugins/customVoiceFilter/native.ts +++ b/src/plugins/customVoiceFilter/native.ts @@ -1,89 +1,94 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2025 Vendicated and contributors - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { IpcMainInvokeEvent } from "electron"; - -interface IVoiceFilter { - name: string; - author: string; - onnxFileUrl: string; - iconURL: string; - id: string; - styleKey: string; - available: boolean; - temporarilyAvailable: boolean; - - custom?: boolean; - splashGradient?: string; - baseColor?: string; - previewSoundURLs?: string[]; - downloadUrl?: string; -} - -const fs = require("fs"); - -export async function downloadCustomVoiceFilter(_: IpcMainInvokeEvent, modulePath: string, voiceFilter: IVoiceFilter): Promise<{ success: boolean, voiceFilter: IVoiceFilter, path: string | null, response: Response | null; }> { - if (!fs.existsSync(modulePath + "/discord_voice_filters")) { - fs.mkdirSync(modulePath + "/discord_voice_filters"); - } - if (!voiceFilter.onnxFileUrl || - fs.existsSync(modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx") || - !voiceFilter.onnxFileUrl.endsWith(".onnx") - ) { - return { - success: false, - response: null, - voiceFilter: voiceFilter, - path: null - }; - } - const response = await fetch(voiceFilter.onnxFileUrl); - if (!response.ok) { - return { - success: false, - response: response, - voiceFilter: voiceFilter, - path: null - }; - } - const arrayBuffer = await response.arrayBuffer(); - fs.writeFileSync(modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx", Buffer.from(arrayBuffer)); - return { - success: true, - response: response, - voiceFilter: voiceFilter, - path: modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx" - }; -} - -export async function downloadCustomVoiceFilterFromBuffer(_: IpcMainInvokeEvent, modulePath: string, voiceFilter: IVoiceFilter, buffer: ArrayBuffer) { - if (!fs.existsSync(modulePath + "/discord_voice_filters")) { - fs.mkdirSync(modulePath + "/discord_voice_filters"); - } - fs.writeFileSync(modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx", Buffer.from(buffer)); - return { - success: true, - voiceFilter: voiceFilter, - path: modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx" - }; -} -export async function getModelState(_: IpcMainInvokeEvent, id: string, modulePath: string) { - const modelPath = modulePath + "/discord_voice_filters/"; - return { - status: fs.existsSync(modelPath + id + ".onnx") ? "downloaded" : "not_downloaded", - downloadedBytes: fs.existsSync(modelPath + id + ".onnx") ? fs.statSync(modelPath + id + ".onnx").size : 0 - }; -} - -export async function deleteModel(_: IpcMainInvokeEvent, modulePath: string, id: string) { - const modelPath = modulePath + "/discord_voice_filters/"; - fs.unlinkSync(modelPath + id + ".onnx"); -} - -export async function deleteAllModels(_: IpcMainInvokeEvent, modulePath: string) { - const modelPath = modulePath + "/discord_voice_filters/"; - fs.rmSync(modelPath, { recursive: true, force: true }); -} +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { IpcMainInvokeEvent } from "electron"; + +interface IVoiceFilter { + name: string; + author: string; + onnxFileUrl: string; + iconURL: string; + id: string; + styleKey: string; + available: boolean; + temporarilyAvailable: boolean; + + custom?: boolean; + splashGradient?: string; + baseColor?: string; + previewSoundURLs?: string[]; + downloadUrl?: string; +} + +const fs = require("fs"); + +export async function downloadCustomVoiceFilter(_: IpcMainInvokeEvent, modulePath: string, voiceFilter: IVoiceFilter): Promise<{ success: boolean, voiceFilter: IVoiceFilter, path: string | null, response: Response | null; }> { + if (!fs.existsSync(modulePath + "/discord_voice_filters")) { + fs.mkdirSync(modulePath + "/discord_voice_filters"); + } + if (!voiceFilter.onnxFileUrl || + fs.existsSync(modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx") || + !voiceFilter.onnxFileUrl.endsWith(".onnx") + ) { + return { + success: false, + response: null, + voiceFilter: voiceFilter, + path: null + }; + } + const response = await fetch(voiceFilter.onnxFileUrl); + if (!response.ok) { + return { + success: false, + response: response, + voiceFilter: voiceFilter, + path: null + }; + } + const arrayBuffer = await response.arrayBuffer(); + fs.writeFileSync(modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx", Buffer.from(arrayBuffer)); + return { + success: true, + response: response, + voiceFilter: voiceFilter, + path: modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx" + }; +} + +export async function downloadCustomVoiceFilterFromBuffer(_: IpcMainInvokeEvent, modulePath: string, voiceFilter: IVoiceFilter, buffer: ArrayBuffer) { + if (!fs.existsSync(modulePath + "/discord_voice_filters")) { + fs.mkdirSync(modulePath + "/discord_voice_filters"); + } + fs.writeFileSync(modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx", Buffer.from(buffer)); + return { + success: true, + voiceFilter: voiceFilter, + path: modulePath + "/discord_voice_filters/" + voiceFilter.id + ".onnx" + }; +} +export async function getModelState(_: IpcMainInvokeEvent, id: string, modulePath: string) { + const modelPath = modulePath + "/discord_voice_filters/"; + return { + status: fs.existsSync(modelPath + id + ".onnx") ? "downloaded" : "not_downloaded", + downloadedBytes: fs.existsSync(modelPath + id + ".onnx") ? fs.statSync(modelPath + id + ".onnx").size : 0 + }; +} + +export async function deleteModel(_: IpcMainInvokeEvent, modulePath: string, id: string) { + const modelPath = modulePath + "/discord_voice_filters/"; + fs.unlinkSync(modelPath + id + ".onnx"); +} + +export async function deleteAllModels(_: IpcMainInvokeEvent, modulePath: string) { + const modelPath = modulePath + "/discord_voice_filters/"; + fs.rmSync(modelPath, { recursive: true, force: true }); +} + +export async function openFolder(_: IpcMainInvokeEvent, modulePath: string) { + const process = require("child_process"); + process.exec(`start "" "${modulePath}/discord_voice_filters/"`); +}