if let Some(err) = &self.error { ui.colored_label(egui::Color32::RED, format!("Error: {}", err)); } for friend in &self.friends { if friend.online { ui.label(format!("🟢 {} is online", friend.online_id)); } } }); ctx.request_repaint_after(std::time::Duration::from_secs(60)); } }
fn main() -> eframe::Result<()> let options = eframe::NativeOptions viewport: egui::ViewportBuilder::default() .with_inner_size([400.0, 300.0]) .with_title("Rusty PSN Monitor"), ..Default::default() ; let app = PsnApp friends: Vec::new(), error: None, client: Client::new(), ; eframe::run_native(Box::new(app), options)
Remember: the “updated” part is an ongoing process. Join the egui Discord and PSN API reverse-engineering communities to stay ahead of breaking changes. Happy coding, and may your friends list always show green. rusty psn egui windows updated
Err(e) => self.error = Some(e.to_string()),
impl PsnApp fn fetch_friends_blocking(&mut self, token: &str) // In real code, spawn this async let url = "https://m.np.playstation.net/api/friends/v1/friendList"; let resp = self.client.get(url) .bearer_auth(token) .send(); match resp Ok(r) => if let Ok(list) = r.json::<Vec<Friend>>() self.friends = list; self.error = None; else self.error = Some("Parse failed".into()); if let Some(err) = &self
: Use egui::ViewportBuilder to set parent window handle if you need to embed into another app. Also, enable winit ’s active event loop to prevent high CPU when minimized. 4. Step-by-Step: Updating Your Existing Project If you have an old rusty_psn_egui_windows project, here’s the migration checklist. 4.1 Update Dependencies [dependencies] eframe = "0.29" egui = "0.29" reqwest = version = "0.12", features = ["json", "rustls-tls", "native-certs"] tokio = version = "1.40", features = ["rt", "macros"] serde = version = "1.0", features = ["derive"] wry = "0.43" # For webview login 4.2 Fix Async Runtime on Windows Windows event loops have quirks. Spawn a background tokio runtime inside eframe ’s main thread:
// main.rs – complete minimal example use eframe::egui; use reqwest::Client; use serde::Deserialize; #[derive(Deserialize, Debug)] struct Friend online: bool, online_id: String, avatar_url: String, Err(e) => self
struct PsnApp friends: Vec<Friend>, error: Option<String>, client: Client,