Compare commits
10 Commits
3.0.3
...
eb1ef06c07
Author | SHA1 | Date | |
---|---|---|---|
eb1ef06c07 | |||
a64655ec5d | |||
45b902cfb6 | |||
f53aba9a7b | |||
f7c2dc689a | |||
b778a5a369 | |||
084e006f06 | |||
9b3cb0bd26 | |||
c5649c3f8a | |||
fac54f3e59 |
14
bun.lock
14
bun.lock
@@ -7,18 +7,17 @@
|
||||
"@better-fetch/fetch": "^1.1.18",
|
||||
"@fontsource/sora": "^5.2.6",
|
||||
"@fontsource/space-mono": "^5.2.8",
|
||||
"@iarna/toml": "2.2.5",
|
||||
"@number-flow/svelte": "^0.3.9",
|
||||
"@tailwindcss/typography": "0.5.16",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"@tauri-apps/api": "2.6.0",
|
||||
"@tauri-apps/plugin-dialog": "2.3.1",
|
||||
"@tauri-apps/plugin-dialog": "2.3.2",
|
||||
"@tauri-apps/plugin-fs": "2.4.1",
|
||||
"@tauri-apps/plugin-shell": "2.3.0",
|
||||
"animejs": "^4.0.2",
|
||||
"buffer": "^6.0.3",
|
||||
"crypto-js": "^4.2.0",
|
||||
"lucide-svelte": "0.525.0",
|
||||
"lucide-svelte": "^0.535.0",
|
||||
"semver": "^7.7.2",
|
||||
"svelte-confetti": "^2.0.0",
|
||||
"tw-animate-css": "^1.3.0",
|
||||
@@ -26,7 +25,8 @@
|
||||
"devDependencies": {
|
||||
"@eslint/compat": "^1.2.5",
|
||||
"@eslint/js": "^9.18.0",
|
||||
"@lucide/svelte": "^0.525.0",
|
||||
"@iarna/toml": "2.2.5",
|
||||
"@lucide/svelte": "^0.535.0",
|
||||
"@sveltejs/adapter-static": "3.0.8",
|
||||
"@sveltejs/kit": "2.22.2",
|
||||
"@sveltejs/vite-plugin-svelte": "^6.1.0",
|
||||
@@ -171,7 +171,7 @@
|
||||
|
||||
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
|
||||
|
||||
"@lucide/svelte": ["@lucide/svelte@0.525.0", "", { "peerDependencies": { "svelte": "^5" } }, "sha512-dyUxkXzepagLUzL8jHQNdeH286nC66ClLACsg+Neu/bjkRJWPWMzkT+H0DKlE70QdkicGCfs1ZGmXCc351hmZA=="],
|
||||
"@lucide/svelte": ["@lucide/svelte@0.535.0", "", { "peerDependencies": { "svelte": "^5" } }, "sha512-LSVs0G+IXSHHxMl/U6bHTnDP/pbmwpS7/mkCDXmWD9Wi0oQlZihKFoFLjDFhC+6mdfRE6ZgBasXTusvrOYv0lA=="],
|
||||
|
||||
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
|
||||
|
||||
@@ -293,7 +293,7 @@
|
||||
|
||||
"@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.6.1", "", { "os": "win32", "cpu": "x64" }, "sha512-fBsjPqIIHaaQt7tnjIGmPHu5p/BNBVD4JfOhO3QqIVBzAb+W2bDyIQPdoDMI943soLr/+N10xeTiPu+3L74+dQ=="],
|
||||
|
||||
"@tauri-apps/plugin-dialog": ["@tauri-apps/plugin-dialog@2.3.1", "", { "dependencies": { "@tauri-apps/api": "^2.6.0" } }, "sha512-B7jvyhycV8SI/WHzPjciwtYfdFM6/9EXuMjRgYWZwn8GPDmHxpT80aJdb/eDVN+NgoAFDh9bu4QPonYahoYnZQ=="],
|
||||
"@tauri-apps/plugin-dialog": ["@tauri-apps/plugin-dialog@2.3.2", "", { "dependencies": { "@tauri-apps/api": "^2.6.0" } }, "sha512-cNLo9YeQSC0MF4IgXnotHsqEgJk72MBZLXmQPrLA95qTaaWiiaFQ38hIMdZ6YbGUNkr3oni3EhU+AD5jLHcdUA=="],
|
||||
|
||||
"@tauri-apps/plugin-fs": ["@tauri-apps/plugin-fs@2.4.1", "", { "dependencies": { "@tauri-apps/api": "^2.6.0" } }, "sha512-vJlKZVGF3UAFGoIEVT6Oq5L4HGDCD78WmA4uhzitToqYiBKWAvZR61M6zAyQzHqLs0ADemkE4RSy/5sCmZm6ZQ=="],
|
||||
|
||||
@@ -555,7 +555,7 @@
|
||||
|
||||
"lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
|
||||
|
||||
"lucide-svelte": ["lucide-svelte@0.525.0", "", { "peerDependencies": { "svelte": "^3 || ^4 || ^5.0.0-next.42" } }, "sha512-kfuN6JcCqTfCz2B76aXnyGLAzEBRSYw5GaUspM5RNHQZS5aI5yaKu06fbaofOk8cDvUtY0AUm/zAix7aUX6Q3A=="],
|
||||
"lucide-svelte": ["lucide-svelte@0.535.0", "", { "peerDependencies": { "svelte": "^3 || ^4 || ^5.0.0-next.42" } }, "sha512-qajkcYp9F2ZaIc0bmiuGWdvOW1A5JminAStI/9A4hZSeQnPeGuCNuHH3kMRzASgi99O3Z38NvMK6/0Lv72yxdQ=="],
|
||||
|
||||
"magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
|
||||
|
||||
|
@@ -25,13 +25,13 @@
|
||||
"@tailwindcss/typography": "0.5.16",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"@tauri-apps/api": "2.6.0",
|
||||
"@tauri-apps/plugin-dialog": "2.3.1",
|
||||
"@tauri-apps/plugin-dialog": "2.3.2",
|
||||
"@tauri-apps/plugin-fs": "2.4.1",
|
||||
"@tauri-apps/plugin-shell": "2.3.0",
|
||||
"animejs": "^4.0.2",
|
||||
"buffer": "^6.0.3",
|
||||
"crypto-js": "^4.2.0",
|
||||
"lucide-svelte": "0.525.0",
|
||||
"lucide-svelte": "^0.535.0",
|
||||
"semver": "^7.7.2",
|
||||
"tw-animate-css": "^1.3.0",
|
||||
"svelte-confetti": "^2.0.0"
|
||||
@@ -40,7 +40,7 @@
|
||||
"@eslint/compat": "^1.2.5",
|
||||
"@eslint/js": "^9.18.0",
|
||||
"@iarna/toml": "2.2.5",
|
||||
"@lucide/svelte": "^0.525.0",
|
||||
"@lucide/svelte": "^0.535.0",
|
||||
"@sveltejs/adapter-static": "3.0.8",
|
||||
"@sveltejs/kit": "2.22.2",
|
||||
"@sveltejs/vite-plugin-svelte": "^6.1.0",
|
||||
|
124
src-tauri/Cargo.lock
generated
124
src-tauri/Cargo.lock
generated
@@ -134,7 +134,7 @@ dependencies = [
|
||||
"futures-lite",
|
||||
"parking",
|
||||
"polling",
|
||||
"rustix 1.0.8",
|
||||
"rustix",
|
||||
"slab",
|
||||
"windows-sys 0.60.2",
|
||||
]
|
||||
@@ -165,7 +165,7 @@ dependencies = [
|
||||
"cfg-if",
|
||||
"event-listener",
|
||||
"futures-lite",
|
||||
"rustix 1.0.8",
|
||||
"rustix",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -191,7 +191,7 @@ dependencies = [
|
||||
"cfg-if",
|
||||
"futures-core",
|
||||
"futures-io",
|
||||
"rustix 1.0.8",
|
||||
"rustix",
|
||||
"signal-hook-registry",
|
||||
"slab",
|
||||
"windows-sys 0.60.2",
|
||||
@@ -438,12 +438,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cargo_toml"
|
||||
version = "0.22.1"
|
||||
version = "0.22.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257"
|
||||
checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"toml 0.8.23",
|
||||
"toml 0.9.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -901,9 +901,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
|
||||
|
||||
[[package]]
|
||||
name = "dyn-clone"
|
||||
version = "1.0.19"
|
||||
version = "1.0.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005"
|
||||
checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
|
||||
|
||||
[[package]]
|
||||
name = "embed-resource"
|
||||
@@ -914,7 +914,7 @@ dependencies = [
|
||||
"cc",
|
||||
"memchr",
|
||||
"rustc_version",
|
||||
"toml 0.9.2",
|
||||
"toml 0.9.4",
|
||||
"vswhom",
|
||||
"winreg 0.55.0",
|
||||
]
|
||||
@@ -1010,7 +1010,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ezpplauncher"
|
||||
version = "3.0.3"
|
||||
version = "3.0.4"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"discord-rich-presence",
|
||||
@@ -2113,25 +2113,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"windows-targets 0.53.2",
|
||||
"windows-targets 0.53.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
version = "0.1.6"
|
||||
version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0"
|
||||
checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.9.4"
|
||||
@@ -2146,9 +2140,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
|
||||
|
||||
[[package]]
|
||||
name = "litrs"
|
||||
version = "0.4.1"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
|
||||
checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
@@ -2259,9 +2253,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "muda"
|
||||
version = "0.17.0"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988"
|
||||
checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a"
|
||||
dependencies = [
|
||||
"crossbeam-channel",
|
||||
"dpi",
|
||||
@@ -2275,7 +2269,7 @@ dependencies = [
|
||||
"png",
|
||||
"serde",
|
||||
"thiserror 2.0.12",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.60.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2982,7 +2976,7 @@ dependencies = [
|
||||
"concurrent-queue",
|
||||
"hermit-abi",
|
||||
"pin-project-lite",
|
||||
"rustix 1.0.8",
|
||||
"rustix",
|
||||
"windows-sys 0.60.2",
|
||||
]
|
||||
|
||||
@@ -3305,9 +3299,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.15"
|
||||
version = "0.5.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec"
|
||||
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
]
|
||||
@@ -3462,9 +3456,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.25"
|
||||
version = "0.1.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
|
||||
checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
@@ -3481,19 +3475,6 @@ dependencies = [
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.44"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys 0.4.15",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "1.0.8"
|
||||
@@ -3503,15 +3484,15 @@ dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys 0.9.4",
|
||||
"linux-raw-sys",
|
||||
"windows-sys 0.60.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls"
|
||||
version = "0.23.29"
|
||||
version = "0.23.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1"
|
||||
checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"ring",
|
||||
@@ -4356,9 +4337,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tauri-plugin-dialog"
|
||||
version = "2.3.1"
|
||||
version = "2.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05bedd4c3cf6f7aa97918a8814a736bd3695c9ddf3ede2d50eda6069c3290edc"
|
||||
checksum = "37e5858cc7b455a73ab4ea2ebc08b5be33682c00ff1bf4cad5537d4fb62499d9"
|
||||
dependencies = [
|
||||
"log",
|
||||
"raw-window-handle",
|
||||
@@ -4537,7 +4518,7 @@ dependencies = [
|
||||
"fastrand",
|
||||
"getrandom 0.3.3",
|
||||
"once_cell",
|
||||
"rustix 1.0.8",
|
||||
"rustix",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
@@ -4650,9 +4631,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.46.1"
|
||||
version = "1.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
|
||||
checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"bytes",
|
||||
@@ -4663,10 +4644,10 @@ dependencies = [
|
||||
"pin-project-lite",
|
||||
"signal-hook-registry",
|
||||
"slab",
|
||||
"socket2 0.5.10",
|
||||
"socket2 0.6.0",
|
||||
"tokio-macros",
|
||||
"tracing",
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4727,9 +4708,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.9.2"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac"
|
||||
checksum = "41ae868b5a0f67631c14589f7e250c1ea2c574ee5ba21c6c8dd4b1485705a5a1"
|
||||
dependencies = [
|
||||
"indexmap 2.10.0",
|
||||
"serde",
|
||||
@@ -4893,9 +4874,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tray-icon"
|
||||
version = "0.21.0"
|
||||
version = "0.21.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a"
|
||||
checksum = "a0d92153331e7d02ec09137538996a7786fe679c629c279e82a6be762b7e6fe2"
|
||||
dependencies = [
|
||||
"crossbeam-channel",
|
||||
"dirs",
|
||||
@@ -5222,13 +5203,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wayland-backend"
|
||||
version = "0.3.10"
|
||||
version = "0.3.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121"
|
||||
checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"downcast-rs",
|
||||
"rustix 0.38.44",
|
||||
"rustix",
|
||||
"scoped-tls",
|
||||
"smallvec",
|
||||
"wayland-sys",
|
||||
@@ -5236,21 +5217,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wayland-client"
|
||||
version = "0.31.10"
|
||||
version = "0.31.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61"
|
||||
checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"rustix 0.38.44",
|
||||
"rustix",
|
||||
"wayland-backend",
|
||||
"wayland-scanner",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wayland-protocols"
|
||||
version = "0.32.8"
|
||||
version = "0.32.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a"
|
||||
checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"wayland-backend",
|
||||
@@ -5260,9 +5241,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wayland-scanner"
|
||||
version = "0.31.6"
|
||||
version = "0.31.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484"
|
||||
checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quick-xml 0.37.5",
|
||||
@@ -5271,9 +5252,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wayland-sys"
|
||||
version = "0.31.6"
|
||||
version = "0.31.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615"
|
||||
checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142"
|
||||
dependencies = [
|
||||
"dlib",
|
||||
"log",
|
||||
@@ -5587,7 +5568,7 @@ version = "0.60.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
|
||||
dependencies = [
|
||||
"windows-targets 0.53.2",
|
||||
"windows-targets 0.53.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -5623,10 +5604,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.53.2"
|
||||
version = "0.53.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
|
||||
checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
"windows_aarch64_gnullvm 0.53.0",
|
||||
"windows_aarch64_msvc 0.53.0",
|
||||
"windows_i686_gnu 0.53.0",
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "ezpplauncher"
|
||||
version = "3.0.3"
|
||||
version = "3.0.4"
|
||||
description = "EZPPLauncher redefined."
|
||||
authors = ["HorizonCode"]
|
||||
edition = "2024"
|
||||
@@ -23,14 +23,14 @@ tauri-plugin-shell = "2.3.0"
|
||||
serde = { version = "1.0.219", features = ["derive"] }
|
||||
serde_json = "1.0.141"
|
||||
serde_repr = "0.1.20"
|
||||
tauri-plugin-dialog = "2.3.1"
|
||||
tauri-plugin-dialog = "2.3.2"
|
||||
tauri-plugin-fs = "2.4.1"
|
||||
hardware-id = "0.3.0"
|
||||
tauri-plugin-cors-fetch = "4.1.0"
|
||||
sysinfo = "0.36.1"
|
||||
reqwest = { version = "0.12.22", features = ["json", "stream"] }
|
||||
md5 = "0.8.0"
|
||||
tokio = { version = "1.46.1", features = ["full"] }
|
||||
tokio = { version = "1.47.0", features = ["full"] }
|
||||
open = "5.3.2"
|
||||
windows-sys = "0.60.2"
|
||||
discord-rich-presence = "0.2.5"
|
||||
|
343
src-tauri/nsis/dotnet.nsh
Normal file
343
src-tauri/nsis/dotnet.nsh
Normal file
@@ -0,0 +1,343 @@
|
||||
; A set of NSIS macros to check whether a dotnet core runtime is installed and, if not, offer to
|
||||
; download and install it. Supports dotnet versions 3.1 and newer - latest tested version is 7.0.
|
||||
;
|
||||
; Inspired by & initially based on NsisDotNetChecker, which does the same thing for .NET framework
|
||||
; https://github.com/alex-sitnikov/NsisDotNetChecker
|
||||
|
||||
!include "WordFunc.nsh"
|
||||
!include "TextFunc.nsh"
|
||||
!include "X64.nsh"
|
||||
|
||||
!ifndef DOTNETCORE_INCLUDED
|
||||
!define DOTNETCORE_INCLUDED
|
||||
|
||||
; Check that a specific version of the dotnet core runtime is installed and, if not, attempts to
|
||||
; install it
|
||||
;
|
||||
; \param Version The desired dotnet core runtime version as a 2 digit version. e.g. 3.1, 6.0, 7.0
|
||||
!macro CheckDotNetCore Version
|
||||
|
||||
; Save registers
|
||||
Push $R0
|
||||
Push $R1
|
||||
Push $R2
|
||||
|
||||
; Push and pop parameters so we don't have conflicts if parameters are $R#
|
||||
Push ${Version}
|
||||
Pop $R0 ; Version
|
||||
|
||||
!define ID ${__LINE__}
|
||||
|
||||
; Check current installed version
|
||||
!insertmacro DotNetCoreGetInstalledVersion $R0 $R1
|
||||
|
||||
; If $R1 is blank then there is no version installed, otherwise it is installed
|
||||
; todo in future we might want to support "must be at least 6.0.7", for now we only deal with "yes/no" for a major version (e.g. 6.0)
|
||||
StrCmp $R1 "" notinstalled_${ID}
|
||||
DetailPrint "dotnet version $R1 already installed"
|
||||
Goto end_${ID}
|
||||
|
||||
notinstalled_${ID}:
|
||||
DetailPrint "dotnet $R0 is not installed"
|
||||
|
||||
!insertmacro DotNetCoreGetLatestVersion $R0 $R1
|
||||
DetailPrint "Latest Version of $R0 is $R1"
|
||||
|
||||
|
||||
; Get number of input digits
|
||||
; ${WordFind} $R1 "." "#" $R2
|
||||
; DetailPrint "version parts count is $R2"
|
||||
|
||||
; ${WordFind} $R1 "." "+1" $R2
|
||||
; DetailPrint "version part 1 is $R2"
|
||||
|
||||
; ${WordFind} $R1 "." "+2" $R2
|
||||
; DetailPrint "version part 2 is $R2"
|
||||
|
||||
; ${WordFind} $R1 "." "+3" $R2
|
||||
; DetailPrint "version part 3 is $R2"
|
||||
|
||||
!insertmacro DotNetCoreInstallVersion $R1
|
||||
|
||||
end_${ID}:
|
||||
!undef ID
|
||||
|
||||
; Restore registers
|
||||
Pop $R2
|
||||
Pop $R1
|
||||
Pop $R0
|
||||
|
||||
!macroend
|
||||
|
||||
|
||||
|
||||
; Gets the latest version of the runtime for a specified dotnet version. This uses the same endpoint
|
||||
; as the dotnet-install scripts to determine the latest full version of a dotnet version
|
||||
;
|
||||
; \param[in] Version The desired dotnet core runtime version as a 2 digit version. e.g. 3.1, 6.0, 7.0
|
||||
; \param[out] Result The full version number of the latest version - e.g. 6.0.7
|
||||
!macro DotNetCoreGetLatestVersion Version Result
|
||||
|
||||
; Save registers
|
||||
Push $R0
|
||||
Push $R1
|
||||
Push $R2
|
||||
|
||||
; Push and pop parameters so we don't have conflicts if parameters are $R#
|
||||
Push ${Version}
|
||||
Pop $R0 ; Version
|
||||
|
||||
StrCpy $R1 https://dotnetcli.azureedge.net/dotnet/WindowsDesktop/$R0/latest.version
|
||||
DetailPrint "Querying latest version of dotnet $R0 from $R1"
|
||||
|
||||
; Fetch latest version of the desired dotnet version
|
||||
; todo error handling in the PS script? so we can check for errors here
|
||||
StrCpy $R2 "Write-Host (Invoke-WebRequest -UseBasicParsing -URI $\"$R1$\").Content;"
|
||||
!insertmacro DotNetCorePSExec $R2 $R2
|
||||
; $R2 contains latest version, e.g. 6.0.7
|
||||
|
||||
; todo error handling here
|
||||
|
||||
; Push the result onto the stack
|
||||
${TrimNewLines} $R2 $R2
|
||||
Push $R2
|
||||
|
||||
; Restore registers
|
||||
Exch
|
||||
Pop $R2
|
||||
Exch
|
||||
Pop $R1
|
||||
Exch
|
||||
Pop $R0
|
||||
|
||||
; Set result
|
||||
Pop ${Result}
|
||||
|
||||
!macroend
|
||||
|
||||
!macro DotNetCoreGetInstalledVersion Version Result
|
||||
!define DNC_INS_ID ${__LINE__}
|
||||
|
||||
; Save registers
|
||||
Push $R0
|
||||
Push $R1
|
||||
Push $R2
|
||||
|
||||
; Push and pop parameters so we don't have conflicts if parameters are $R#
|
||||
Push ${Version}
|
||||
Pop $R0 ; Version
|
||||
|
||||
DetailPrint "Checking installed version of dotnet $R0"
|
||||
|
||||
StrCpy $R1 "dotnet --list-runtimes | % { if($$_ -match $\".*WindowsDesktop.*($R0.\d+).*$\") { $$matches[1] } } | Sort-Object {[int]($$_ -replace '\d.\d.(\d+)', '$$1')} -Descending | Select-Object -first 1"
|
||||
!insertmacro DotNetCorePSExec $R1 $R1
|
||||
; $R1 contains highest installed version, e.g. 6.0.7
|
||||
|
||||
${TrimNewLines} $R1 $R1
|
||||
|
||||
; If there is an installed version it should start with the same two "words" as the input version,
|
||||
; otherwise assume we got an error response
|
||||
|
||||
; todo improve this simple test which checks there are at least 3 "words" separated by periods
|
||||
${WordFind} $R1 "." "E#" $R2
|
||||
IfErrors error_${DNC_INS_ID}
|
||||
; $R2 contains number of version parts in R1 (dot separated words = version parts)
|
||||
|
||||
; If less than 3 parts, or more than 4 parts, error
|
||||
IntCmp $R2 3 0 error_${DNC_INS_ID}
|
||||
IntCmp $R2 4 0 0 error_${DNC_INS_ID}
|
||||
|
||||
; todo more error handling here / validation
|
||||
|
||||
; Seems to be OK, skip the "set to blank string" error handler
|
||||
Goto end_${DNC_INS_ID}
|
||||
|
||||
error_${DNC_INS_ID}:
|
||||
StrCpy $R1 "" ; Set result to blank string if any error occurs (means not installed)
|
||||
|
||||
end_${DNC_INS_ID}:
|
||||
!undef DNC_INS_ID
|
||||
|
||||
; Push the result onto the stack
|
||||
Push $R1
|
||||
|
||||
; Restore registers
|
||||
Exch
|
||||
Pop $R2
|
||||
Exch
|
||||
Pop $R1
|
||||
Exch
|
||||
Pop $R0
|
||||
|
||||
; Set result
|
||||
Pop ${Result}
|
||||
|
||||
!macroend
|
||||
|
||||
!macro DotNetCoreInstallVersion Version
|
||||
|
||||
; Save registers
|
||||
Push $R0
|
||||
Push $R1
|
||||
Push $R2
|
||||
Push $R3
|
||||
|
||||
; Push and pop parameters so we don't have conflicts if parameters are $R#
|
||||
Push ${Version}
|
||||
Pop $R0 ; Version
|
||||
|
||||
${If} ${IsNativeAMD64}
|
||||
StrCpy $R3 "x64"
|
||||
${ElseIf} ${IsNativeARM64}
|
||||
StrCpy $R3 "arm64"
|
||||
${ElseIf} ${IsNativeIA32}
|
||||
StrCpy $R3 "x86"
|
||||
${Else}
|
||||
StrCpy $R3 "unknown"
|
||||
${EndIf}
|
||||
|
||||
; todo can download as a .zip, which is smaller, then we'd need to unzip it before running it...
|
||||
StrCpy $R1 https://dotnetcli.azureedge.net/dotnet/WindowsDesktop/$R0/windowsdesktop-runtime-$R0-win-$R3.exe
|
||||
|
||||
; For dotnet versions less than 5 the WindowsDesktop runtime has a different path
|
||||
${WordFind} $R0 "." "+1" $R2
|
||||
IntCmp $R2 5 +2 0 +2
|
||||
StrCpy $R1 https://dotnetcli.azureedge.net/dotnet/Runtime/$R0/windowsdesktop-runtime-$R0-win-$R3.exe
|
||||
|
||||
DetailPrint "Downloading dotnet $R0 from $R1"
|
||||
|
||||
; Create destination file
|
||||
GetTempFileName $R2
|
||||
nsExec::Exec 'cmd.exe /c rename "$R2" "$R2.exe"' ; Not using Rename to avoid spam in details log
|
||||
Pop $R3 ; Pop exit code
|
||||
StrCpy $R2 "$R2.exe"
|
||||
|
||||
; Fetch runtime installer
|
||||
; todo error handling in the PS script? so we can check for errors here
|
||||
StrCpy $R1 "Invoke-WebRequest -UseBasicParsing -URI $\"$R1$\" -OutFile $\"$R2$\""
|
||||
!insertmacro DotNetCorePSExec $R1 $R1
|
||||
; $R1 contains powershell script result
|
||||
|
||||
${WordFind} $R1 "BlobNotFound" "E+1{" $R3
|
||||
ifErrors +3 0
|
||||
DetailPrint "Dotnet installer $R0 not found."
|
||||
Goto +10
|
||||
|
||||
; todo error handling for PS result, verify download result
|
||||
|
||||
|
||||
IfFileExists $R2 +3, 0
|
||||
DetailPrint "Dotnet installer did not download."
|
||||
Goto +7
|
||||
|
||||
DetailPrint "Download complete"
|
||||
|
||||
DetailPrint "Installing dotnet $R0"
|
||||
ExecWait "$\"$R2$\" /install /quiet /norestart" $R1
|
||||
DetailPrint "Installer completed (Result: $R1)"
|
||||
|
||||
nsExec::Exec 'cmd.exe /c del "$R2"' ; Not using Delete to avoid spam in details log
|
||||
Pop $R3 ; Pop exit code
|
||||
|
||||
; Error checking? Verify install result?
|
||||
|
||||
; Restore registers
|
||||
Pop $R3
|
||||
Pop $R2
|
||||
Pop $R1
|
||||
Pop $R0
|
||||
|
||||
!macroend
|
||||
|
||||
; below is adapted from https://nsis.sourceforge.io/PowerShell_support but avoids using the plugin
|
||||
; directory in favour of a temp file and providing a return variable rather than returning on the
|
||||
; stack. Methods renamed to avoid conflicting with use of the original macros
|
||||
|
||||
; DotNetCorePSExec
|
||||
; Executes a powershell script
|
||||
;
|
||||
; \param[in] PSCommand The powershell command or script to execute
|
||||
; \param[out] Result The output from the powershell script
|
||||
!macro DotNetCorePSExec PSCommand Result
|
||||
|
||||
Push ${PSCommand}
|
||||
Call DotNetCorePSExecFn
|
||||
Pop ${Result}
|
||||
|
||||
!macroend
|
||||
|
||||
; DotNetCorePSExecFile
|
||||
; Executes a powershell file
|
||||
;
|
||||
; \param[in] FilePath The path to the powershell script file to execute
|
||||
; \param[out] Result The output from the powershell script
|
||||
!macro DotNetCorePSExecFile FilePath Result
|
||||
|
||||
Push ${FilePath}
|
||||
Call DotNetCorePSExecFileFn
|
||||
Pop ${Result}
|
||||
|
||||
!macroend
|
||||
|
||||
Function DotNetCorePSExecFn
|
||||
|
||||
; Read parameters and save registers
|
||||
Exch $R0 ; Script
|
||||
Push $R1
|
||||
Push $R2
|
||||
|
||||
; Write the command into a temp file
|
||||
; Note: Using GetTempFileName to get a temp file name, but since we need to have a .ps1 extension
|
||||
; on the end we rename it with an extra file extension
|
||||
GetTempFileName $R1
|
||||
nsExec::Exec 'cmd.exe /c rename "$R1" "$R1.ps1"' ; Not using Rename to avoid spam in details log
|
||||
Pop $R2 ; Pop exit code
|
||||
StrCpy $R1 "$R1.ps1"
|
||||
|
||||
FileOpen $R2 $R1 w
|
||||
FileWrite $R2 $R0
|
||||
FileClose $R2
|
||||
|
||||
; Execute the powershell script and delete the temp file
|
||||
Push $R1
|
||||
Call DotNetCorePSExecFileFn
|
||||
nsExec::Exec 'cmd.exe /c del "$R1"' ; Not using Delete to avoid spam in details log
|
||||
Pop $R0 ; Pop exit code
|
||||
|
||||
; Restore registers
|
||||
Exch
|
||||
Pop $R2
|
||||
Exch
|
||||
Pop $R1
|
||||
Exch
|
||||
Pop $R0
|
||||
|
||||
; Stack contains script output only, which we leave as the function result
|
||||
|
||||
FunctionEnd
|
||||
|
||||
Function DotNetCorePSExecFileFn
|
||||
|
||||
; Read parameters and save registers
|
||||
Exch $R0 ; FilePath
|
||||
Push $R1
|
||||
|
||||
nsExec::ExecToStack 'powershell -inputformat none -ExecutionPolicy RemoteSigned -File "$R0" '
|
||||
; Stack contain exitCode, scriptOutput, registers
|
||||
|
||||
; Pop exit code & validate
|
||||
Pop $R1
|
||||
IntCmp $R1 0 +2
|
||||
SetErrorLevel 2
|
||||
|
||||
; Restore registers
|
||||
Exch
|
||||
Pop $R1
|
||||
Exch
|
||||
Pop $R0
|
||||
|
||||
; Stack contains script output only, which we leave as the function result
|
||||
|
||||
FunctionEnd
|
||||
|
||||
!endif
|
12
src-tauri/nsis/nsis-hooks.nsh
Normal file
12
src-tauri/nsis/nsis-hooks.nsh
Normal file
@@ -0,0 +1,12 @@
|
||||
!incluide "dotnet.nsh"
|
||||
|
||||
!macro NSIS_HOOK_PREINSTALL
|
||||
!insertmacro CheckDotNetCore 8.0
|
||||
!macroend
|
||||
|
||||
!macro NSIS_HOOK_POSTINSTALL
|
||||
${If} $PassiveMode = 1
|
||||
${OrIf} ${Silent}
|
||||
Exec '"$INSTDIR\${MAINBINARYNAME}.exe"'
|
||||
${EndIf}
|
||||
!macroend
|
@@ -6,6 +6,7 @@ use std::path::PathBuf;
|
||||
use sysinfo::System;
|
||||
use tauri::AppHandle;
|
||||
use tauri::Emitter;
|
||||
use tauri::Manager;
|
||||
use tokio::fs;
|
||||
use tokio::io::AsyncWriteExt;
|
||||
use tokio::process::Command;
|
||||
@@ -729,3 +730,79 @@ pub fn encrypt_string(string: String, entropy: String) -> String {
|
||||
Err(_) => string,
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn download_ezpp_launcher_update(app: AppHandle, url: String) -> Result<(), String> {
|
||||
let client = Client::new();
|
||||
|
||||
let mut response = client.get(&url).send().await.map_err(|e| e.to_string())?;
|
||||
|
||||
if !response.status().is_success() {
|
||||
return Err(format!("Failed to download update: {}", response.status()));
|
||||
}
|
||||
|
||||
let temp_dir = app.path().temp_dir().expect("Failed to get temp directory");
|
||||
let file_path = temp_dir.join("ezpplauncher_update.exe");
|
||||
|
||||
let mut file_out = fs::File::create(&file_path)
|
||||
.await
|
||||
.map_err(|e| e.to_string())?;
|
||||
let mut downloaded = 0u64;
|
||||
let size = response
|
||||
.content_length()
|
||||
.ok_or("Failed to get content length")? as usize;
|
||||
|
||||
while let Some(chunk) = response.chunk().await.map_err(|e| e.to_string())? {
|
||||
downloaded += chunk.len() as u64;
|
||||
file_out
|
||||
.write_all(&chunk)
|
||||
.await
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
app.emit(
|
||||
"download-progress",
|
||||
UpdateStatus {
|
||||
file_name: "Update".to_string(),
|
||||
downloaded,
|
||||
size: size,
|
||||
progress: ((downloaded as f64 / size as f64 * 100.0) * 100.0).trunc() / 100.0,
|
||||
},
|
||||
)
|
||||
.unwrap_or_default();
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
#[tauri::command]
|
||||
pub async fn install_ezpp_launcher_update(app: AppHandle) -> Result<(), String> {
|
||||
let temp_dir = app.path().temp_dir().expect("Failed to get temp directory");
|
||||
let file_path = temp_dir.join("ezpplauncher_update.exe");
|
||||
if !file_path.exists() {
|
||||
return Err("Update file does not exist".to_string());
|
||||
}
|
||||
|
||||
// run this app detached and exit
|
||||
|
||||
const DETACHED_PROCESS: u32 = 0x00000008;
|
||||
const CREATE_NEW_PROCESS_GROUP: u32 = 0x00000200;
|
||||
|
||||
Command::new(&file_path)
|
||||
.arg("/S")
|
||||
.creation_flags(DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
|
||||
.spawn()
|
||||
.map_err(|e| format!("Failed to spawn updater: {}", e))?;
|
||||
|
||||
sleep(Duration::from_millis(250)).await;
|
||||
|
||||
app.exit(0x0100);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(not(windows))]
|
||||
#[tauri::command]
|
||||
pub async fn install_ezpp_launcher_update(_app: AppHandle) -> Result<(), String> {
|
||||
Ok(())
|
||||
}
|
||||
|
@@ -5,10 +5,11 @@ pub mod commands;
|
||||
pub mod presence;
|
||||
pub mod utils;
|
||||
use crate::commands::{
|
||||
check_for_corruption, download_ezpp_launcher_update_files, encrypt_string, exit,
|
||||
find_osu_installation, get_beatmapsets_count, get_ezpp_launcher_update_files, get_hwid,
|
||||
get_launcher_version, get_osu_release_stream, get_osu_skin, get_osu_version, get_platform,
|
||||
get_skins_count, has_net8, has_osuwinello, has_wmctrl, is_osu_running, open_url_in_browser,
|
||||
check_for_corruption, download_ezpp_launcher_update, download_ezpp_launcher_update_files,
|
||||
encrypt_string, exit, find_osu_installation, get_beatmapsets_count,
|
||||
get_ezpp_launcher_update_files, get_hwid, get_launcher_version, get_osu_release_stream,
|
||||
get_osu_skin, get_osu_version, get_platform, get_skins_count, has_net8, has_osuwinello,
|
||||
has_wmctrl, install_ezpp_launcher_update, is_osu_running, open_url_in_browser,
|
||||
presence_connect, presence_disconnect, presence_is_connected, presence_update_status,
|
||||
presence_update_user, replace_ui_files, run_osu, run_osu_updater, set_osu_config_values,
|
||||
set_osu_user_config_values, valid_osu_folder,
|
||||
@@ -61,7 +62,9 @@ pub fn run() {
|
||||
has_osuwinello,
|
||||
has_wmctrl,
|
||||
has_net8,
|
||||
encrypt_string
|
||||
encrypt_string,
|
||||
download_ezpp_launcher_update,
|
||||
install_ezpp_launcher_update
|
||||
])
|
||||
.plugin(tauri_plugin_fs::init())
|
||||
.plugin(tauri_plugin_dialog::init())
|
||||
|
@@ -286,8 +286,18 @@ pub fn get_window_title_by_pid(pid: Pid) -> String {
|
||||
}
|
||||
|
||||
pub async fn is_net8_installed() -> bool {
|
||||
use std::process::Command;
|
||||
let output_result = Command::new("dotnet").arg("--list-runtimes").output();
|
||||
use tokio::process::Command;
|
||||
|
||||
let mut command = Command::new("dotnet");
|
||||
command.arg("--list-runtimes");
|
||||
|
||||
#[cfg(windows)]
|
||||
{
|
||||
const CREATE_NO_WINDOW: u32 = 0x08000000;
|
||||
command.creation_flags(CREATE_NO_WINDOW);
|
||||
}
|
||||
|
||||
let output_result = command.output().await;
|
||||
match output_result {
|
||||
Ok(output) => {
|
||||
if !output.status.success() {
|
||||
@@ -300,9 +310,7 @@ pub async fn is_net8_installed() -> bool {
|
||||
}
|
||||
|
||||
let stdout_str = String::from_utf8_lossy(&output.stdout);
|
||||
stdout_str
|
||||
.lines()
|
||||
.any(|line| line.starts_with("Microsoft.WindowsDesktop.App 8."))
|
||||
stdout_str.lines().any(|line| line.starts_with("Microsoft.WindowsDesktop.App 8."))
|
||||
}
|
||||
Err(_) => false,
|
||||
}
|
||||
|
@@ -1,8 +1,9 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "ezpplauncher",
|
||||
"version": "3.0.3",
|
||||
"identifier": "farm.ezpp.launcher",
|
||||
"productName": "EZPPLauncher",
|
||||
"version": "3.0.4",
|
||||
"identifier": "farm.EZPPFarm.Launcher",
|
||||
"mainBinaryName": "ezpplauncher",
|
||||
"build": {
|
||||
"beforeDevCommand": "bun run vite:dev",
|
||||
"devUrl": "http://localhost:1420",
|
||||
@@ -32,20 +33,26 @@
|
||||
"license": "GPL-3.0",
|
||||
"active": true,
|
||||
"targets": [
|
||||
"app"
|
||||
"nsis",
|
||||
"appimage"
|
||||
],
|
||||
"windows": {
|
||||
"webviewInstallMode": {
|
||||
"silent": true,
|
||||
"type": "downloadBootstrapper"
|
||||
},
|
||||
"nsis": {
|
||||
"installMode": "currentUser",
|
||||
"compression": "lzma",
|
||||
"installerHooks": "./nsis/nsis-hooks.nsh"
|
||||
}
|
||||
},
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
],
|
||||
"windows": {
|
||||
"webviewInstallMode": {
|
||||
"silent": true,
|
||||
"type": "downloadBootstrapper"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@@ -138,3 +138,17 @@ export const hasOsuWinello = async () => await invoke<boolean>('has_osuwinello')
|
||||
export const hasNet8 = async () => await invoke<boolean>('has_net8');
|
||||
export const encryptString = async (str: string, entropy: string) =>
|
||||
await invoke<string>('encrypt_string', { string: str, entropy });
|
||||
export const downloadUpdate = async (
|
||||
url: string,
|
||||
progressCallback: (file: UpdateStatus) => void
|
||||
) => {
|
||||
const downloadStatusListen = await listen('download-progress', (event) =>
|
||||
progressCallback(event.payload as UpdateStatus)
|
||||
);
|
||||
try {
|
||||
await invoke<string>('download_ezpp_launcher_update', { url });
|
||||
} finally {
|
||||
downloadStatusListen();
|
||||
}
|
||||
};
|
||||
export const installUpdate = async () => await invoke('install_ezpp_launcher_update');
|
||||
|
@@ -83,6 +83,7 @@
|
||||
import { osuapi } from '@/api/osuapi';
|
||||
import {
|
||||
downloadEZPPLauncherUpdateFiles,
|
||||
downloadUpdate,
|
||||
encryptString,
|
||||
exit,
|
||||
getBeatmapSetsCount,
|
||||
@@ -94,6 +95,7 @@
|
||||
hasNet8,
|
||||
hasOsuWinello,
|
||||
hasWMCTRL,
|
||||
installUpdate,
|
||||
isOsuCorrupted,
|
||||
isOsuRunning,
|
||||
isValidOsuFolder,
|
||||
@@ -114,6 +116,8 @@
|
||||
let launchInfo = $state('');
|
||||
let launchError = $state<Error | undefined>(undefined);
|
||||
|
||||
let downloadingUpdate = $state(false);
|
||||
|
||||
let selectedGamemode = $derived(
|
||||
getGamemodeInt(modeIntToStr($preferredMode), typeIntToStr($preferredType))
|
||||
);
|
||||
@@ -577,6 +581,36 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center justify-center mb-3">
|
||||
{#if $platform === 'windows'}
|
||||
{#if downloadingUpdate}
|
||||
<div class="flex flex-col items-center justify-center gap-2 p-3 rounded-lg w-full">
|
||||
<Progress indeterminate={progress === -1} value={progress} />
|
||||
<span class="text-muted-foreground text-sm mt-4">{launchInfo}</span>
|
||||
</div>
|
||||
{:else}
|
||||
<Button
|
||||
onclick={async () => {
|
||||
const updateFile = $newVersion?.assets.find((asset) => asset.name.endsWith('.exe'));
|
||||
if (!updateFile) {
|
||||
toast.error('Hmmm...', {
|
||||
description: 'No update file found.',
|
||||
});
|
||||
$newVersion = undefined;
|
||||
return;
|
||||
}
|
||||
downloadingUpdate = true;
|
||||
launchInfo = 'Downloading Update...';
|
||||
await downloadUpdate(updateFile.browser_download_url, (file) => {
|
||||
progress = file.progress;
|
||||
launchInfo = `Downloading Update (${formatBytes(file.downloaded)}/${formatBytes(file.size)})...`;
|
||||
});
|
||||
progress = -1;
|
||||
launchInfo = 'Update downloaded, installing...';
|
||||
await installUpdate();
|
||||
}}>Install Update now</Button
|
||||
>
|
||||
{/if}
|
||||
{:else}
|
||||
<Button
|
||||
onclick={async () => {
|
||||
if ($newVersion) {
|
||||
@@ -585,6 +619,7 @@
|
||||
}
|
||||
}}>Update now</Button
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
</AlertDialog.Content>
|
||||
</AlertDialog.Root>
|
||||
|
Reference in New Issue
Block a user