From fbb30b718792cac66c6549f596860459872088e6 Mon Sep 17 00:00:00 2001 From: Wyvest Date: Fri, 26 Dec 2025 19:48:43 +0900 Subject: [PATCH] fix ansi reading for mc options.txt --- Cargo.lock | 5 ++-- Cargo.toml | 1 + apps/oneclient/frontend/src/bindings.gen.ts | 30 ++++++++++----------- packages/core/Cargo.toml | 1 + packages/core/src/api/game/launch.rs | 9 ++++++- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7d9f91c..6ac51d10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1515,9 +1515,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -3643,6 +3643,7 @@ dependencies = [ "dirs", "discord-rich-presence", "dunce", + "encoding_rs", "futures", "futures-lite", "governor", diff --git a/Cargo.toml b/Cargo.toml index 1631e3da..be255c35 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -132,6 +132,7 @@ tokio = { version = "1", features = [ "full" ] } tokio-stream = { version = "0.1", features = [ "fs" ] } tokio-util = { version = "0.7", features = [ "compat" ] } governor = { version = "0.10.4" } +encoding_rs = { version = "0.8.35" } # crypto digest = { version = "0.10" } diff --git a/apps/oneclient/frontend/src/bindings.gen.ts b/apps/oneclient/frontend/src/bindings.gen.ts index 72d720f8..30b8c3d8 100644 --- a/apps/oneclient/frontend/src/bindings.gen.ts +++ b/apps/oneclient/frontend/src/bindings.gen.ts @@ -301,13 +301,26 @@ export type VersionType = */ "old_beta" -const ARGS_MAP = { 'oneclient':'{"getVersions":[],"getClustersGroupedByMajor":[],"getBundlesFor":["cluster_id"]}', 'core':'{"createSettingsProfile":["name"],"getScreenshots":["id"],"getWorlds":["id"],"removeUser":["uuid"],"getDefaultUser":["fallback"],"isClusterRunning":["cluster_id"],"getMultiplePackages":["provider","slugs"],"getRunningProcesses":[],"getPackage":["provider","slug"],"installModpack":["modpack","cluster_id"],"getLogs":["id"],"getRunningProcessesByClusterId":["cluster_id"],"writeSettings":["setting"],"getUsersFromAuthor":["provider","author"],"fetchMinecraftProfile":["uuid"],"openMsaLogin":[],"removeCape":["access_token"],"getPackageBody":["provider","body"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getLinkedPackages":["cluster_id"],"removePackage":["cluster_id","package_hash"],"getGameVersions":[],"updateClusterById":["id","request"],"getGlobalProfile":[],"createCluster":["options"],"getUsers":[],"removeCluster":["id"],"setDefaultUser":["uuid"],"launchCluster":["id","uuid"],"killProcess":["pid"],"getProfileOrDefault":["name"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"changeCape":["access_token","cape_uuid"],"open":["input"],"convertUsernameUUID":["username_uuid"],"setDiscordRPCMessage":["message"],"updateClusterProfile":["name","profile"],"readSettings":[],"getClusters":[],"searchPackages":["provider","query"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"fetchLoggedInProfile":["access_token"],"getLogByName":["id","name"],"getClusterById":["id"],"getLoadersForVersion":["mc_version"],"getUser":["uuid"],"changeSkin":["access_token","skin_url","skin_variant"]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}', 'debug':'{"isInDev":[],"getBuildTimestamp":[],"getLocale":[],"openDevTools":[],"getPlatform":[],"getGitCommitHash":[],"getPackageVersion":[],"getFamily":[],"getOsVersion":[],"getArch":[],"getType":[]}' } +const ARGS_MAP = { 'oneclient':'{"getClustersGroupedByMajor":[],"getVersions":[],"getBundlesFor":["cluster_id"]}', 'core':'{"getLoadersForVersion":["mc_version"],"convertUsernameUUID":["username_uuid"],"getClusters":[],"getGameVersions":[],"getUsers":[],"killProcess":["pid"],"getClusterById":["id"],"getMultiplePackages":["provider","slugs"],"removePackage":["cluster_id","package_hash"],"fetchMinecraftProfile":["uuid"],"changeSkin":["access_token","skin_url","skin_variant"],"getPackageBody":["provider","body"],"getWorlds":["id"],"createSettingsProfile":["name"],"removeUser":["uuid"],"getLinkedPackages":["cluster_id"],"installModpack":["modpack","cluster_id"],"removeCluster":["id"],"changeCape":["access_token","cape_uuid"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getLogByName":["id","name"],"getRunningProcessesByClusterId":["cluster_id"],"fetchLoggedInProfile":["access_token"],"removeCape":["access_token"],"open":["input"],"getDefaultUser":["fallback"],"getLogs":["id"],"updateClusterProfile":["name","profile"],"setDiscordRPCMessage":["message"],"isClusterRunning":["cluster_id"],"updateClusterById":["id","request"],"getUser":["uuid"],"writeSettings":["setting"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getProfileOrDefault":["name"],"getPackage":["provider","slug"],"getGlobalProfile":[],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"setDefaultUser":["uuid"],"getRunningProcesses":[],"createCluster":["options"],"openMsaLogin":[],"launchCluster":["id","uuid"],"getScreenshots":["id"],"readSettings":[],"searchPackages":["provider","query"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"getUsersFromAuthor":["provider","author"]}', 'debug':'{"getOsVersion":[],"getType":[],"getFamily":[],"getBuildTimestamp":[],"isInDev":[],"getArch":[],"getLocale":[],"openDevTools":[],"getPlatform":[],"getGitCommitHash":[],"getPackageVersion":[]}', 'events':'{"ingress":["event"],"message":["event"],"process":["event"]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}' } export type Router = { 'events': { ingress: (event: IngressPayload) => Promise, message: (event: MessagePayload) => Promise, process: (event: ProcessPayload) => Promise }, +'folders': { fromCluster: (folderName: string) => Promise, +openCluster: (folderName: string) => Promise }, 'oneclient': { getClustersGroupedByMajor: () => Promise>, getBundlesFor: (clusterId: number) => Promise, getVersions: () => Promise }, +'debug': { openDevTools: () => Promise, +isInDev: () => Promise, +getArch: () => Promise, +getFamily: () => Promise, +getLocale: () => Promise, +getType: () => Promise, +getPlatform: () => Promise, +getOsVersion: () => Promise, +getGitCommitHash: () => Promise, +getBuildTimestamp: () => Promise, +getPackageVersion: () => Promise }, 'core': { getClusters: () => Promise, getClusterById: (id: number) => Promise, removeCluster: (id: number) => Promise, @@ -355,20 +368,7 @@ changeCape: (accessToken: string, capeUuid: string) => Promise Promise, convertUsernameUUID: (usernameUuid: string) => Promise, setDiscordRPCMessage: (message: string) => Promise, -open: (input: string) => Promise }, -'debug': { openDevTools: () => Promise, -isInDev: () => Promise, -getArch: () => Promise, -getFamily: () => Promise, -getLocale: () => Promise, -getType: () => Promise, -getPlatform: () => Promise, -getOsVersion: () => Promise, -getGitCommitHash: () => Promise, -getBuildTimestamp: () => Promise, -getPackageVersion: () => Promise }, -'folders': { fromCluster: (folderName: string) => Promise, -openCluster: (folderName: string) => Promise } }; +open: (input: string) => Promise } }; export type { InferCommandOutput } diff --git a/packages/core/Cargo.toml b/packages/core/Cargo.toml index 5b94fa37..94ed1232 100644 --- a/packages/core/Cargo.toml +++ b/packages/core/Cargo.toml @@ -100,6 +100,7 @@ async-compression = { workspace = true } dunce = { workspace = true } async-tempfile = { workspace = true } sanitize-filename = { workspace = true } +encoding_rs = { workspace = true } # features[tauri] tauri = { workspace = true, optional = true } diff --git a/packages/core/src/api/game/launch.rs b/packages/core/src/api/game/launch.rs index c18c8d28..bd0855e5 100644 --- a/packages/core/src/api/game/launch.rs +++ b/packages/core/src/api/game/launch.rs @@ -164,7 +164,14 @@ pub async fn launch_minecraft( if !mc_options.is_empty() { let options_path = cwd.join("options.txt"); let mut options_string = if options_path.exists() { - io::read_to_string(&options_path).await? + let bytes = io::read(&options_path).await?; + let (cow, _, had_errors) = encoding_rs::UTF_8.decode(&bytes); + if had_errors { + let (cow, _, _) = encoding_rs::WINDOWS_1252.decode(&bytes); + cow.into_owned() + } else { + cow.into_owned() + } } else { String::new() };