From bc415821d67d64c1b664fe314c174a9b6db1ad09 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:02:16 +0100 Subject: [PATCH] check for new version (#273) * check for new version * more --- Cargo.lock | 37 ++++++++++++++++---------------- Cargo.toml | 1 + src/ui/gui.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f6f3215..e2b3317 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -485,9 +485,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.14" +version = "1.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" dependencies = [ "jobserver", "libc", @@ -1500,6 +1500,7 @@ dependencies = [ "rfd", "rusttype", "sdl3-sys", + "semver", "serde", "serde-big-array", "serde_json", @@ -1956,9 +1957,9 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] @@ -2088,7 +2089,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.8.0", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", ] [[package]] @@ -2127,9 +2128,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "lzma-rs" @@ -2691,7 +2692,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", "smallvec", "windows-targets 0.52.6", ] @@ -3030,9 +3031,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ "bitflags 2.8.0", ] @@ -3154,9 +3155,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.9" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" +checksum = "d34b5020fcdea098ef7d95e9f89ec15952123a4a039badd09fabebe9e963e839" dependencies = [ "cc", "cfg-if", @@ -5135,27 +5136,27 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.14+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 204f9b2..5892a8d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ regex = "1.11" tungstenite = "0.26" socket2 = "0.5" fatfs = "0.3" +semver = "1.0" postcard = { version = "1.1", features = ["use-std"] } clap = { version = "4.5", features = ["derive"] } reqwest = { version = "0.12", default-features = false, features = ["http2","rustls-tls","charset","json"] } diff --git a/src/ui/gui.rs b/src/ui/gui.rs index ea848f0..0c9b538 100644 --- a/src/ui/gui.rs +++ b/src/ui/gui.rs @@ -22,9 +22,16 @@ pub struct GopherEguiApp { vru_window_receiver: Option>>, vru_word_notifier: Option>, vru_word_list: Vec, + latest_version: Option, + update_receiver: Option>, pub netplay: gui_netplay::GuiNetplay, } +#[derive(serde::Deserialize)] +struct GithubData { + tag_name: String, +} + struct SaveConfig { selected_controller: [i32; 4], selected_profile: [String; 4], @@ -112,6 +119,8 @@ impl GopherEguiApp { controller_paths, vru_window_receiver: None, vru_word_notifier: None, + latest_version: None, + update_receiver: None, vru_word_list: Vec::new(), netplay: Default::default(), dirs: ui::get_dirs(), @@ -237,6 +246,45 @@ fn show_vru_dialog(app: &mut GopherEguiApp, ctx: &egui::Context) { ); } +fn get_latest_version(app: &mut GopherEguiApp, ctx: &egui::Context) { + if app.update_receiver.is_none() { + let (tx, rx) = tokio::sync::mpsc::channel(1); + app.update_receiver = Some(rx); + let gui_ctx = ctx.clone(); + let client = reqwest::Client::builder() + .user_agent(env!("CARGO_PKG_NAME")) + .build() + .unwrap(); + let task = client + .get("https://api.github.com/repos/gopher64/gopher64/releases/latest") + .send(); + tokio::spawn(async move { + let response = task.await; + if let Ok(response) = response { + let data: Result = response.json().await; + if data.is_ok() { + tx.send(data.unwrap()).await.unwrap(); + } else { + tx.send(GithubData { + tag_name: format!("v{}", env!("CARGO_PKG_VERSION")), + }) + .await + .unwrap(); + } + gui_ctx.request_repaint(); + } + }); + } else if app.latest_version.is_none() { + let result = app.update_receiver.as_mut().unwrap().try_recv(); + if result.is_ok() { + let tag = &result.unwrap().tag_name[1..]; + app.latest_version = Some(semver::Version::parse(tag).unwrap()); + } else { + ctx.request_repaint(); + } + } +} + pub fn open_rom(app: &mut GopherEguiApp, ctx: &egui::Context) { let netplay; @@ -486,6 +534,15 @@ impl eframe::App for GopherEguiApp { ui.add_space(32.0); ui.label(format!("Version: {}", env!("CARGO_PKG_VERSION"))); + if self.latest_version.is_some() { + let current_version = semver::Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + if current_version < *self.latest_version.as_ref().unwrap() { + ui.hyperlink_to( + "New version available!", + "https://github.com/gopher64/gopher64/releases/latest", + ); + } + } }); if self.emulate_vru && self.vru_window_receiver.is_some() { @@ -499,6 +556,8 @@ impl eframe::App for GopherEguiApp { if self.show_vru_dialog { show_vru_dialog(self, ctx); } + + get_latest_version(self, ctx); } }