From b123e57c17a2e1b31776d2f5c9a52aca347e6dd0 Mon Sep 17 00:00:00 2001 From: Strencher <46447572+Strencher@users.noreply.github.com> Date: Fri, 9 Jul 2021 00:20:28 +0200 Subject: [PATCH] Add FileBrowser API to BdApi (#842) --- common/constants/ipcevents.js | 3 +- injector/src/modules/ipc.js | 48 +++++++++++++++++++++++++++++-- renderer/src/modules/ipc.js | 4 +++ renderer/src/modules/pluginapi.js | 9 ++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/common/constants/ipcevents.js b/common/constants/ipcevents.js index 730f98cd..8a810764 100644 --- a/common/constants/ipcevents.js +++ b/common/constants/ipcevents.js @@ -12,4 +12,5 @@ export const OPEN_WINDOW = "bd-open-window"; export const INSPECT_ELEMENT = "bd-inspect-element"; export const MINIMUM_SIZE = "bd-minimum-size"; export const DEVTOOLS_WARNING = "bd-remove-devtools-message"; -export const REGISTER_PRELOAD = "bd-register-preload"; \ No newline at end of file +export const OPEN_DIALOG = "bd-open-dialog"; +export const REGISTER_PRELOAD = "bd-register-preload"; diff --git a/injector/src/modules/ipc.js b/injector/src/modules/ipc.js index 80074508..b17fd11a 100644 --- a/injector/src/modules/ipc.js +++ b/injector/src/modules/ipc.js @@ -1,4 +1,4 @@ -import {ipcMain as ipc, BrowserWindow, app} from "electron"; +import {ipcMain as ipc, BrowserWindow, app, dialog} from "electron"; import * as IPCEvents from "common/constants/ipcevents"; @@ -50,8 +50,8 @@ const runScript = async (event, script) => { const openDevTools = event => event.sender.openDevTools(); const closeDevTools = event => event.sender.closeDevTools(); -const createBrowserWindow = async (event, url, {windowOptions, closeOnUrl} = {}) => { - return await new Promise(resolve => { +const createBrowserWindow = (event, url, {windowOptions, closeOnUrl} = {}) => { + return new Promise(resolve => { const windowInstance = new BrowserWindow(windowOptions); windowInstance.webContents.on("did-navigate", (_, navUrl) => { if (navUrl != closeOnUrl) return; @@ -77,6 +77,47 @@ const setMinimumSize = (event, width, height) => { const stopDevtoolsWarning = event => event.sender.removeAllListeners("devtools-opened"); +const openDialog = (event, options = {}) => { + const { + mode = "open", + openDirectory = false, + openFile = true, + multiSelections = false, + filters, + promptToCreate = false, + defaultPath, + title, + showOverwriteConfirmation, + message, + showHiddenFiles, + modal = false + } = options; + const openFunction = { + open: dialog.showOpenDialog, + save: dialog.showSaveDialog + }[mode]; + if (!openFunction) return Promise.resolve({error: "Unkown Mode: " + mode}); + + return openFunction.apply(dialog, [ + modal && BrowserWindow.fromWebContents(event.sender), + { + defaultPath, + filters, + title, + message, + createDirectory: true, + properties: [ + showHiddenFiles && "showHiddenFiles", + openDirectory && "openDirectory", + promptToCreate && "promptToCreate", + openDirectory && "openDirectory", + openFile && "openFile", + multiSelections && "multiSelections", + showOverwriteConfirmation && "showOverwriteConfirmation" + ].filter(e => e), + } + ].filter(e => e)); +}; const registerPreload = (event, path) => { app.commandLine.appendSwitch("preload", path); }; @@ -92,6 +133,7 @@ export default class IPCMain { ipc.on(IPCEvents.DEVTOOLS_WARNING, stopDevtoolsWarning); ipc.on(IPCEvents.REGISTER_PRELOAD, registerPreload); ipc.handle(IPCEvents.RUN_SCRIPT, runScript); + ipc.handle(IPCEvents.OPEN_DIALOG, openDialog); ipc.handle(IPCEvents.OPEN_WINDOW, createBrowserWindow); } } \ No newline at end of file diff --git a/renderer/src/modules/ipc.js b/renderer/src/modules/ipc.js index 33323a47..01f0d79c 100644 --- a/renderer/src/modules/ipc.js +++ b/renderer/src/modules/ipc.js @@ -43,4 +43,8 @@ export default new class IPCRenderer { stopDevtoolsWarning() { return ipc.send(IPCEvents.DEVTOOLS_WARNING); } + + openDialog(options) { + return ipc.invoke(IPCEvents.OPEN_DIALOG, options); + } }; \ No newline at end of file diff --git a/renderer/src/modules/pluginapi.js b/renderer/src/modules/pluginapi.js index 4056da43..4356a2f3 100644 --- a/renderer/src/modules/pluginapi.js +++ b/renderer/src/modules/pluginapi.js @@ -12,6 +12,7 @@ import Settings from "./settingsmanager"; import Logger from "common/logger"; import Patcher from "./patcher"; import Emotes from "../builtins/emotes/emotes"; +import ipc from "./ipc"; const BdApi = { get React() {return DiscordModules.React;}, @@ -265,6 +266,14 @@ BdApi.setBDData = function(key, data) { return DataStore.setBDData(key, data); }; +// Opens a filesystem dialog +BdApi.openDialog = async function (options) { + const data = await ipc.openDialog(options); + if (data.error) throw new Error(data.error); + + return data; +}; + const makeAddonAPI = (manager) => new class AddonAPI { get folder() {return manager.addonFolder;} isEnabled(idOrFile) {return manager.isEnabled(idOrFile);}