0.5.0: BIG performance improvements and fixes, also saving now works.

This commit is contained in:
RabbyDevs 2025-05-07 01:42:53 +03:00
parent 32485708a1
commit f8ea4cee47
4 changed files with 198 additions and 168 deletions

164
Cargo.lock generated
View file

@ -40,7 +40,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
"getrandom 0.2.15",
"getrandom 0.2.16",
"once_cell",
"version_check",
"zerocopy 0.7.35",
@ -90,9 +90,9 @@ dependencies = [
[[package]]
name = "anyhow"
version = "1.0.97"
version = "1.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "arbitrary"
@ -140,9 +140,9 @@ dependencies = [
[[package]]
name = "async-compression"
version = "0.4.22"
version = "0.4.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59a194f9d963d8099596278594b3107448656ba73831c9d8c783e613ce86da64"
checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07"
dependencies = [
"flate2",
"futures-core",
@ -293,9 +293,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
[[package]]
name = "bytemuck"
version = "1.22.0"
version = "1.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c"
dependencies = [
"bytemuck_derive",
]
@ -351,9 +351,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.18"
version = "1.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c"
checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0"
dependencies = [
"jobserver",
"libc",
@ -548,9 +548,9 @@ dependencies = [
[[package]]
name = "cosmic-text"
version = "0.14.1"
version = "0.14.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1db686e755000c93f73a3acc78be56a71e3efb83ed92886f45faea2b9485bad7"
checksum = "da46a9d5a8905cc538a4a5bceb6a4510de7a51049c5588c0114efce102bcbbe8"
dependencies = [
"bitflags 2.9.0",
"fontdb",
@ -1038,9 +1038,9 @@ dependencies = [
[[package]]
name = "getrandom"
version = "0.2.15"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"libc",
@ -1336,9 +1336,9 @@ dependencies = [
[[package]]
name = "h2"
version = "0.4.9"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633"
checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5"
dependencies = [
"atomic-waker",
"bytes",
@ -1365,9 +1365,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.15.2"
version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
dependencies = [
"foldhash",
]
@ -2052,9 +2052,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]]
name = "libc"
version = "0.2.171"
version = "0.2.172"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
[[package]]
name = "libfuzzer-sys"
@ -2078,9 +2078,9 @@ dependencies = [
[[package]]
name = "libm"
version = "0.2.11"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8"
[[package]]
name = "libredox"
@ -2090,7 +2090,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
"bitflags 2.9.0",
"libc",
"redox_syscall 0.5.11",
"redox_syscall 0.5.12",
]
[[package]]
@ -2769,7 +2769,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.5.11",
"redox_syscall 0.5.12",
"smallvec",
"windows-targets 0.52.6",
]
@ -2858,7 +2858,7 @@ version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
"zerocopy 0.8.24",
"zerocopy 0.8.25",
]
[[package]]
@ -2878,9 +2878,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.94"
version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
dependencies = [
"unicode-ident",
]
@ -2921,9 +2921,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]]
name = "quick-xml"
version = "0.37.4"
version = "0.37.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369"
checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
dependencies = [
"memchr",
]
@ -2970,7 +2970,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom 0.2.15",
"getrandom 0.2.16",
]
[[package]]
@ -3022,9 +3022,9 @@ dependencies = [
[[package]]
name = "ravif"
version = "0.11.11"
version = "0.11.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6"
checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6"
dependencies = [
"avif-serialize",
"imgref",
@ -3082,9 +3082,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.11"
version = "0.5.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
dependencies = [
"bitflags 2.9.0",
]
@ -3095,7 +3095,7 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b"
dependencies = [
"getrandom 0.2.15",
"getrandom 0.2.16",
"libredox",
"thiserror 2.0.12",
]
@ -3116,7 +3116,6 @@ dependencies = [
"base64",
"bytes",
"encoding_rs",
"futures-channel",
"futures-core",
"futures-util",
"h2",
@ -3155,7 +3154,7 @@ dependencies = [
[[package]]
name = "reversed-rooms-launcher"
version = "0.4.0"
version = "0.5.0"
dependencies = [
"directories",
"file-format",
@ -3168,6 +3167,7 @@ dependencies = [
"strum 0.27.1",
"strum_macros 0.27.1",
"tempfile",
"tokio",
"url",
]
@ -3185,7 +3185,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
dependencies = [
"cc",
"cfg-if",
"getrandom 0.2.15",
"getrandom 0.2.16",
"libc",
"untrusted",
"windows-sys 0.52.0",
@ -3230,9 +3230,9 @@ dependencies = [
[[package]]
name = "rustix"
version = "1.0.5"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
dependencies = [
"bitflags 2.9.0",
"errno",
@ -3243,9 +3243,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.23.26"
version = "0.23.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0"
checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321"
dependencies = [
"once_cell",
"rustls-pki-types",
@ -3271,9 +3271,9 @@ checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c"
[[package]]
name = "rustls-webpki"
version = "0.103.1"
version = "0.103.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03"
checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437"
dependencies = [
"ring",
"rustls-pki-types",
@ -3377,9 +3377,9 @@ dependencies = [
[[package]]
name = "self_cell"
version = "1.1.0"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe"
checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749"
[[package]]
name = "semver"
@ -3573,7 +3573,7 @@ dependencies = [
"objc2-foundation",
"objc2-quartz-core",
"raw-window-handle",
"redox_syscall 0.5.11",
"redox_syscall 0.5.12",
"rustix 0.38.44",
"tiny-xlib",
"wasm-bindgen",
@ -3661,9 +3661,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "svg_fmt"
version = "0.4.4"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa"
checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb"
[[package]]
name = "swash"
@ -3678,9 +3678,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.100"
version = "2.0.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
dependencies = [
"proc-macro2",
"quote",
@ -3698,9 +3698,9 @@ dependencies = [
[[package]]
name = "synstructure"
version = "0.13.1"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
@ -3778,7 +3778,7 @@ dependencies = [
"fastrand",
"getrandom 0.3.2",
"once_cell",
"rustix 1.0.5",
"rustix 1.0.7",
"windows-sys 0.59.0",
]
@ -3908,9 +3908,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.44.2"
version = "1.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165"
dependencies = [
"backtrace",
"bytes",
@ -3968,9 +3968,9 @@ dependencies = [
[[package]]
name = "toml"
version = "0.8.20"
version = "0.8.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148"
checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae"
dependencies = [
"serde",
"serde_spanned",
@ -3980,18 +3980,18 @@ dependencies = [
[[package]]
name = "toml_datetime"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3"
dependencies = [
"serde",
]
[[package]]
name = "toml_edit"
version = "0.22.24"
version = "0.22.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
dependencies = [
"indexmap",
"serde",
@ -4321,9 +4321,9 @@ dependencies = [
[[package]]
name = "wayland-backend"
version = "0.3.8"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf"
checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121"
dependencies = [
"cc",
"downcast-rs",
@ -4335,9 +4335,9 @@ dependencies = [
[[package]]
name = "wayland-client"
version = "0.31.8"
version = "0.31.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f"
checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61"
dependencies = [
"bitflags 2.9.0",
"rustix 0.38.44",
@ -4358,9 +4358,9 @@ dependencies = [
[[package]]
name = "wayland-cursor"
version = "0.31.8"
version = "0.31.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d"
checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182"
dependencies = [
"rustix 0.38.44",
"wayland-client",
@ -4369,9 +4369,9 @@ dependencies = [
[[package]]
name = "wayland-protocols"
version = "0.32.6"
version = "0.32.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc"
checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@ -4381,9 +4381,9 @@ dependencies = [
[[package]]
name = "wayland-protocols-plasma"
version = "0.3.6"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3"
checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@ -4394,9 +4394,9 @@ dependencies = [
[[package]]
name = "wayland-protocols-wlr"
version = "0.3.6"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2"
checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@ -5007,9 +5007,9 @@ dependencies = [
[[package]]
name = "winnow"
version = "0.7.6"
version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10"
checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3"
dependencies = [
"memchr",
]
@ -5130,9 +5130,9 @@ dependencies = [
[[package]]
name = "yuvutils-rs"
version = "0.8.2"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "909db140691d64f8ca83054be5108332926f05019f16f13a29559e6ef6fc50a4"
checksum = "5b699b6503cd14c70b258eaffedd7ada5a781ea23206eeb9066736b99ba37af1"
dependencies = [
"num-traits",
]
@ -5154,11 +5154,11 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.24"
version = "0.8.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
dependencies = [
"zerocopy-derive 0.8.24",
"zerocopy-derive 0.8.25",
]
[[package]]
@ -5174,9 +5174,9 @@ dependencies = [
[[package]]
name = "zerocopy-derive"
version = "0.8.24"
version = "0.8.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be"
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
dependencies = [
"proc-macro2",
"quote",

View file

@ -1,7 +1,7 @@
#![feature(let_chains)]
[package]
name = "reversed-rooms-launcher"
version = "0.4.0"
version = "0.5.0"
edition = "2024"
[dependencies]
@ -16,7 +16,11 @@ url = "2.5.4"
file-format = "0.26.0"
strum = "0.27.1"
strum_macros = "0.27.1"
reqwest = { version = "0.12.15", features = ["blocking", "gzip", "json"] }
reqwest = { version = "0.12.15", features = [
# "blocking",
"gzip",
"json"] }
tokio = "1.45.0"
[profile.release]
strip = true # Automatically strip symbols from the binary.

View file

@ -3,7 +3,7 @@ use std::{fs::create_dir_all, io::Write, path::Path};
use std::fs::{remove_file, DirEntry, OpenOptions};
use directories::ProjectDirs;
use reqwest::blocking::Client;
use reqwest::Client;
use reqwest::header::{HeaderMap, HeaderValue, ACCEPT_ENCODING};
use serde::{Deserialize, Serialize};
@ -62,19 +62,24 @@ struct HoyoLauncherInformation {
data: HoyoGameList
}
pub fn refresh_install() -> Result<(), String> {
pub async fn refresh_install() -> Result<(), String> {
let reqwest_client = build_client()?;
let proj_dirs = ProjectDirs::from("com", "RabbyDevs", "rr-launcher")
.ok_or_else(|| "Failed to get project directories".to_string())?;
if let Err(e) = refresh_kuro_install(&proj_dirs, &reqwest_client) {
let (kuro_result, hoyo_result) = tokio::join!(
refresh_kuro_install(&proj_dirs, &reqwest_client),
refresh_hoyo_install(&proj_dirs, &reqwest_client)
);
if let Err(e) = kuro_result {
eprintln!("Error in Kuro install: {}", e);
}
if let Err(e) = refresh_hoyo_install(&proj_dirs, &reqwest_client) {
if let Err(e) = hoyo_result {
eprintln!("Error in Hoyo install: {}", e);
}
Ok(())
}
@ -89,7 +94,7 @@ fn build_client() -> Result<Client, String> {
.map_err(|e| format!("Failed to build HTTP client: {}", e))
}
fn refresh_kuro_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(), String> {
async fn refresh_kuro_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(), String> {
let data_dir_buf = proj_dirs.data_dir().join("kuro/wuwa");
let data_dir = data_dir_buf.as_path();
@ -104,6 +109,7 @@ fn refresh_kuro_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(),
let response = client
.get(&index_url)
.send()
.await
.map_err(|e| format!("Failed to send HTTP request: {}", e))?;
if !response.status().is_success() {
@ -114,6 +120,7 @@ fn refresh_kuro_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(),
let version_index: KuroVersionIndex = response
.json()
.await
.map_err(|e| {
format!("Failed to parse JSON - {}", e)
})?;
@ -132,6 +139,7 @@ fn refresh_kuro_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(),
let bg_response = client
.get(&bg_info_url)
.send()
.await
.map_err(|e| format!("Failed to send background info request: {}", e))?;
if !bg_response.status().is_success() {
@ -140,17 +148,18 @@ fn refresh_kuro_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(),
let bg_information: KuroBackgroundInformation = bg_response
.json()
.await
.map_err(|e| format!("Failed to parse background info JSON: {}", e))?;
eprintln!("Successfully parsed background info: {:?}", bg_information);
update_file_if_needed(data_dir, client, &bg_information.background_file, "background")?;
update_file_if_needed(data_dir, client, &bg_information.slogan, "splash")?;
update_file_if_needed(data_dir, client, &bg_information.background_file, "background").await?;
update_file_if_needed(data_dir, client, &bg_information.slogan, "splash").await?;
Ok(())
}
fn update_file_if_needed(dir: &Path, client: &Client, file_url: &str, file_type: &str) -> Result<(), String> {
async fn update_file_if_needed(dir: &Path, client: &Client, file_url: &str, file_type: &str) -> Result<(), String> {
let current_file: Option<DirEntry> = {
let mut current_file = None;
for path in dir.read_dir().unwrap() {
@ -168,25 +177,27 @@ fn update_file_if_needed(dir: &Path, client: &Client, file_url: &str, file_type:
if let Some(file) = current_file {
if filename != file.file_name().into_string().unwrap().strip_prefix(format!("{}_", file_type).as_str()).unwrap() {
update_file(client, file_path, file_type, file_url)?;
update_file(client, file_path, file_type, file_url).await?;
remove_file(file.path()).unwrap();
} else {
eprintln!("{} file already exists at: {}", file_type, file.path().display());
}
} else {
update_file(client, file_path, file_type, file_url)?;
update_file(client, file_path, file_type, file_url).await?;
}
Ok(())
}
fn update_file(client: &Client, file_path: PathBuf, file_type: &str, file_url: &str) -> Result<(), String> {
async fn update_file(client: &Client, file_path: PathBuf, file_type: &str, file_url: &str) -> Result<(), String> {
eprintln!("Downloading {} file from: {}", file_type, file_url);
let file_bytes = client
.get(file_url)
.send()
.await
.map_err(|e| format!("Failed to send request for {} file: {}", file_type, e))?
.bytes()
.await
.map_err(|e| format!("Failed to get bytes for {} file: {}", file_type, e))?;
let mut file = OpenOptions::new()
@ -207,7 +218,7 @@ fn update_file(client: &Client, file_path: PathBuf, file_type: &str, file_url: &
Ok(())
}
fn refresh_hoyo_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(), String> {
async fn refresh_hoyo_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(), String> {
let hoyo_url = "https://sg-hyp-api.hoyoverse.com/hyp/hyp-connect/api/getGames?launcher_id=VYTpXlbWo8&language=en-us";
eprintln!("Fetching Hoyo launcher info from: {}", hoyo_url);
@ -215,6 +226,7 @@ fn refresh_hoyo_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(),
let response = client
.get(hoyo_url)
.send()
.await
.map_err(|e| format!("Failed to fetch Hoyo launcher info: {}", e))?;
if !response.status().is_success() {
@ -223,6 +235,7 @@ fn refresh_hoyo_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(),
let hoyo_launcher_info: HoyoLauncherInformation = response
.json()
.await
.map_err(|e| format!("Failed to parse Hoyo launcher info: {}", e))?;
eprintln!("Successfully parsed Hoyo launcher info");
@ -247,10 +260,10 @@ fn refresh_hoyo_install(proj_dirs: &ProjectDirs, client: &Client) -> Result<(),
eprintln!("Processing game: {} ({})", game.display.name, game_abbreviation);
let icon_url = &game.display.icon.url;
update_file_if_needed(data_dir, client, icon_url, "icon")?;
update_file_if_needed(data_dir, client, icon_url, "icon").await?;
let bg_url = &game.display.background.url;
update_file_if_needed(data_dir, client, bg_url, "background")?;
update_file_if_needed(data_dir, client, bg_url, "background").await?;
}
Ok(())

View file

@ -108,14 +108,14 @@ struct State {
installed_games: Vec<PossibleGames>,
installed_game_servers: Vec<PossibleGames>,
db_software_installed: bool,
background: Option<LauncherBackground>,
backgrounds: HashMap<PossibleGames, LauncherBackground>,
splash_images: HashMap<PossibleGames, DynamicImage>,
icon_images: HashMap<PossibleGames, DynamicImage>
}
impl State {
fn get_background_element(&self) -> Option<Element<Message>> {
if let Some(background) = self.background.as_ref() {
if let Some(background) = self.backgrounds.get(&self.selected_game) {
match background {
LauncherBackground::Video(video) => Some(VideoPlayer::new(video).into()),
LauncherBackground::Image(img) => Some(image(image::Handle::from_rgba(img.width(), img.height(), img.to_rgba8().into_raw())).into()),
@ -145,13 +145,17 @@ impl State {
.width(Length::Fixed(48.0))
.height(Length::Fixed(64.0))
};
mouse_area(
img
)
.on_press(Message::GameSelected(game.clone()))
.interaction(Interaction::Pointer)
.into()
if game != &self.selected_game {
mouse_area(
img
)
.on_press(Message::GameSelected(game.clone()))
.interaction(Interaction::Pointer)
.into()
} else {
opaque(img)
}
} else {
text("loading").size(10).into()
}
@ -166,6 +170,54 @@ impl State {
None
}
}
fn path() -> PathBuf {
let project_dirs = ProjectDirs::from("com", "RabbyDevs", "rr-launcher").unwrap();
let path = project_dirs.data_dir();
path.join("launcher-state.json").to_path_buf()
}
fn load(self) -> Result<State, LoadError> {
if let Ok(contents) = read_to_string(Self::path()) {
let saved_state: SavedState = serde_json::from_str(&contents).map_err(|_| LoadError::Format)?;
Ok(State {
selected_game: saved_state.selected_game,
installed_games: saved_state.installed_games,
installed_game_servers: saved_state.installed_game_servers,
db_software_installed: saved_state.db_software_installed,
backgrounds: self.backgrounds,
splash_images: self.splash_images,
icon_images: self.icon_images,
})
} else {
Ok(self)
}
}
fn save(&mut self) -> Result<(), SaveError> {
let saved_state = SavedState {
selected_game: self.selected_game.clone(),
installed_games: self.installed_games.clone(),
installed_game_servers: self.installed_game_servers.clone(),
db_software_installed: self.db_software_installed,
};
let json = serde_json::to_string_pretty(&saved_state).map_err(|_| SaveError::Format)?;
let path = Self::path();
if let Some(dir) = path.parent() {
create_dir_all(dir).map_err(|_| SaveError::Write)?;
}
let mut file = fs::File::create(path).map_err(|_| SaveError::Write)?;
file.write_all(json.as_bytes()).map_err(|_| SaveError::Write)?;
file.flush().map_err(|_| SaveError::Write)?;
Ok(())
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
@ -200,64 +252,12 @@ enum Message {
LoadIcons(HashMap<PossibleGames, DynamicImage>),
LoadSplashes(HashMap<PossibleGames, DynamicImage>),
LoadBackground(()),
RefreshInstall(()),
RefreshInstall(Result<(), String>),
GameSelected(PossibleGames),
Close,
Minimize
}
impl State {
fn path() -> PathBuf {
let project_dirs = ProjectDirs::from("com", "RabbyDevs", "rr-launcher").unwrap();
let path = project_dirs.config_dir();
path.join("launcher-state.json").to_path_buf()
}
fn load(self) -> Result<State, LoadError> {
if let Ok(contents) = read_to_string(Self::path()) {
let saved_state: SavedState = serde_json::from_str(&contents).map_err(|_| LoadError::Format)?;
Ok(State {
selected_game: saved_state.selected_game,
installed_games: saved_state.installed_games,
installed_game_servers: saved_state.installed_game_servers,
db_software_installed: saved_state.db_software_installed,
background: self.background,
splash_images: self.splash_images,
icon_images: self.icon_images,
})
} else {
Ok(self)
}
}
fn save(&mut self) -> Result<(), SaveError> {
let saved_state = SavedState {
selected_game: self.selected_game.clone(),
installed_games: self.installed_games.clone(),
installed_game_servers: self.installed_game_servers.clone(),
db_software_installed: self.db_software_installed,
};
let json = serde_json::to_string_pretty(&saved_state).map_err(|_| SaveError::Format)?;
let path = Self::path();
if let Some(dir) = path.parent() {
create_dir_all(dir).map_err(|_| SaveError::Write)?;
}
{
let mut file = fs::File::open(path).unwrap();
file.write_all(json.as_bytes()).map_err(|_| SaveError::Write)?;
file.flush().map_err(|_| SaveError::Write)?;
}
Ok(())
}
}
async fn get_icons() -> HashMap<PossibleGames, DynamicImage> {
let mut icons: HashMap<PossibleGames, DynamicImage> = HashMap::new();
for game in PossibleGames::iter() {
@ -280,7 +280,14 @@ async fn empty() {}
impl Launcher {
fn boot() -> (Self, Task<Message>) {
(Self::Loaded(Box::new(State::default().load().unwrap())), Task::batch([Task::perform(empty(), Message::LoadBackground), Task::perform(get_icons(), Message::LoadIcons), Task::perform(get_splashes(), Message::LoadSplashes), Task::perform(empty(), Message::RefreshInstall)]))
(Self::Loaded(
Box::new(State::default().load().unwrap())),
Task::batch([
Task::perform(refresh_install(), Message::RefreshInstall),
Task::perform(empty(), Message::LoadBackground),
Task::perform(get_icons(), Message::LoadIcons),
Task::perform(get_splashes(), Message::LoadSplashes),
]))
}
fn title(&self) -> String {
@ -297,6 +304,7 @@ impl Launcher {
})
}
Message::Close => {
state.save().unwrap();
window::get_latest().and_then(move |id: window::Id| {
window::close(id)
})
@ -309,6 +317,7 @@ impl Launcher {
Message::EventOccurred(event) => {
if let Event::Window(window::Event::CloseRequested) = event {
state.save().unwrap();
println!("hm");
window::get_latest().and_then(window::close)
} else {
Task::none()
@ -319,7 +328,13 @@ impl Launcher {
Task::none()
},
Message::LoadBackground(()) => {
state.background = Some(get_game_background(&PossibleGames::default()));
let mut bg_map = HashMap::new();
for game in PossibleGames::iter() {
bg_map.insert(game.clone(), get_game_background(&game));
}
state.backgrounds = bg_map;
let (width, height) = state.selected_game.get_game_preferred_size();
window::get_latest().and_then(move |id: window::Id| {
window::resize(id, Size { width: width as f32, height: height as f32 })
@ -330,11 +345,9 @@ impl Launcher {
Task::none()
},
Message::RefreshInstall(_result) => {
refresh_install().unwrap();
Task::none()
},
Message::GameSelected(game) => {
state.background = Some(get_game_background(&game));
state.selected_game = game;
let (width, height) = state.selected_game.get_game_preferred_size();
window::get_latest().and_then(move |id: window::Id| {
@ -422,7 +435,7 @@ impl Launcher {
let bg_element = if let Some(bg) = state.get_background_element() {
bg
} else {
center(text("Loading...").size(50)).style(|_| {container::Style { text_color: Some(Color::from_rgba8(255, 255, 255, 1.0)), background: Some(Color::from_rgba8(0, 0, 0, 1.0).into()), ..container::Style::default() }}).into()
center(text("").size(50)).style(|_| {container::Style { text_color: Some(Color::from_rgba8(255, 255, 255, 1.0)), background: Some(Color::from_rgba8(0, 0, 0, 1.0).into()), ..container::Style::default() }}).into()
};
let mut final_stack = stack![bg_element];