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
perf.data
perf.data.old
mod.zip

View file

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

View file

@ -5,7 +5,7 @@ resolver = "2"
[package]
name = "noita-proxy"
description = "Noita Entangled Worlds companion app."
version = "0.21.3"
version = "0.21.4"
edition = "2021"
# 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"
thiserror = "1.0.61"
poll-promise = "0.3.0"
zip = "2.1.4"
zip = "2.2.0"
self-replace = "1.3.7"
bytemuck = { version = "1.16.0", features = ["derive"] }
bincode = "1.3.3"

View file

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

View file

@ -118,6 +118,10 @@ impl Downloader {
self.handle.ready()
}
pub fn into_ready(self) -> Result<(), ReleasesError> {
self.handle.block_and_take()
}
pub fn 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")
.send()
.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()?)
}