From 4134c55bbe641445fb47dff2ec3ed23c9cbdc970 Mon Sep 17 00:00:00 2001 From: GeckoEidechse Date: Sat, 27 Aug 2022 13:38:05 +0200 Subject: Find Titanfall2 steam install location and propagate it to front-end --- dist/index.html | 1 + src-tauri/Cargo.lock | 109 +++++++++++++++++++++++++++++++++++++++++++++++++- src-tauri/Cargo.toml | 2 + src-tauri/src/main.rs | 32 +++++++++++++++ src-ui/src/main.ts | 8 ++++ 5 files changed, 150 insertions(+), 2 deletions(-) diff --git a/dist/index.html b/dist/index.html index 9c242c36..235e02a1 100644 --- a/dist/index.html +++ b/dist/index.html @@ -8,5 +8,6 @@ . Panic Button + EMPTY diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 244f9266..f68b790b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -69,6 +69,7 @@ dependencies = [ "sentry", "serde", "serde_json", + "steamlocate", "tauri", "tauri-build", "tokio", @@ -582,6 +583,15 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -592,6 +602,17 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -1480,6 +1501,17 @@ dependencies = [ "treediff", ] +[[package]] +name = "keyvalues-parser" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d990301996c856ea07a84bc291e76f1273db52683663efc05c8d355976897e5" +dependencies = [ + "pest", + "pest_derive", + "thiserror", +] + [[package]] name = "kuchiki" version = "0.8.1" @@ -1725,6 +1757,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" + [[package]] name = "notify-rust" version = "4.5.8" @@ -2021,13 +2059,48 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pest" -version = "2.1.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "4b0560d531d1febc25a3c9398a62a71256c0178f2e3443baedd9ad4bb8c9deb4" dependencies = [ + "thiserror", "ucd-trie", ] +[[package]] +name = "pest_derive" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905708f7f674518498c1f8d644481440f476d39ca6ecae83319bba7c6c12da91" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5803d8284a629cc999094ecd630f55e91b561a1d1ba75e233b00ae13b91a69ad" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1538eb784f07615c6d9a8ab061089c6c54a344c5b4301db51990ca1c241e8c04" +dependencies = [ + "once_cell", + "pest", + "sha-1", +] + [[package]] name = "phf" version = "0.8.0" @@ -2791,6 +2864,17 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.2" @@ -2901,6 +2985,27 @@ dependencies = [ "loom", ] +[[package]] +name = "steamlocate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aab3ae49ddfb0afb481b118c00b9cfa20e9a6dc6d9f5264e510a77efda59d818" +dependencies = [ + "dirs", + "keyvalues-parser", + "steamy-vdf", + "winreg", +] + +[[package]] +name = "steamy-vdf" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533127ad49314bfe71c3d3fd36b3ebac3d24f40618092e70e1cfe8362c7fac79" +dependencies = [ + "nom", +] + [[package]] name = "string_cache" version = "0.8.4" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index dce41bce..8bedfb8e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -20,6 +20,8 @@ serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.0.5", features = ["api-all", "updater"] } tokio = { version = "1", features = ["full"] } sentry = "0.27.0" +# Find steam games +steamlocate = "1.0.2" [features] # by default Tauri runs in production mode diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 41776ac4..301dcb4e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -36,6 +36,20 @@ fn main() { } }); + let app_handle = app.app_handle(); + tauri::async_runtime::spawn(async move { + // Checking install location inside a timed loop is a bad idea + // If the user has the game on a harddrive for example, it will prevent the harddrive from ever spinning down + // Instead, install location checks should be event based. + loop { + sleep(Duration::from_millis(5000)).await; + println!("sending install location"); + app_handle + .emit_all("install-location-result", find_game_install_location()) + .unwrap(); + } + }); + Ok(()) }) .manage(Counter(Default::default())) @@ -48,6 +62,24 @@ fn main() { .expect("error while running tauri application"); } +fn find_game_install_location() -> String { + // Attempt parsing Steam library directly + match steamlocate::SteamDir::locate() { + Some(mut steamdir) => { + let titanfall2_steamid = 1237970; + match steamdir.app(&titanfall2_steamid) { + Some(app) => { + println!("{:#?}", app); + return app.path.to_str().unwrap().to_string(); + } + None => println!("Couldn't locate Titanfall2"), + } + } + None => println!("Couldn't locate Steam on this computer!"), + } + "NOT FOUND".to_string() +} + #[tauri::command] fn hello_world() -> String { "Hello World!!!".to_string() diff --git a/src-ui/src/main.ts b/src-ui/src/main.ts index f5f3f303..3c44ce55 100644 --- a/src-ui/src/main.ts +++ b/src-ui/src/main.ts @@ -10,6 +10,14 @@ document.addEventListener("DOMContentLoaded", async function () { let counterResultEl = $("counter-result") as HTMLElement; let pingEl = $("backend-ping")! as HTMLElement; let panicButtonEl = $("panic-button") as HTMLElement; + let installLocationHolderEl = $("install-location-holder") as HTMLElement; + + // listen backend-ping event (from Tauri Rust App) + listen("install-location-result", function (evt: TauriEvent) { + // alert(evt.payload); + // result = evt as String; + installLocationHolderEl.textContent = evt.payload; + }) // listen backend-ping event (from Tauri Rust App) listen("backend-ping", function (evt: TauriEvent) { -- cgit v1.2.3