Automated commit: v0.21.4

This commit is contained in:
IQuant 2024-08-23 12:51:53 +03:00
parent 86e21ad271
commit 06dd6a71c4
5 changed files with 68 additions and 26 deletions

View file

@ -3,3 +3,4 @@ worldlog.bin
flamegraph.svg flamegraph.svg
perf.data perf.data
perf.data.old perf.data.old
mod.zip

View file

@ -1993,7 +1993,7 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
[[package]] [[package]]
name = "noita-proxy" name = "noita-proxy"
version = "0.21.3" version = "0.21.4"
dependencies = [ dependencies = [
"argh", "argh",
"bincode", "bincode",
@ -4509,9 +4509,9 @@ dependencies = [
[[package]] [[package]]
name = "zip" name = "zip"
version = "2.1.6" version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e" checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494"
dependencies = [ dependencies = [
"aes", "aes",
"arbitrary", "arbitrary",

View file

@ -5,7 +5,7 @@ resolver = "2"
[package] [package]
name = "noita-proxy" name = "noita-proxy"
description = "Noita Entangled Worlds companion app." description = "Noita Entangled Worlds companion app."
version = "0.21.3" version = "0.21.4"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -33,7 +33,7 @@ reqwest = { version = "0.12.4", features = ["blocking", "json", "http2", "rustls
serde_json = "1.0.117" serde_json = "1.0.117"
thiserror = "1.0.61" thiserror = "1.0.61"
poll-promise = "0.3.0" poll-promise = "0.3.0"
zip = "2.1.4" zip = "2.2.0"
self-replace = "1.3.7" self-replace = "1.3.7"
bytemuck = { version = "1.16.0", features = ["derive"] } bytemuck = { version = "1.16.0", features = ["derive"] }
bincode = "1.3.3" bincode = "1.3.3"

View file

@ -35,6 +35,7 @@ enum State {
EyreErrorReport(eyre::Report), EyreErrorReport(eyre::Report),
UnpackMod(Promise<Result<(), ReleasesError>>), UnpackMod(Promise<Result<(), ReleasesError>>),
ConfirmInstall, ConfirmInstall,
UnpackDone,
} }
pub struct Modmanager { pub struct Modmanager {
@ -236,7 +237,7 @@ impl Modmanager {
assert!(mod_path.ends_with("quant.ew")); assert!(mod_path.ends_with("quant.ew"));
fs::remove_dir_all(mod_path).ok(); fs::remove_dir_all(mod_path).ok();
info!("Current mod deleted"); info!("Current mod deleted");
info!("Switching to DownloadMod state");
self.state = State::DownloadMod(promise) self.state = State::DownloadMod(promise)
} }
if ui.button(tr("modman_another_path")).clicked() { if ui.button(tr("modman_another_path")).clicked() {
@ -262,28 +263,37 @@ impl Modmanager {
}; };
match promise.block_and_take() { match promise.block_and_take() {
Ok(downloader) => { Ok(downloader) => {
let path = downloader.path().to_path_buf(); if downloader.ready().is_some() {
let directory = settings.mod_path(); let path = downloader.path().to_path_buf();
let promise: Promise<Result<(), ReleasesError>> = let directory = settings.mod_path();
Promise::spawn_thread("unpack", move || { match downloader.into_ready() {
extract_and_remove_zip(path, directory) Ok(_) => {
}); let promise: Promise<Result<(), ReleasesError>> =
self.state = State::UnpackMod(promise); Promise::spawn_thread("unpack", move || {
extract_and_remove_zip(path, directory)
});
info!("Switching to UnpackMod state");
self.state = State::UnpackMod(promise);
}
Err(err) => {
info!("Switching to EyreErrorReport state");
self.state = State::EyreErrorReport(err)
}
}
} else {
self.state = State::DownloadMod(Promise::from_ready(Ok(downloader)))
}
}
Err(err) => {
info!("Switching to EyreErrorReport state (2)");
self.state = State::EyreErrorReport(err)
} }
Err(err) => self.state = State::EyreErrorReport(err),
} }
} }
} }
State::UnpackMod(promise) => { State::UnpackMod(promise) => {
match promise.ready() { match promise.ready() {
Some(Ok(_)) => { Some(_) => {}
ui.label(tr("modman_installed"));
if ui.button(tr("button_continue")).clicked() {
self.state = State::Done;
return;
};
}
Some(Err(_)) => {}
None => { None => {
ui.label(tr("modman_unpacking")); ui.label(tr("modman_unpacking"));
} }
@ -293,7 +303,10 @@ impl Modmanager {
unreachable!(); unreachable!();
}; };
match promise.block_and_take() { match promise.block_and_take() {
Ok(_) => {} Ok(_) => {
info!("Switching to UnpackDone state");
self.state = State::UnpackDone;
}
Err(err) => { Err(err) => {
self.state = State::EyreErrorReport(err); self.state = State::EyreErrorReport(err);
} }
@ -307,6 +320,14 @@ impl Modmanager {
} }
} }
State::Done => {} State::Done => {}
State::UnpackDone => {
ui.label(tr("modman_installed"));
if ui.button(tr("button_continue")).clicked() {
info!("Switching to Done state");
self.state = State::Done;
return;
};
}
} }
} }
@ -350,14 +371,25 @@ fn mod_downloader_for(
} }
fn extract_and_remove_zip(zip_file: PathBuf, extract_to: PathBuf) -> Result<(), ReleasesError> { fn extract_and_remove_zip(zip_file: PathBuf, extract_to: PathBuf) -> Result<(), ReleasesError> {
extract_zip(&zip_file, extract_to)?;
fs::remove_file(&zip_file).ok();
Ok(())
}
fn extract_zip(zip_file: &PathBuf, extract_to: PathBuf) -> Result<(), eyre::Error> {
let zip_file = zip_file.canonicalize().unwrap_or(zip_file.to_path_buf());
let reader = File::open(&zip_file) let reader = File::open(&zip_file)
.wrap_err_with(|| format!("Failed to open zip file: {}", zip_file.display()))?; .wrap_err_with(|| format!("Failed to open zip file: {}", zip_file.display()))?;
let mut zip = zip::ZipArchive::new(reader).wrap_err("Failed to create Zip Archive reader")?; let mut zip = zip::ZipArchive::new(reader).wrap_err_with(|| {
format!(
"Failed to create Zip Archive reader: {}",
zip_file.display()
)
})?;
info!("Extracting zip file"); info!("Extracting zip file");
zip.extract(&extract_to) zip.extract(&extract_to)
.wrap_err_with(|| format!("Failed to extract zip to: {}", extract_to.display()))?; .wrap_err_with(|| format!("Failed to extract zip to: {}", extract_to.display()))?;
info!("Zip file extracted"); info!("Zip file extracted");
fs::remove_file(&zip_file).ok();
Ok(()) Ok(())
} }

View file

@ -118,6 +118,10 @@ impl Downloader {
self.handle.ready() self.handle.ready()
} }
pub fn into_ready(self) -> Result<(), ReleasesError> {
self.handle.block_and_take()
}
pub fn path(&self) -> &Path { pub fn path(&self) -> &Path {
&self.path &self.path
} }
@ -227,7 +231,12 @@ pub fn get_release_by_tag(client: &Client, tag: Tag) -> Result<Release, Releases
.header("User-agent", "noita proxy") .header("User-agent", "noita proxy")
.send() .send()
.wrap_err_with(|| format!("Failed to get release by tag from {}", url))?; .wrap_err_with(|| format!("Failed to get release by tag from {}", url))?;
let response = response.error_for_status().wrap_err_with(|| {
format!(
"Failed to get release by tag from {}: response returned an error",
url
)
})?;
Ok(response.json()?) Ok(response.json()?)
} }