From 5b5f47d03e6cbc79879e3aa01b744ae8f96db865 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:50:26 -0500 Subject: [PATCH] badge map on server --- server/src/main.rs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index 4c7c596..000fad4 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,5 +1,5 @@ -use std::{net::Ipv4Addr, sync::Arc, time::Duration}; +use std::{collections::HashMap, net::Ipv4Addr, sync::Arc, time::Duration}; use axum::{extract::State, http::StatusCode, response::Html, routing::{get, post}, serve, Form, Router}; use common::{Name, Request}; @@ -28,6 +28,7 @@ struct AppState { fish: Arc, last_badge: Arc>, net_status: Arc>, + badge_map: Arc>>, } #[tokio::main] @@ -65,6 +66,7 @@ async fn main() -> Result<()>{ let fish = Arc::new(Semaphore::new(1)); let last_badge = Arc::new(RwLock::new((0u64,Instant::now()))); let network_status = Arc::new(RwLock::new(NetStatus::default())); + let badge_map = Arc::new(RwLock::new(HashMap::new())); info!("starting"); @@ -83,6 +85,7 @@ async fn main() -> Result<()>{ fish: fish.clone(), last_badge: last_badge.clone(), net_status: network_status.clone(), + badge_map }); let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap(); @@ -194,7 +197,7 @@ async fn root() -> Html { Html::from(page) } async fn names(state: State) -> Html { - let last_badge_view = last_badge_view(&state.last_badge).await; + let last_badge_view = last_badge_view(&state).await; let mut page = format!(r#" {last_badge_view} @@ -229,7 +232,7 @@ async fn names(state: State) -> Html { } async fn control(state: State) -> Html { - let last_badge_view = last_badge_view(&state.last_badge).await; + let last_badge_view = last_badge_view(&state).await; let netstat = state.net_status.read().await; @@ -263,8 +266,15 @@ async fn control(state: State) -> Html { Html::from(page) } -async fn last_badge_view(last_badge: &Arc>) -> String { - let (last_badge, time) = *last_badge.read().await; +async fn last_badge_view(state: &State) -> String { + let (last_badge, time) = *state.last_badge.read().await; + let name = Name::from_badge(last_badge); + let name = match name { + Name::Unknown => { + state.badge_map.read().await.get(&last_badge).unwrap_or(&"Unknown".to_string()).clone() + }, + name => format!("{name:?}"), + }; let time = time.elapsed().as_secs(); if last_badge == 0 { format!(r#" @@ -275,7 +285,7 @@ async fn last_badge_view(last_badge: &Arc>) -> String { } else { format!(r#"

- most recent badge {last_badge:#0x}
+ most recent badge {last_badge:#0x} ({name})
{time}s ago

"#) @@ -323,6 +333,8 @@ async fn set_last( state: State, Form(input): Form) -> Html { + let (last_badge, _) = *state.last_badge.read().await; + let name_e = match input.name.as_str() { "Tess" => Name::Tess, "Amaia" => Name::Amaia, @@ -332,11 +344,13 @@ async fn set_last( "Thia" => Name::Thia, "Michael" => Name::Michael, "Zoey" => Name::Zoey, - _ => Name::Unknown, + name => { + state.badge_map.write().await.insert(last_badge, name.to_string()); + Name::Unknown + }, }; - let (last_badge, _) = *state.last_badge.read().await; info!("setting {} ({name_e:?}) to {last_badge:#0x}", input.name); let _fish = state.fish.acquire().await.unwrap(); let mut conn = TcpStream::connect(FISH).await.unwrap();