badge map on server

This commit is contained in:
Andy Killorin 2024-12-07 16:50:26 -05:00
parent c2725ad3db
commit 5b5f47d03e
Signed by: ank
GPG key ID: 23F9463ECB67FE8C

View file

@ -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 axum::{extract::State, http::StatusCode, response::Html, routing::{get, post}, serve, Form, Router};
use common::{Name, Request}; use common::{Name, Request};
@ -28,6 +28,7 @@ struct AppState {
fish: Arc<Semaphore>, fish: Arc<Semaphore>,
last_badge: Arc<RwLock<(u64,Instant)>>, last_badge: Arc<RwLock<(u64,Instant)>>,
net_status: Arc<RwLock<NetStatus>>, net_status: Arc<RwLock<NetStatus>>,
badge_map: Arc<RwLock<HashMap<u64,String>>>,
} }
#[tokio::main] #[tokio::main]
@ -65,6 +66,7 @@ async fn main() -> Result<()>{
let fish = Arc::new(Semaphore::new(1)); let fish = Arc::new(Semaphore::new(1));
let last_badge = Arc::new(RwLock::new((0u64,Instant::now()))); let last_badge = Arc::new(RwLock::new((0u64,Instant::now())));
let network_status = Arc::new(RwLock::new(NetStatus::default())); let network_status = Arc::new(RwLock::new(NetStatus::default()));
let badge_map = Arc::new(RwLock::new(HashMap::new()));
info!("starting"); info!("starting");
@ -83,6 +85,7 @@ async fn main() -> Result<()>{
fish: fish.clone(), fish: fish.clone(),
last_badge: last_badge.clone(), last_badge: last_badge.clone(),
net_status: network_status.clone(), net_status: network_status.clone(),
badge_map
}); });
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
@ -194,7 +197,7 @@ async fn root() -> Html<String> {
Html::from(page) Html::from(page)
} }
async fn names(state: State<AppState>) -> Html<String> { async fn names(state: State<AppState>) -> Html<String> {
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#" let mut page = format!(r#"
{last_badge_view} {last_badge_view}
@ -229,7 +232,7 @@ async fn names(state: State<AppState>) -> Html<String> {
} }
async fn control(state: State<AppState>) -> Html<String> { async fn control(state: State<AppState>) -> Html<String> {
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; let netstat = state.net_status.read().await;
@ -263,8 +266,15 @@ async fn control(state: State<AppState>) -> Html<String> {
Html::from(page) Html::from(page)
} }
async fn last_badge_view(last_badge: &Arc<RwLock<(u64, Instant)>>) -> String { async fn last_badge_view(state: &State<AppState>) -> String {
let (last_badge, time) = *last_badge.read().await; 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(); let time = time.elapsed().as_secs();
if last_badge == 0 { if last_badge == 0 {
format!(r#" format!(r#"
@ -275,7 +285,7 @@ async fn last_badge_view(last_badge: &Arc<RwLock<(u64, Instant)>>) -> String {
} else { } else {
format!(r#" format!(r#"
<p> <p>
most recent badge {last_badge:#0x}<br> most recent badge {last_badge:#0x} ({name})<br>
{time}s ago {time}s ago
</p> </p>
"#) "#)
@ -323,6 +333,8 @@ async fn set_last(
state: State<AppState>, state: State<AppState>,
Form(input): Form<NameForm>) -> Html<String> { Form(input): Form<NameForm>) -> Html<String> {
let (last_badge, _) = *state.last_badge.read().await;
let name_e = match input.name.as_str() { let name_e = match input.name.as_str() {
"Tess" => Name::Tess, "Tess" => Name::Tess,
"Amaia" => Name::Amaia, "Amaia" => Name::Amaia,
@ -332,11 +344,13 @@ async fn set_last(
"Thia" => Name::Thia, "Thia" => Name::Thia,
"Michael" => Name::Michael, "Michael" => Name::Michael,
"Zoey" => Name::Zoey, "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); info!("setting {} ({name_e:?}) to {last_badge:#0x}", input.name);
let _fish = state.fish.acquire().await.unwrap(); let _fish = state.fish.acquire().await.unwrap();
let mut conn = TcpStream::connect(FISH).await.unwrap(); let mut conn = TcpStream::connect(FISH).await.unwrap();