feat: added wine/dxvk downloading skipping in initial setup

This can cause some issues and in general is a good idea to
avoid downloading what is already downloaded
This commit is contained in:
Observer KRypt0n_ 2023-03-11 09:41:28 +02:00
parent b4f205b885
commit 942abd8474
No known key found for this signature in database
GPG key ID: 844DA47BA25FE1E2

View file

@ -345,71 +345,81 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
let wine = self.selected_wine.clone().unwrap(); let wine = self.selected_wine.clone().unwrap();
let progress_bar_input = self.progress_bar.sender().clone(); let progress_bar_input = self.progress_bar.sender().clone();
std::thread::spawn(move || { // Skip wine downloading if it was already done
tracing::info!("Installing wine"); if wine.is_downloaded_in(&config.game.wine.builds) {
tracing::info!("Wine already installed: {}", wine.name);
// Install wine sender.input(DownloadComponentsAppMsg::CreatePrefix);
match get_installer(&wine.uri, config.launcher.temp.as_ref(), config.launcher.speed_limit) { }
Ok(mut installer) => {
// Create wine builds folder
if config.game.wine.builds.exists() {
std::fs::create_dir_all(&config.game.wine.builds)
.expect("Failed to create wine builds directory");
}
installer.install(&config.game.wine.builds, move |update| { // Otherwise download wine
match &update { else {
InstallerUpdate::DownloadingError(err) => { std::thread::spawn(move || {
tracing::error!("Failed to download wine: {err}"); tracing::info!("Installing wine: {}", wine.name);
sender.output(Self::Output::Toast { // Install wine
title: tr("wine-download-error"), match get_installer(&wine.uri, config.launcher.temp.as_ref(), config.launcher.speed_limit) {
description: Some(err.to_string()) Ok(mut installer) => {
}); // Create wine builds folder
} if config.game.wine.builds.exists() {
std::fs::create_dir_all(&config.game.wine.builds)
InstallerUpdate::UnpackingError(err) => { .expect("Failed to create wine builds directory");
tracing::error!("Failed to unpack wine: {err}"); }
sender.output(Self::Output::Toast { installer.install(&config.game.wine.builds, move |update| {
title: tr("wine-unpack-errror"), match &update {
description: Some(err.clone()) InstallerUpdate::DownloadingError(err) => {
}); tracing::error!("Failed to download wine: {err}");
}
// Create prefix
InstallerUpdate::UnpackingFinished => {
let mut config = config::get().unwrap_or_default();
config.game.wine.selected = Some(wine.name.clone());
if let Err(err) = config::update_raw(config) {
sender.output(Self::Output::Toast { sender.output(Self::Output::Toast {
title: tr("config-update-error"), title: tr("wine-download-error"),
description: Some(err.to_string()) description: Some(err.to_string())
}); });
} }
sender.input(DownloadComponentsAppMsg::CreatePrefix); InstallerUpdate::UnpackingError(err) => {
}, tracing::error!("Failed to unpack wine: {err}");
_ => () sender.output(Self::Output::Toast {
} title: tr("wine-unpack-errror"),
description: Some(err.clone())
progress_bar_input.send(ProgressBarMsg::UpdateFromState(update)); });
}); }
// Create prefix
InstallerUpdate::UnpackingFinished => {
let mut config = config::get().unwrap_or_default();
config.game.wine.selected = Some(wine.name.clone());
if let Err(err) = config::update_raw(config) {
sender.output(Self::Output::Toast {
title: tr("config-update-error"),
description: Some(err.to_string())
});
}
sender.input(DownloadComponentsAppMsg::CreatePrefix);
},
_ => ()
}
progress_bar_input.send(ProgressBarMsg::UpdateFromState(update));
});
}
Err(err) => {
tracing::error!("Failed to initialize wine installer: {err}");
sender.output(Self::Output::Toast {
title: tr("wine-install-failed"),
description: Some(err.to_string())
});
}
} }
});
Err(err) => { }
tracing::error!("Failed to initialize wine installer: {err}");
sender.output(Self::Output::Toast {
title: tr("wine-install-failed"),
description: Some(err.to_string())
});
}
}
});
} }
#[allow(unused_must_use)] #[allow(unused_must_use)]
@ -455,63 +465,71 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
let dxvk = self.selected_dxvk.clone().unwrap(); let dxvk = self.selected_dxvk.clone().unwrap();
let progress_bar_input = self.progress_bar.sender().clone(); let progress_bar_input = self.progress_bar.sender().clone();
std::thread::spawn(move || { if dxvk.is_downloaded_in(&config.game.dxvk.builds) {
// Install DXVK tracing::info!("DXVK is already downloaded: {}", dxvk.name);
tracing::info!("Installing DXVK");
match get_installer(&dxvk.uri, config.launcher.temp.as_ref(), config.launcher.speed_limit) { sender.input(DownloadComponentsAppMsg::ApplyDXVK);
Ok(mut installer) => { }
let progress_bar_input = progress_bar_input.clone();
let sender = sender.clone();
// Create DXVK builds folder else {
if config.game.dxvk.builds.exists() { std::thread::spawn(move || {
std::fs::create_dir_all(&config.game.dxvk.builds) // Install DXVK
.expect("Failed to create DXVK builds directory"); tracing::info!("Installing DXVK: {}", dxvk.name);
}
match get_installer(&dxvk.uri, config.launcher.temp.as_ref(), config.launcher.speed_limit) {
installer.install(&config.game.dxvk.builds, move |update| { Ok(mut installer) => {
match &update { let progress_bar_input = progress_bar_input.clone();
InstallerUpdate::DownloadingError(err) => { let sender = sender.clone();
tracing::error!("Failed to download dxvk: {err}");
// Create DXVK builds folder
sender.output(Self::Output::Toast { if config.game.dxvk.builds.exists() {
title: tr("dxvk-download-error"), std::fs::create_dir_all(&config.game.dxvk.builds)
description: Some(err.to_string()) .expect("Failed to create DXVK builds directory");
});
}
InstallerUpdate::UnpackingError(err) => {
tracing::error!("Failed to unpack dxvk: {err}");
sender.output(Self::Output::Toast {
title: tr("dxvk-unpack-error"),
description: Some(err.clone())
});
}
// Apply DXVK
InstallerUpdate::UnpackingFinished => {
sender.input(DownloadComponentsAppMsg::ApplyDXVK);
}
_ => ()
} }
progress_bar_input.send(ProgressBarMsg::UpdateFromState(update)); installer.install(&config.game.dxvk.builds, move |update| {
}); match &update {
InstallerUpdate::DownloadingError(err) => {
tracing::error!("Failed to download dxvk: {err}");
sender.output(Self::Output::Toast {
title: tr("dxvk-download-error"),
description: Some(err.to_string())
});
}
InstallerUpdate::UnpackingError(err) => {
tracing::error!("Failed to unpack dxvk: {err}");
sender.output(Self::Output::Toast {
title: tr("dxvk-unpack-error"),
description: Some(err.clone())
});
}
// Apply DXVK
InstallerUpdate::UnpackingFinished => {
sender.input(DownloadComponentsAppMsg::ApplyDXVK);
}
_ => ()
}
progress_bar_input.send(ProgressBarMsg::UpdateFromState(update));
});
}
Err(err) => {
tracing::error!("Failed to initialize dxvk installer: {err}");
sender.output(Self::Output::Toast {
title: tr("dxvk-install-failed"),
description: Some(err.to_string())
});
}
} }
});
Err(err) => { }
tracing::error!("Failed to initialize dxvk installer: {err}");
sender.output(Self::Output::Toast {
title: tr("dxvk-install-failed"),
description: Some(err.to_string())
});
}
}
});
} }
#[allow(unused_must_use)] #[allow(unused_must_use)]