From 40f6803b907104f28dc0a7ba10ba582db0296d3f Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sat, 20 Jan 2024 16:36:59 +0100 Subject: [PATCH] [bugfix] Launch Oculus when launching Oculus BS version to avoid crashs --- .../bs-launcher/oculus-launcher.service.ts | 14 +++++--- src/main/services/oculus.service.ts | 34 ++++++++++++++++--- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/main/services/bs-launcher/oculus-launcher.service.ts b/src/main/services/bs-launcher/oculus-launcher.service.ts index e07232b9..b71cd2a9 100644 --- a/src/main/services/bs-launcher/oculus-launcher.service.ts +++ b/src/main/services/bs-launcher/oculus-launcher.service.ts @@ -61,13 +61,13 @@ export class OculusLauncherService extends AbstractLauncherService implements St log.info("Symlinks found in Oculus library", symlinks); const bsSymlinks = symlinks.filter(dirent => dirent.startsWith(OCULUS_BS_DIR)); - + const bsmSymlinks = (await Promise.all(bsSymlinks.map(async symlink => { const symlinkPath = path.join(oculusLibPath, symlink); const targetPath = await readlink(symlinkPath).catch(err => log.error(err)); log.info("Oculus Symlink", symlink, "target", targetPath); - + if(!targetPath){ return null; } const bsmVersionsDir = path.join(this.pathsService.INSTALLATION_FOLDER, this.pathsService.VERSIONS_FOLDER); @@ -138,20 +138,24 @@ export class OculusLauncherService extends AbstractLauncherService implements St if(bsRunning){ throw CustomError.fromError(new Error("Cannot start two instance of Beat Saber for Oculus"), BSLaunchError.BS_ALREADY_RUNNING); } - + // Remove previously symlinks created by BSM await this.deleteBsSymlinks().catch(err => log.error("Error while deleting BSM symlinks", err)); const bsPath = await (launchOptions.version.oculus ? prepareOriginalVersion() : prepareDowngradedVersion()); - // Launch Beat Saber const exePath = path.join(bsPath, BS_EXECUTABLE); if(!(await pathExists(exePath))){ throw CustomError.fromError(new Error(`BS Path not exist ${bsPath}`), BSLaunchError.BS_NOT_FOUND); } + // Make sure Oculus is running + await this.oculus.startOculus().catch(err => log.error("Error while starting Oculus", err)); + obs.next({type: BSLaunchEvent.BS_LAUNCHING}); + + // Launch Beat Saber return this.launchBs(exePath, this.buildBsLaunchArgs(launchOptions)).catch(err => { throw CustomError.fromError(err, BSLaunchError.BS_EXIT_ERROR); }); @@ -170,4 +174,4 @@ export class OculusLauncherService extends AbstractLauncherService implements St }); } -} \ No newline at end of file +} diff --git a/src/main/services/oculus.service.ts b/src/main/services/oculus.service.ts index c0b0622b..42a5cfc2 100644 --- a/src/main/services/oculus.service.ts +++ b/src/main/services/oculus.service.ts @@ -4,6 +4,9 @@ import { pathExist, resolveGUIDPath } from "../helpers/fs.helpers"; import log from "electron-log"; import { lstat } from "fs-extra"; import { tryit } from "../../shared/helpers/error.helpers"; +import { shell } from "electron"; +import { taskRunning } from "../helpers/os.helpers"; +import { sToMs } from "../../shared/helpers/time.helpers"; export class OculusService { private static instance: OculusService; @@ -42,11 +45,11 @@ export class OculusService { const libsPath: OculusLibrary[] = ( await Promise.all(libsRegData.keys.map(async key => { const originalPath = await list([`${oculusLibsRegKey}\\${key}`]).then(res => res[`${oculusLibsRegKey}\\${key}`]); - + if (originalPath.values?.OriginalPath) { return { id: key, path: originalPath.values.OriginalPath.value, isDefault: defaultLibraryId === key } as OculusLibrary; - } - + } + if(originalPath.values?.Path) { const { result } = tryit(() => resolveGUIDPath(originalPath.values.Path.value as string)); return result ? { id: key, path: result, isDefault: defaultLibraryId === key } as OculusLibrary : null; @@ -82,7 +85,7 @@ export class OculusService { /** * Return the first game folder found in the list - * @param {string[]} gameFolders + * @param {string[]} gameFolders */ public async tryGetGameFolder(gameFolders: string[]): Promise { for(const gameFolder of gameFolders){ @@ -92,6 +95,29 @@ export class OculusService { return null; } + + public oculusRunning(): Promise { + return taskRunning("OculusClient"); + } + + public async startOculus(): Promise{ + if(await this.oculusRunning()){ return; } + + await shell.openPath("oculus://view/homepage"); + + return new Promise((resolve, reject) => { + const interval = setInterval(async () => { + if(!(await this.oculusRunning())){ return; } + clearInterval(interval); + resolve(); + }, sToMs(3)); + + setTimeout(() => { + clearInterval(interval); + reject("Unable to open Oculus"); + }, sToMs(30)); + }); + } } export interface OculusLibrary {