Fix auto updater, add failure message, fix modals (#2335)

* Fix auto updater, add failure message, fix modals

* Fix ads hiding, updater UI

* dummy version, fix gh actions cache

* fix release conf

* actual version bump

* Fix ads hiding sometimes

* Fix event state init

* fix remaining bugs

* Fix lint on linux

* Fix deep linking on Windows

* Fix ad links opening multiple times
This commit is contained in:
Geometrically
2024-08-30 10:42:58 -07:00
committed by GitHub
parent 016c3d779b
commit bd61f5d591
70 changed files with 941 additions and 310 deletions

View File

@@ -68,7 +68,7 @@ pub async fn auto_install_java(java_version: u32) -> crate::Result<PathBuf> {
pub name: PathBuf,
}
emit_loading(&loading_bar, 0.0, Some("Fetching java version")).await?;
emit_loading(&loading_bar, 0.0, Some("Fetching java version"))?;
let packages = fetch_json::<Vec<Package>>(
Method::GET,
&format!(
@@ -80,7 +80,7 @@ pub async fn auto_install_java(java_version: u32) -> crate::Result<PathBuf> {
&state.fetch_semaphore,
&state.pool,
).await?;
emit_loading(&loading_bar, 10.0, Some("Downloading java version")).await?;
emit_loading(&loading_bar, 10.0, Some("Downloading java version"))?;
if let Some(download) = packages.first() {
let file = fetch_advanced(
@@ -115,13 +115,13 @@ pub async fn auto_install_java(java_version: u32) -> crate::Result<PathBuf> {
}
}
emit_loading(&loading_bar, 0.0, Some("Extracting java")).await?;
emit_loading(&loading_bar, 0.0, Some("Extracting java"))?;
archive.extract(&path).map_err(|_| {
crate::Error::from(crate::ErrorKind::InputError(
"Failed to extract java zip".to_string(),
))
})?;
emit_loading(&loading_bar, 10.0, Some("Done extracting java")).await?;
emit_loading(&loading_bar, 10.0, Some("Done extracting java"))?;
let mut base_path = path.join(
download
.name

View File

@@ -287,7 +287,7 @@ pub async fn copy_dotminecraft(
fetch::copy(&src_child, &dst_child, io_semaphore).await?;
emit_loading(&loading_bar, 1.0, None).await?;
emit_loading(&loading_bar, 1.0, None)?;
}
Ok(loading_bar)
}

View File

@@ -191,7 +191,7 @@ pub async fn generate_pack_from_version_id(
let state = State::get().await?;
let loading_bar = if let Some(bar) = initialized_loading_bar {
emit_loading(&bar, 0.0, Some("Downloading pack file")).await?;
emit_loading(&bar, 0.0, Some("Downloading pack file"))?;
bar
} else {
init_loading(
@@ -207,7 +207,7 @@ pub async fn generate_pack_from_version_id(
.await?
};
emit_loading(&loading_bar, 0.0, Some("Fetching version")).await?;
emit_loading(&loading_bar, 0.0, Some("Fetching version"))?;
let version = CachedEntry::get_version(
&version_id,
None,
@@ -220,7 +220,7 @@ pub async fn generate_pack_from_version_id(
"Invalid version ID specified!".to_string(),
)
})?;
emit_loading(&loading_bar, 10.0, None).await?;
emit_loading(&loading_bar, 10.0, None)?;
let (url, hash) =
if let Some(file) = version.files.iter().find(|x| x.primary) {
@@ -248,7 +248,7 @@ pub async fn generate_pack_from_version_id(
&state.pool,
)
.await?;
emit_loading(&loading_bar, 0.0, Some("Fetching project metadata")).await?;
emit_loading(&loading_bar, 0.0, Some("Fetching project metadata"))?;
let project = CachedEntry::get_project(
&version.project_id,
@@ -263,7 +263,7 @@ pub async fn generate_pack_from_version_id(
)
})?;
emit_loading(&loading_bar, 10.0, Some("Retrieving icon")).await?;
emit_loading(&loading_bar, 10.0, Some("Retrieving icon"))?;
let icon = if let Some(icon_url) = project.icon_url {
let state = State::get().await?;
let icon_bytes =
@@ -287,7 +287,7 @@ pub async fn generate_pack_from_version_id(
} else {
None
};
emit_loading(&loading_bar, 10.0, None).await?;
emit_loading(&loading_bar, 10.0, None)?;
Ok(CreatePack {
file,

View File

@@ -203,7 +203,7 @@ pub async fn install_zipped_mrpack_files(
)
.await?;
emit_loading(&loading_bar, 0.0, Some("Extracting overrides")).await?;
emit_loading(&loading_bar, 0.0, Some("Extracting overrides"))?;
let mut total_len = 0;
@@ -270,8 +270,7 @@ pub async fn install_zipped_mrpack_files(
"Extracting override {}/{}",
index, total_len
)),
)
.await?;
)?;
}
}

View File

@@ -510,7 +510,7 @@ pub async fn export_mrpack(
// Iterate over every file in the folder
// Every file that is NOT in the config file is added to the zip, in overrides
for path in path_list {
emit_loading(&loading_bar, 1.0, None).await?;
emit_loading(&loading_bar, 1.0, None)?;
let relative_path = pack_get_relative_path(&profile_base_path, &path)?;

View File

@@ -33,7 +33,7 @@ const CLI_PROGRESS_BAR_TOTAL: u64 = 1000;
pub async fn loading_function() -> crate::Result<()> {
let loading_bar = init_loading(LoadingBarType::StateInit, 100.0, "Loading something long...").await;
for i in 0..100 {
emit_loading(&loading_bar, 1.0, None).await?;
emit_loading(&loading_bar, 1.0, None)?;
tokio::time::sleep(Duration::from_millis(100)).await;
}
}
@@ -62,7 +62,7 @@ pub async fn init_loading_unsafe(
total: f64,
title: &str,
) -> crate::Result<LoadingBarId> {
let event_state = crate::EventState::get().await?;
let event_state = crate::EventState::get()?;
let key = LoadingBarId(Uuid::new_v4());
event_state.loading_bars.insert(
@@ -91,7 +91,7 @@ pub async fn init_loading_unsafe(
},
);
// attempt an initial loading_emit event to the frontend
emit_loading(&key, 0.0, None).await?;
emit_loading(&key, 0.0, None)?;
Ok(key)
}
@@ -118,7 +118,7 @@ pub async fn edit_loading(
total: f64,
title: &str,
) -> crate::Result<()> {
let event_state = crate::EventState::get().await?;
let event_state = crate::EventState::get()?;
if let Some(mut bar) = event_state.loading_bars.get_mut(&id.0) {
bar.bar_type = bar_type;
@@ -132,7 +132,7 @@ pub async fn edit_loading(
}
};
emit_loading(id, 0.0, None).await?;
emit_loading(id, 0.0, None)?;
Ok(())
}
@@ -144,12 +144,12 @@ pub async fn edit_loading(
#[allow(unused_variables)]
#[tracing::instrument(level = "debug")]
pub async fn emit_loading(
pub fn emit_loading(
key: &LoadingBarId,
increment_frac: f64,
message: Option<&str>,
) -> crate::Result<()> {
let event_state = crate::EventState::get().await?;
let event_state = crate::EventState::get()?;
let mut loading_bar = match event_state.loading_bars.get_mut(&key.0) {
Some(f) => f,
@@ -211,7 +211,7 @@ pub async fn emit_loading(
pub async fn emit_warning(message: &str) -> crate::Result<()> {
#[cfg(feature = "tauri")]
{
let event_state = crate::EventState::get().await?;
let event_state = crate::EventState::get()?;
event_state
.app
.emit(
@@ -235,7 +235,7 @@ pub async fn emit_command(command: CommandPayload) -> crate::Result<()> {
tracing::debug!("Command: {}", serde_json::to_string(&command)?);
#[cfg(feature = "tauri")]
{
let event_state = crate::EventState::get().await?;
let event_state = crate::EventState::get()?;
event_state
.app
.emit("command", command)
@@ -254,7 +254,7 @@ pub async fn emit_process(
) -> crate::Result<()> {
#[cfg(feature = "tauri")]
{
let event_state = crate::EventState::get().await?;
let event_state = crate::EventState::get()?;
event_state
.app
.emit(
@@ -279,7 +279,7 @@ pub async fn emit_profile(
) -> crate::Result<()> {
#[cfg(feature = "tauri")]
{
let event_state = crate::EventState::get().await?;
let event_state = crate::EventState::get()?;
event_state
.app
.emit(
@@ -329,7 +329,7 @@ macro_rules! loading_join {
async move {
let res = $task.await;
if let Some(key) = key {
$crate::event::emit::emit_loading(key, increment, message).await?;
$crate::event::emit::emit_loading(key, increment, message)?;
}
res
}
@@ -376,8 +376,7 @@ where
async move {
f.await?;
if let Some(key) = key {
emit_loading(key, total / (num_futs as f64), message)
.await?;
emit_loading(key, total / (num_futs as f64), message)?;
}
Ok(())
}

View File

@@ -45,21 +45,14 @@ impl EventState {
.cloned()
}
#[cfg(feature = "tauri")]
pub async fn get() -> crate::Result<Arc<Self>> {
pub fn get() -> crate::Result<Arc<Self>> {
Ok(EVENT_STATE.get().ok_or(EventError::NotInitialized)?.clone())
}
// Initialization requires no app handle in non-tauri mode, so we can just use the same function
#[cfg(not(feature = "tauri"))]
pub async fn get() -> crate::Result<Arc<Self>> {
Self::init().await
}
// Values provided should not be used directly, as they are clones and are not guaranteed to be up-to-date
pub async fn list_progress_bars() -> crate::Result<DashMap<Uuid, LoadingBar>>
{
let value = Self::get().await?;
let value = Self::get()?;
Ok(value.loading_bars.clone())
}
@@ -67,7 +60,7 @@ impl EventState {
pub async fn get_main_window() -> crate::Result<Option<tauri::WebviewWindow>>
{
use tauri::Manager;
let value = Self::get().await?;
let value = Self::get()?;
Ok(value.app.get_webview_window("main"))
}
}
@@ -95,7 +88,7 @@ impl Drop for LoadingBarId {
fn drop(&mut self) {
let loader_uuid = self.0;
tokio::spawn(async move {
if let Ok(event_state) = EventState::get().await {
if let Ok(event_state) = EventState::get() {
#[cfg(any(feature = "tauri", feature = "cli"))]
if let Some((_, bar)) =
event_state.loading_bars.remove(&loader_uuid)
@@ -180,6 +173,11 @@ pub enum LoadingBarType {
import_location: PathBuf,
profile_name: String,
},
CheckingForUpdates,
LauncherUpdate {
version: String,
current_version: String,
},
}
#[derive(Serialize, Clone)]

View File

@@ -111,7 +111,7 @@ pub async fn download_version_info(
}?;
if let Some(loading_bar) = loading_bar {
emit_loading(loading_bar, 5.0, None).await?;
emit_loading(loading_bar, 5.0, None)?;
}
tracing::debug!("Loaded version info for Minecraft {version_id}");
@@ -154,7 +154,7 @@ pub async fn download_client(
tracing::trace!("Fetched client version {version}");
}
if let Some(loading_bar) = loading_bar {
emit_loading(loading_bar, 9.0, None).await?;
emit_loading(loading_bar, 9.0, None)?;
}
tracing::debug!("Client loaded for version {version}!");
@@ -196,7 +196,7 @@ pub async fn download_assets_index(
}?;
if let Some(loading_bar) = loading_bar {
emit_loading(loading_bar, 5.0, None).await?;
emit_loading(loading_bar, 5.0, None)?;
}
tracing::debug!("Assets index successfully loaded!");
Ok(res)

View File

@@ -336,8 +336,7 @@ pub async fn install_minecraft(
server => "";
}
emit_loading(&loading_bar, 0.0, Some("Running forge processors"))
.await?;
emit_loading(&loading_bar, 0.0, Some("Running forge processors"))?;
let total_length = processors.len();
// Forge processors (90-100)
@@ -402,8 +401,7 @@ pub async fn install_minecraft(
"Running forge processor {}/{}",
index, total_length
)),
)
.await?;
)?;
}
}
}
@@ -414,7 +412,7 @@ pub async fn install_minecraft(
async { Ok(()) }
})
.await?;
emit_loading(&loading_bar, 1.0, Some("Finished installing")).await?;
emit_loading(&loading_bar, 1.0, Some("Finished installing"))?;
Ok(())
}

View File

@@ -20,6 +20,9 @@ mod state;
pub use api::*;
pub use error::*;
pub use event::{EventState, LoadingBar, LoadingBarType};
pub use event::{
emit::emit_loading, emit::init_loading, EventState, LoadingBar,
LoadingBarType,
};
pub use logger::start_logger;
pub use state::State;

View File

@@ -330,8 +330,7 @@ impl DirectoryInfo {
&loader_bar_id,
10.0 / (MOVE_DIRS.len() as f64),
None,
)
.await?;
)?;
}
let paths_len = paths.len();
@@ -380,8 +379,7 @@ impl DirectoryInfo {
&loader_bar_id,
90.0 / paths_len as f64,
None,
)
.await;
);
success_idxs.insert(idx);
@@ -433,8 +431,7 @@ impl DirectoryInfo {
&loader_bar_id,
((x.size as f64) / (total_size as f64)) * 60.0,
None,
)
.await;
);
Ok::<(), crate::Error>(())
}
@@ -453,8 +450,7 @@ impl DirectoryInfo {
&loader_bar_id,
30.0 / paths_len as f64,
None,
)
.await?;
)?;
Ok::<(), crate::Error>(())
};

View File

@@ -119,7 +119,7 @@ pub(crate) async fn watch_profile(
{
let path = profile_path.join(folder);
if !path.exists() {
if !path.exists() && !path.is_symlink() {
crate::util::io::create_dir_all(&path).await?;
}

View File

@@ -130,8 +130,7 @@ pub async fn fetch_advanced(
(chunk.len() as f64 / total_size as f64)
* total,
None,
)
.await?;
)?;
}
Ok(bytes::Bytes::from(bytes))