From c445c6194f6a0bd077bafc9e65f0aa79e2aa0945 Mon Sep 17 00:00:00 2001 From: Tornike Khintibidze <48173186+X1nto@users.noreply.github.com> Date: Thu, 12 Oct 2023 06:24:16 +0400 Subject: [PATCH 1/2] MacOs: properly request microphone and camera permission (#121) Co-authored-by: V --- .gitignore | 2 +- package.json | 8 +++++++- src/main/index.ts | 3 +++ src/main/mediaPermissions.ts | 24 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/main/mediaPermissions.ts diff --git a/.gitignore b/.gitignore index 683ca39..94c1776 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ dist node_modules .env .DS_Store -.idea/ \ No newline at end of file +.idea/ diff --git a/package.json b/package.json index 09b6f85..61b24da 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,13 @@ ] } ], - "category": "Network" + "category": "Network", + "extendInfo": { + "NSMicrophoneUsageDescription": "This app needs access to the microphone", + "NSCameraUsageDescription": "This app needs access to the camera", + "com.apple.security.device.audio-input": true, + "com.apple.security.device.camera": true + } }, "nsis": { "include": "build/installer.nsh", diff --git a/src/main/index.ts b/src/main/index.ts index 10552f2..c37d433 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -12,6 +12,7 @@ import { checkUpdates } from "updater/main"; import { DATA_DIR } from "./constants"; import { createFirstLaunchTour } from "./firstLaunch"; import { createWindows, mainWin } from "./mainWindow"; +import { registerMediaPermissionsHandler } from "./mediaPermissions"; import { registerScreenShareHandler } from "./screenShare"; import { Settings } from "./settings"; @@ -49,6 +50,8 @@ function init() { if (process.platform === "win32") app.setAppUserModelId("dev.vencord.desktop"); registerScreenShareHandler(); + registerMediaPermissionsHandler(); + bootstrap(); app.on("activate", () => { diff --git a/src/main/mediaPermissions.ts b/src/main/mediaPermissions.ts new file mode 100644 index 0000000..1f6cf46 --- /dev/null +++ b/src/main/mediaPermissions.ts @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + */ + +import { session, systemPreferences } from "electron"; + +export function registerMediaPermissionsHandler() { + if (process.platform !== "darwin") return; + + session.defaultSession.setPermissionRequestHandler(async (_webContents, permission, callback, details) => { + let granted = true; + + if (details.mediaTypes?.includes("audio")) { + granted = await systemPreferences.askForMediaAccess("microphone"); + } + if (details.mediaTypes?.includes("video")) { + granted &&= await systemPreferences.askForMediaAccess("camera"); + } + + callback(granted); + }); +} From 0d93e08e99046549c4583f04c865ffd70107c712 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Fri, 13 Oct 2023 04:00:28 +0200 Subject: [PATCH 2/2] arrpc: migrate from websocket + plugin to electron ipc --- src/main/arrpc.ts | 6 ++---- src/preload/VesktopNative.ts | 5 +++++ src/renderer/index.ts | 14 ++++++-------- src/shared/IpcEvents.ts | 4 +++- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/arrpc.ts b/src/main/arrpc.ts index e0fd023..1899d9c 100644 --- a/src/main/arrpc.ts +++ b/src/main/arrpc.ts @@ -5,6 +5,7 @@ */ import Server from "arrpc"; +import { IpcEvents } from "shared/IpcEvents"; import { mainWin } from "./mainWindow"; import { Settings } from "./settings"; @@ -17,11 +18,8 @@ export async function initArRPC() { if (server || !Settings.store.arRPC) return; try { - // This module starts a server as a side effect, so it needs to be lazy imported - const { send: sendToBridge } = await import("arrpc/src/bridge"); - server = await new Server(); - server.on("activity", sendToBridge); + server.on("activity", (data: any) => mainWin.webContents.send(IpcEvents.ARRPC_ACTIVITY, JSON.stringify(data))); server.on("invite", (invite: string, callback: (valid: boolean) => void) => { invite = String(invite); if (!inviteCodeRegex.test(invite)) return callback(false); diff --git a/src/preload/VesktopNative.ts b/src/preload/VesktopNative.ts index 1706bed..f99656a 100644 --- a/src/preload/VesktopNative.ts +++ b/src/preload/VesktopNative.ts @@ -58,5 +58,10 @@ export const VesktopNative = { }, capturer: { getLargeThumbnail: (id: string) => invoke(IpcEvents.CAPTURER_GET_LARGE_THUMBNAIL, id) + }, + arrpc: { + onActivity(cb: (data: string) => void) { + ipcRenderer.on(IpcEvents.ARRPC_ACTIVITY, (_, data: string) => cb(data)); + } } }; diff --git a/src/renderer/index.ts b/src/renderer/index.ts index e7871d3..9f75644 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -47,14 +47,12 @@ customSettingsSections.push(() => ({ className: "vc-vesktop-settings" })); -const arRPC = Vencord.Plugins.plugins["WebRichPresence (arRPC)"]; +const arRPC = Vencord.Plugins.plugins["WebRichPresence (arRPC)"] as any as { + handleEvent(e: MessageEvent): void; +}; -arRPC.required = !!Settings.store.arRPC; +VesktopNative.arrpc.onActivity(data => { + if (!Settings.store.arRPC) return; -Settings.addChangeListener("arRPC", v => { - arRPC.required = !!v; - if (v && !arRPC.started) Vencord.Plugins.startPlugin(arRPC); - else if (arRPC.started) { - Vencord.Plugins.stopPlugin(arRPC); - } + arRPC.handleEvent(new MessageEvent("message", { data })); }); diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index 2d453e3..1f46a5a 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -40,5 +40,7 @@ export const enum IpcEvents { AUTOSTART_ENABLED = "VCD_AUTOSTART_ENABLED", ENABLE_AUTOSTART = "VCD_ENABLE_AUTOSTART", - DISABLE_AUTOSTART = "VCD_DISABLE_AUTOSTART" + DISABLE_AUTOSTART = "VCD_DISABLE_AUTOSTART", + + ARRPC_ACTIVITY = "VCD_ARRPC_ACTIVITY" }