Analytics + more bug fixes (#144)

* Analytics + more bug fixes

* debug deadlock

* Fix mostly everything

* merge fixes

* fix rest

* final fixeS
This commit is contained in:
Geometrically
2023-06-19 14:59:06 -07:00
committed by GitHub
parent 84d731b670
commit 1e78a7b6a8
51 changed files with 1285 additions and 491 deletions

View File

@@ -5,8 +5,7 @@ use tokio::fs::read_to_string;
#[derive(Serialize, Deserialize, Debug)]
pub struct Logs {
pub datetime_string: String,
pub stdout: Option<String>,
pub stderr: Option<String>,
pub output: Option<String>,
}
impl Logs {
async fn build(
@@ -15,19 +14,11 @@ impl Logs {
clear_contents: Option<bool>,
) -> crate::Result<Self> {
Ok(Self {
stdout: if clear_contents.unwrap_or(false) {
output: if clear_contents.unwrap_or(false) {
None
} else {
Some(
get_stdout_by_datetime(profile_uuid, &datetime_string)
.await?,
)
},
stderr: if clear_contents.unwrap_or(false) {
None
} else {
Some(
get_stderr_by_datetime(profile_uuid, &datetime_string)
get_output_by_datetime(profile_uuid, &datetime_string)
.await?,
)
},
@@ -74,18 +65,15 @@ pub async fn get_logs_by_datetime(
datetime_string: String,
) -> crate::Result<Logs> {
Ok(Logs {
stdout: Some(
get_stdout_by_datetime(profile_uuid, &datetime_string).await?,
),
stderr: Some(
get_stderr_by_datetime(profile_uuid, &datetime_string).await?,
output: Some(
get_output_by_datetime(profile_uuid, &datetime_string).await?,
),
datetime_string,
})
}
#[tracing::instrument]
pub async fn get_stdout_by_datetime(
pub async fn get_output_by_datetime(
profile_uuid: uuid::Uuid,
datetime_string: &str,
) -> crate::Result<String> {
@@ -97,19 +85,6 @@ pub async fn get_stdout_by_datetime(
)
}
#[tracing::instrument]
pub async fn get_stderr_by_datetime(
profile_uuid: uuid::Uuid,
datetime_string: &str,
) -> crate::Result<String> {
let state = State::get().await?;
let logs_folder = state.directories.profile_logs_dir(profile_uuid);
Ok(
read_to_string(logs_folder.join(datetime_string).join("stderr.log"))
.await?,
)
}
#[tracing::instrument]
pub async fn delete_logs(profile_uuid: uuid::Uuid) -> crate::Result<()> {
let state = State::get().await?;

View File

@@ -335,7 +335,6 @@ async fn install_pack(
async { Ok(()) }
})
.await?;
State::sync().await?;
let profile = profile.clone();
let result = async {
@@ -487,6 +486,8 @@ async fn install_pack(
Some(loading_bar),
)
.await?;
State::sync().await?;
}
Ok::<PathBuf, crate::Error>(profile.clone())

View File

@@ -69,9 +69,9 @@ pub async fn get_uuids_by_profile_path(
children.running_keys_with_profile(profile_path).await
}
// Gets stdout of a child process stored in the state by UUID, as a string
// Gets output of a child process stored in the state by UUID, as a string
#[tracing::instrument]
pub async fn get_stdout_by_uuid(uuid: &Uuid) -> crate::Result<String> {
pub async fn get_output_by_uuid(uuid: &Uuid) -> crate::Result<String> {
let state = State::get().await?;
// Get stdout from child
let children = state.children.read().await;
@@ -79,7 +79,7 @@ pub async fn get_stdout_by_uuid(uuid: &Uuid) -> crate::Result<String> {
// Extract child or return crate::Error
if let Some(child) = children.get(uuid) {
let child = child.read().await;
Ok(child.stdout.get_output().await?)
Ok(child.output.get_output().await?)
} else {
Err(crate::ErrorKind::LauncherError(format!(
"No child process by UUID {}",
@@ -89,26 +89,6 @@ pub async fn get_stdout_by_uuid(uuid: &Uuid) -> crate::Result<String> {
}
}
// Gets stderr of a child process stored in the state by UUID, as a string
#[tracing::instrument]
pub async fn get_stderr_by_uuid(uuid: &Uuid) -> crate::Result<String> {
let state = State::get().await?;
// Get stdout from child
let children = state.children.read().await;
// Extract child or return crate::Error
if let Some(child) = children.get(uuid) {
let child = child.read().await;
Ok(child.stderr.get_output().await?)
} else {
Err(crate::ErrorKind::LauncherError(format!(
"No child process with UUID {}",
uuid
))
.as_error())
}
}
// Kill a child process stored in the state by UUID, as a string
#[tracing::instrument]
pub async fn kill_by_uuid(uuid: &Uuid) -> crate::Result<()> {
@@ -150,7 +130,7 @@ pub async fn kill(running: &mut MinecraftChild) -> crate::Result<()> {
pub async fn wait_for(running: &mut MinecraftChild) -> crate::Result<()> {
// We do not wait on the Child directly, but wait on the thread manager.
// This way we can still run all cleanup hook functions that happen after.
let result = running
running
.manager
.take()
.ok_or_else(|| {
@@ -166,12 +146,5 @@ pub async fn wait_for(running: &mut MinecraftChild) -> crate::Result<()> {
))
})?;
match result.success() {
false => Err(crate::ErrorKind::LauncherError(format!(
"Minecraft exited with non-zero code {}",
result.code().unwrap_or(-1)
))
.as_error()),
true => Ok(()),
}
Ok(())
}

View File

@@ -120,6 +120,7 @@ pub async fn edit_icon(
ProfilePayloadType::Edited,
)
.await?;
State::sync().await?;
Ok(())
}
@@ -133,7 +134,10 @@ pub async fn edit_icon(
profile.metadata.icon = None;
async { Ok(()) }
})
.await
.await?;
State::sync().await?;
Ok(())
}
}
@@ -288,6 +292,7 @@ pub async fn update_all(
ProfilePayloadType::Edited,
)
.await?;
State::sync().await?;
Ok(Arc::try_unwrap(map).unwrap().into_inner())
} else {
@@ -344,6 +349,7 @@ pub async fn update_project(
ProfilePayloadType::Edited,
)
.await?;
State::sync().await?;
}
return Ok(path);
@@ -378,6 +384,7 @@ pub async fn add_project_from_version(
ProfilePayloadType::Edited,
)
.await?;
State::sync().await?;
Ok(path)
} else {
@@ -418,6 +425,7 @@ pub async fn add_project_from_path(
ProfilePayloadType::Edited,
)
.await?;
State::sync().await?;
Ok(path)
} else {
@@ -444,6 +452,7 @@ pub async fn toggle_disable_project(
ProfilePayloadType::Edited,
)
.await?;
State::sync().await?;
Ok(res)
} else {
@@ -470,6 +479,7 @@ pub async fn remove_project(
ProfilePayloadType::Edited,
)
.await?;
State::sync().await?;
Ok(())
} else {

View File

@@ -164,7 +164,11 @@ pub(crate) async fn get_loader_version_from_loader(
let filter = |it: &LoaderVersion| match version.as_str() {
"latest" => true,
"stable" => it.stable,
id => it.id == *id || format!("{}-{}", game_version, id) == it.id,
id => {
it.id == *id
|| format!("{}-{}", game_version, id) == it.id
|| format!("{}-{}-{}", game_version, id, game_version) == it.id
}
};
let loader_data = match loader {