From c6ff848bfa6f347a87d3b094d891e0596b6eee2d Mon Sep 17 00:00:00 2001 From: silentrald Date: Tue, 21 Jan 2025 01:36:38 +0800 Subject: [PATCH] [feat] inject env vars to launch options with steam format %command% --- assets/jsons/translations/en.json | 5 +++++ src/main/helpers/env.helpers.ts | 4 ++-- src/main/services/linux.service.ts | 20 ++++++++++++++++++++ src/renderer/services/bs-launcher.service.ts | 7 ++++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 8b769c7d..557137b8 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -28,6 +28,11 @@ "pin": "Pin", "unpin": "Unpin" }, + "generic": { + "env": { + "parse": "Could not properly parse the env var string." + } + }, "title-bar": { "outdated": "outdated" }, diff --git a/src/main/helpers/env.helpers.ts b/src/main/helpers/env.helpers.ts index 677fa2eb..bb4dd8c6 100644 --- a/src/main/helpers/env.helpers.ts +++ b/src/main/helpers/env.helpers.ts @@ -107,7 +107,7 @@ export function parseEnvString(envString: string): Record { if (state === EnvParserState.ERROR) { throw new CustomError( `parseEnvString failed: invalid character at position ${pos}`, - "env.parse" + "generic.env.parse" ); } } @@ -123,6 +123,6 @@ export function parseEnvString(envString: string): Record { throw new CustomError( "parseEnvString failed: invalid ending state", - "env.parse" + "generic.env.parse" ); } diff --git a/src/main/services/linux.service.ts b/src/main/services/linux.service.ts index 5f12896a..e956148c 100644 --- a/src/main/services/linux.service.ts +++ b/src/main/services/linux.service.ts @@ -10,6 +10,7 @@ import { BsmShellLog, bsmExec } from "main/helpers/os.helpers"; import { LaunchMods } from "shared/models/bs-launch/launch-option.interface"; import { SteamShortcutData } from "shared/models/steam/shortcut.model"; import { buildBsLaunchArgs } from "./bs-launcher/abstract-launcher.service"; +import { parseEnvString } from "main/helpers/env.helpers"; export class LinuxService { private static instance: LinuxService; @@ -24,6 +25,7 @@ export class LinuxService { private readonly installLocationService: InstallationLocationService; private readonly staticConfig: StaticConfigurationService; + private readonly COMMAND_FORMAT = "%command%"; private nixOS: boolean | undefined; private constructor() { @@ -112,6 +114,24 @@ export class LinuxService { envVars.PROTON_LOG_DIR = path.join(bsFolderPath, "Logs"); } + if (launchOptions.additionalArgs) { + const additionalArgs = launchOptions.additionalArgs.join(" "); + const index = additionalArgs.indexOf(this.COMMAND_FORMAT); + if (index > -1) { + const envString = additionalArgs.substring(0, index); + log.info("Parsing env string ", `"${envString}"`) + for (const [ key, value ] of Object.entries(parseEnvString(envString))) { + if (key in envVars) { + log.warn("Ignoring", `${key}=${value}`, "already set env launch command"); + } else { + log.info("Injecting", `${key}="${value}"`, "to the env launch command"); + } + } + } + + launchOptions.additionalArgs = [ additionalArgs.substring(index + this.COMMAND_FORMAT.length) ]; + } + return envVars; } diff --git a/src/renderer/services/bs-launcher.service.ts b/src/renderer/services/bs-launcher.service.ts index 86da6d59..3594d568 100644 --- a/src/renderer/services/bs-launcher.service.ts +++ b/src/renderer/services/bs-launcher.service.ts @@ -61,7 +61,12 @@ export class BSLauncherService { this.notificationService.notifySuccess({title: `notifications.bs-launch.success.titles.${event.type}`, desc: `notifications.bs-launch.success.msg.${event.type}`}); }, error: (err: CustomError) => { - if(!err?.code || !Object.values(BSLaunchError).includes(err.code as BSLaunchError)){ + if (err?.code?.startsWith("generic.")) { + this.notificationService.notifyError({ + title: "notifications.bs-launch.errors.titles.UNKNOWN_ERROR", + desc: err.code, + }); + } else if(!err?.code || !Object.values(BSLaunchError).includes(err.code as BSLaunchError)){ this.notificationService.notifyError({title: "notifications.bs-launch.errors.titles.UNKNOWN_ERROR", desc: "notifications.bs-launch.errors.msg.UNKNOWN_ERROR"}); } else { this.notificationService.notifyError({title: `notifications.bs-launch.errors.titles.${err.code}`, desc: `notifications.bs-launch.errors.msg.${err.code}`, duration: sToMs(9)})