From 6bfc6996e12ba201f52de586c67f3db4a97bc722 Mon Sep 17 00:00:00 2001 From: GeckoEidechse <40122905+GeckoEidechse@users.noreply.github.com> Date: Wed, 4 Jan 2023 19:12:53 +0100 Subject: feat: Show newest version number (#124) * refactor: Move getting new FC version to own func * refactor: Deserialize into object * refactor: Return whole object instead of 2 strings More readable * refactor: Rename variable * refactor: Use fields of object directly instead of assigning to variables first * feat: Expose backend func to get newest FC version and then call it to get newest version number if current is outdated. This way we can display to the user how far behind their currently installed version is. --- src-tauri/src/github/release_notes.rs | 38 +++++++++++++++++--------------- src-tauri/src/main.rs | 5 ++++- src-vue/src/plugins/store.ts | 4 +++- src-vue/src/utils/FlightCoreVersion.d.ts | 5 +++++ 4 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 src-vue/src/utils/FlightCoreVersion.d.ts diff --git a/src-tauri/src/github/release_notes.rs b/src-tauri/src/github/release_notes.rs index 803132e2..a1d174fa 100644 --- a/src-tauri/src/github/release_notes.rs +++ b/src-tauri/src/github/release_notes.rs @@ -8,6 +8,12 @@ pub struct ReleaseInfo { pub body: String, } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FlightCoreVersion { + tag_name: String, + published_at: String, +} + // Fetches repo release API and returns response as string async fn fetch_github_releases_api(url: &str) -> Result { println!("Fetching releases notes from GitHub API"); @@ -27,24 +33,26 @@ async fn fetch_github_releases_api(url: &str) -> Result { Ok(res) } -/// Checks if installed FlightCore version is up-to-date -/// false -> FlightCore install is up-to-date -/// true -> FlightCore install is outdated -pub async fn check_is_flightcore_outdated() -> Result { +/// Gets newest FlighCore version from GitHub +#[tauri::command] +pub async fn get_newest_flightcore_version() -> Result { // Get newest version number from GitHub API println!("Checking GitHub API"); let url = "https://api.github.com/repos/R2NorthstarTools/FlightCore/releases/latest"; let res = fetch_github_releases_api(url).await?; - let json_response: serde_json::Value = + let flightcore_version: FlightCoreVersion = serde_json::from_str(&res).expect("JSON was not well-formatted"); println!("Done checking GitHub API"); - // Extract version number from JSON - let newest_release_version = json_response - .get("tag_name") - .and_then(|value| value.as_str()) - .unwrap(); + Ok(flightcore_version) +} + +/// Checks if installed FlightCore version is up-to-date +/// false -> FlightCore install is up-to-date +/// true -> FlightCore install is outdated +pub async fn check_is_flightcore_outdated() -> Result { + let newest_flightcore_release = get_newest_flightcore_version().await?; // Get version of installed FlightCore... let version = env!("CARGO_PKG_VERSION"); @@ -52,16 +60,10 @@ pub async fn check_is_flightcore_outdated() -> Result { let version = format!("v{}", version); // TODO: This shouldn't be a string compare but promper semver compare - let is_outdated = version != newest_release_version; + let is_outdated = version != newest_flightcore_release.tag_name; // If outdated, check how new the update is if is_outdated { - // Extract release date from JSON - let release_date = json_response - .get("published_at") - .and_then(|value| value.as_str()) - .unwrap(); - // Time to wait (2h) h * m * s let threshold_seconds = 2 * 60 * 60; @@ -69,7 +71,7 @@ pub async fn check_is_flightcore_outdated() -> Result { let current_time = chrono::Utc::now(); // Get latest release time from GitHub API response - let result = chrono::DateTime::parse_from_rfc3339(release_date) + let result = chrono::DateTime::parse_from_rfc3339(&newest_flightcore_release.published_at) .unwrap() .with_timezone(&chrono::Utc); diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index e8912d60..7d08e72e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -12,7 +12,9 @@ use std::{ use app::*; mod github; -use github::release_notes::{check_is_flightcore_outdated, get_northstar_release_notes}; +use github::release_notes::{ + check_is_flightcore_outdated, get_newest_flightcore_version, get_northstar_release_notes, +}; mod repair_and_verify; use repair_and_verify::{ @@ -101,6 +103,7 @@ fn main() { get_installed_mods_caller, install_mod_caller, clean_up_download_folder_caller, + get_newest_flightcore_version, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src-vue/src/plugins/store.ts b/src-vue/src/plugins/store.ts index c22479e0..3db85e64 100644 --- a/src-vue/src/plugins/store.ts +++ b/src-vue/src/plugins/store.ts @@ -5,6 +5,7 @@ import { InstallType } from "../utils/InstallType"; import { invoke } from "@tauri-apps/api"; import { GameInstall } from "../utils/GameInstall"; import { ReleaseCanal } from "../utils/ReleaseCanal"; +import { FlightCoreVersion } from "../utils/FlightCoreVersion"; import { ElNotification, NotificationHandle } from 'element-plus'; import { NorthstarState } from '../utils/NorthstarState'; import { appDir } from '@tauri-apps/api/path'; @@ -377,9 +378,10 @@ async function _checkForFlightCoreUpdates(state: FlightCoreStore) { let flightcore_is_outdated = await invoke("check_is_flightcore_outdated_caller") as boolean; if (flightcore_is_outdated) { + let newest_flightcore_version = await invoke("get_newest_flightcore_version") as FlightCoreVersion; ElNotification({ title: 'FlightCore outdated!', - message: `Please update FlightCore. Running outdated version ${state.flightcore_version}`, + message: `Please update FlightCore.\nRunning outdated version ${state.flightcore_version}.\nNewest is ${newest_flightcore_version.tag_name}!`, type: 'warning', position: 'bottom-right', duration: 0 // Duration `0` means the notification will not auto-vanish diff --git a/src-vue/src/utils/FlightCoreVersion.d.ts b/src-vue/src/utils/FlightCoreVersion.d.ts new file mode 100644 index 00000000..2516bf25 --- /dev/null +++ b/src-vue/src/utils/FlightCoreVersion.d.ts @@ -0,0 +1,5 @@ +// derived from release_notes.rs +export interface FlightCoreVersion { + tag_name: string, + published_at: string, +} -- cgit v1.2.3