From 0801d7a145682f556c2e0f4be1c5d9765712241f Mon Sep 17 00:00:00 2001 From: "Adrian O.V" <83074853+CodexAdrian@users.noreply.github.com> Date: Wed, 17 May 2023 16:05:20 -0400 Subject: [PATCH] Logs wireup (#116) * wireup * Added live logs * Finish up wireup * Run linter * finish most * Fix most issues * Finish page * run lint --------- Co-authored-by: Jai A Co-authored-by: Geometrically <18202329+Geometrically@users.noreply.github.com> --- theseus/src/api/jre.rs | 156 ++++++------ theseus/src/api/logs.rs | 66 +++-- theseus/src/util/jre.rs | 29 ++- theseus_gui/package.json | 2 +- theseus_gui/src-tauri/src/api/logs.rs | 13 +- .../src/assets/stylesheets/global.scss | 4 + theseus_gui/src/helpers/logs.js | 4 +- theseus_gui/src/pages/instance/Index.vue | 17 +- theseus_gui/src/pages/instance/Logs.vue | 229 ++++++++++++------ theseus_gui/yarn.lock | 8 +- 10 files changed, 336 insertions(+), 192 deletions(-) diff --git a/theseus/src/api/jre.rs b/theseus/src/api/jre.rs index 1d5316a7..f4bb9a1e 100644 --- a/theseus/src/api/jre.rs +++ b/theseus/src/api/jre.rs @@ -138,84 +138,88 @@ pub async fn find_java17_jres() -> crate::Result> { } pub async fn auto_install_java(java_version: u32) -> crate::Result { - let state = State::get().await?; + Box::pin( + async move { + let state = State::get().await?; - let loading_bar = init_loading( - LoadingBarType::JavaDownload { - version: java_version, - }, - 100.0, - "Downloading java version", - ) - .await?; - - #[derive(Deserialize)] - struct Package { - pub download_url: String, - pub name: PathBuf, - } - - emit_loading(&loading_bar, 0.0, Some("Fetching java version")).await?; - let packages = fetch_json::>( - Method::GET, - &format!( - "https://api.azul.com/metadata/v1/zulu/packages?arch={}&java_version={}&os={}&archive_type=zip&javafx_bundled=false&java_package_type=jre&page_size=1", - std::env::consts::ARCH, java_version, std::env::consts::OS - ), - None, - None, - &state.fetch_semaphore, - ).await?; - emit_loading(&loading_bar, 10.0, Some("Downloading java version")).await?; - - if let Some(download) = packages.first() { - let file = fetch_advanced( - Method::GET, - &download.download_url, - None, - None, - None, - Some((&loading_bar, 80.0)), - &state.fetch_semaphore, - ) - .await?; - - let path = state.directories.java_versions_dir(); - - if path.exists() { - tokio::fs::remove_dir_all(&path).await?; - } - - let mut archive = zip::ZipArchive::new(std::io::Cursor::new(file)) - .map_err(|_| { - crate::Error::from(crate::ErrorKind::InputError( - "Failed to read java zip".to_string(), - )) - })?; - - emit_loading(&loading_bar, 0.0, Some("Extracting java")).await?; - archive.extract(&path).map_err(|_| { - crate::Error::from(crate::ErrorKind::InputError( - "Failed to extract java zip".to_string(), - )) - })?; - emit_loading(&loading_bar, 100.0, Some("Done extracting java")).await?; - Ok(path - .join( - download - .name - .file_stem() - .unwrap_or_default() - .to_string_lossy() - .to_string(), + let loading_bar = init_loading( + LoadingBarType::JavaDownload { + version: java_version, + }, + 100.0, + "Downloading java version", ) - .join(format!("zulu-{}.jre/Contents/Home/bin/java", java_version))) - } else { - Err(crate::ErrorKind::LauncherError(format!( - "No Java Version found for Java version {}, OS {}, and Architecture {}", - java_version, std::env::consts::OS, std::env::consts::ARCH, - )).into()) - } + .await?; + + #[derive(Deserialize)] + struct Package { + pub download_url: String, + pub name: PathBuf, + } + + emit_loading(&loading_bar, 0.0, Some("Fetching java version")).await?; + let packages = fetch_json::>( + Method::GET, + &format!( + "https://api.azul.com/metadata/v1/zulu/packages?arch={}&java_version={}&os={}&archive_type=zip&javafx_bundled=false&java_package_type=jre&page_size=1", + std::env::consts::ARCH, java_version, std::env::consts::OS + ), + None, + None, + &state.fetch_semaphore, + ).await?; + emit_loading(&loading_bar, 10.0, Some("Downloading java version")).await?; + + if let Some(download) = packages.first() { + let file = fetch_advanced( + Method::GET, + &download.download_url, + None, + None, + None, + Some((&loading_bar, 80.0)), + &state.fetch_semaphore, + ) + .await?; + + let path = state.directories.java_versions_dir(); + + if path.exists() { + tokio::fs::remove_dir_all(&path).await?; + } + + let mut archive = zip::ZipArchive::new(std::io::Cursor::new(file)) + .map_err(|_| { + crate::Error::from(crate::ErrorKind::InputError( + "Failed to read java zip".to_string(), + )) + })?; + + emit_loading(&loading_bar, 0.0, Some("Extracting java")).await?; + archive.extract(&path).map_err(|_| { + crate::Error::from(crate::ErrorKind::InputError( + "Failed to extract java zip".to_string(), + )) + })?; + emit_loading(&loading_bar, 100.0, Some("Done extracting java")).await?; + Ok(path + .join( + download + .name + .file_stem() + .unwrap_or_default() + .to_string_lossy() + .to_string(), + ) + .join(format!("zulu-{}.jre/Contents/Home/bin/java", java_version))) + } else { + Err(crate::ErrorKind::LauncherError(format!( + "No Java Version found for Java version {}, OS {}, and Architecture {}", + java_version, std::env::consts::OS, std::env::consts::ARCH, + )).into()) + } + } + ).await } // Get all JREs that exist on the system diff --git a/theseus/src/api/logs.rs b/theseus/src/api/logs.rs index 536b5bd1..faa8fc22 100644 --- a/theseus/src/api/logs.rs +++ b/theseus/src/api/logs.rs @@ -5,44 +5,64 @@ use tokio::fs::read_to_string; #[derive(Serialize, Deserialize, Debug)] pub struct Logs { pub datetime_string: String, - pub stdout: String, - pub stderr: String, + pub stdout: Option, + pub stderr: Option, } impl Logs { async fn build( profile_uuid: uuid::Uuid, datetime_string: String, + clear_contents: Option, ) -> crate::Result { Ok(Self { - stdout: get_stdout_by_datetime(profile_uuid, &datetime_string) - .await?, - stderr: get_stderr_by_datetime(profile_uuid, &datetime_string) - .await?, + stdout: 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) + .await?, + ) + }, datetime_string, }) } } #[tracing::instrument] -pub async fn get_logs(profile_uuid: uuid::Uuid) -> crate::Result> { +pub async fn get_logs( + profile_uuid: uuid::Uuid, + clear_contents: Option, +) -> crate::Result> { let state = State::get().await?; let logs_folder = state.directories.profile_logs_dir(profile_uuid); let mut logs = Vec::new(); - for entry in std::fs::read_dir(logs_folder)? { - let entry = entry?; - let path = entry.path(); - if path.is_dir() { - if let Some(datetime_string) = path.file_name() { - logs.push( - Logs::build( - profile_uuid, - datetime_string.to_string_lossy().to_string(), - ) - .await, - ); + if logs_folder.exists() { + for entry in std::fs::read_dir(logs_folder)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() { + if let Some(datetime_string) = path.file_name() { + logs.push( + Logs::build( + profile_uuid, + datetime_string.to_string_lossy().to_string(), + clear_contents, + ) + .await, + ); + } } } } + let mut logs = logs.into_iter().collect::>>()?; logs.sort_by_key(|x| x.datetime_string.clone()); Ok(logs) @@ -54,8 +74,12 @@ pub async fn get_logs_by_datetime( datetime_string: String, ) -> crate::Result { Ok(Logs { - stdout: get_stdout_by_datetime(profile_uuid, &datetime_string).await?, - stderr: get_stderr_by_datetime(profile_uuid, &datetime_string).await?, + stdout: Some( + get_stdout_by_datetime(profile_uuid, &datetime_string).await?, + ), + stderr: Some( + get_stderr_by_datetime(profile_uuid, &datetime_string).await?, + ), datetime_string, }) } diff --git a/theseus/src/util/jre.rs b/theseus/src/util/jre.rs index 8bdf86b6..7bfa5ace 100644 --- a/theseus/src/util/jre.rs +++ b/theseus/src/util/jre.rs @@ -187,24 +187,27 @@ pub async fn get_all_jre() -> Result, JREError> { #[tracing::instrument] async fn get_all_autoinstalled_jre_path() -> Result, JREError> { - let state = State::get().await.map_err(|_| JREError::StateError)?; + Box::pin(async move { + let state = State::get().await.map_err(|_| JREError::StateError)?; - let mut jre_paths = HashSet::new(); - let base_path = state.directories.java_versions_dir(); + let mut jre_paths = HashSet::new(); + let base_path = state.directories.java_versions_dir(); - if base_path.is_dir() { - for entry in std::fs::read_dir(base_path)? { - let entry = entry?; - let file_path = entry.path().join("bin"); - let contents = std::fs::read_to_string(file_path)?; + if base_path.is_dir() { + for entry in std::fs::read_dir(base_path)? { + let entry = entry?; + let file_path = entry.path().join("bin"); + let contents = std::fs::read_to_string(file_path)?; - let entry = entry.path().join(contents); - println!("{:?}", entry); - jre_paths.insert(entry); + let entry = entry.path().join(contents); + println!("{:?}", entry); + jre_paths.insert(entry); + } } - } - Ok(jre_paths) + Ok(jre_paths) + }) + .await } // Gets all JREs from the PATH env variable diff --git a/theseus_gui/package.json b/theseus_gui/package.json index ec752c1d..a0946cef 100644 --- a/theseus_gui/package.json +++ b/theseus_gui/package.json @@ -15,7 +15,7 @@ "dependencies": { "@tauri-apps/api": "^1.2.0", "ofetch": "^1.0.1", - "omorphia": "^0.4.10", + "omorphia": "^0.4.13", "pinia": "^2.0.33", "vite-svg-loader": "^4.0.0", "vue": "^3.2.45", diff --git a/theseus_gui/src-tauri/src/api/logs.rs b/theseus_gui/src-tauri/src/api/logs.rs index 22bfb337..8e038a59 100644 --- a/theseus_gui/src-tauri/src/api/logs.rs +++ b/theseus_gui/src-tauri/src/api/logs.rs @@ -14,8 +14,17 @@ pub struct Logs { /// Get all Logs for a profile, sorted by datetime #[tauri::command] -pub async fn logs_get_logs(profile_uuid: Uuid) -> Result> { - Ok(logs::get_logs(profile_uuid).await?) +pub async fn logs_get_logs( + profile_uuid: Uuid, + clear_contents: Option, +) -> Result> { + use std::time::Instant; + let now = Instant::now(); + let val = logs::get_logs(profile_uuid, clear_contents).await?; + let elapsed = now.elapsed(); + println!("Elapsed: {:.2?}", elapsed); + + Ok(val) } /// Get a Log struct for a profile by profile id and datetime string diff --git a/theseus_gui/src/assets/stylesheets/global.scss b/theseus_gui/src/assets/stylesheets/global.scss index 2faf54d7..da400e8d 100644 --- a/theseus_gui/src/assets/stylesheets/global.scss +++ b/theseus_gui/src/assets/stylesheets/global.scss @@ -40,6 +40,10 @@ a { } } +input { + border: none; +} + .multiselect { color: var(--color-base) !important; outline: 2px solid transparent; diff --git a/theseus_gui/src/helpers/logs.js b/theseus_gui/src/helpers/logs.js index ddff16a7..e3a71d3f 100644 --- a/theseus_gui/src/helpers/logs.js +++ b/theseus_gui/src/helpers/logs.js @@ -17,8 +17,8 @@ pub struct Logs { /// Get all logs that exist for a given profile /// This is returned as an array of Log objects, sorted by datetime_string (the folder name, when the log was created) -export async function get_logs(profileUuid) { - return await invoke('logs_get_logs', { profileUuid }) +export async function get_logs(profileUuid, clearContents) { + return await invoke('logs_get_logs', { profileUuid, clearContents }) } /// Get a profile's log by datetime_string (the folder name, when the log was created) diff --git a/theseus_gui/src/pages/instance/Index.vue b/theseus_gui/src/pages/instance/Index.vue index 8939a728..9c46a49d 100644 --- a/theseus_gui/src/pages/instance/Index.vue +++ b/theseus_gui/src/pages/instance/Index.vue @@ -63,7 +63,13 @@
- + + +
@@ -81,7 +87,7 @@ import { useRoute } from 'vue-router' import { ref, onUnmounted } from 'vue' import { convertFileSrc } from '@tauri-apps/api/tauri' import { open } from '@tauri-apps/api/dialog' -import { useBreadcrumbs, useSearch } from '@/store/state' +import { useBreadcrumbs, useLoading, useSearch } from '@/store/state' const route = useRoute() const searchStore = useSearch() @@ -96,6 +102,8 @@ breadcrumbs.setContext({ link: route.path, }) +const loadingBar = useLoading() + const uuid = ref(null) const playing = ref(false) const loading = ref(false) @@ -240,15 +248,18 @@ Button { width: 100%; color: var(--color-primary); padding: var(--gap-md); + box-shadow: none; &.router-link-exact-active { + box-shadow: var(--shadow-inset-lg); background: var(--color-button-bg); + color: var(--color-contrast); } &:hover { background-color: var(--color-button-bg); color: var(--color-contrast); - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + box-shadow: var(--shadow-inset-lg); text-decoration: none; } diff --git a/theseus_gui/src/pages/instance/Logs.vue b/theseus_gui/src/pages/instance/Logs.vue index 35dd3bfc..9c376eb9 100644 --- a/theseus_gui/src/pages/instance/Logs.vue +++ b/theseus_gui/src/pages/instance/Logs.vue @@ -1,92 +1,177 @@ - diff --git a/theseus_gui/yarn.lock b/theseus_gui/yarn.lock index 77f9b2ba..99524bcf 100644 --- a/theseus_gui/yarn.lock +++ b/theseus_gui/yarn.lock @@ -1149,10 +1149,10 @@ ofetch@^1.0.1: node-fetch-native "^1.0.2" ufo "^1.1.0" -omorphia@^0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/omorphia/-/omorphia-0.4.10.tgz#93c0e6a08a233f27d76587286e42450af44bb55d" - integrity sha512-WgSFosOqoM0IRpzGNYyprfZSRyBLgqs6sTmKRuWo96ZpzrHRWAom2upIm/HAxAC+YBwFni5sgUeBemXYI7wmuw== +omorphia@^0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/omorphia/-/omorphia-0.4.13.tgz#6141886b9c332e4a28afe31a743f0c85d4a09efe" + integrity sha512-Yb76WoM4e42aAq3G/OPxQS6whCu+WIHVBhJxSzmUUycF1Pvf6tJZov+LefneSkk4xcQAjDZsgK8VOVD7q/siig== dependencies: dayjs "^1.11.7" floating-vue "^2.0.0-beta.20"