badge map on server
This commit is contained in:
parent
c2725ad3db
commit
5b5f47d03e
1 changed files with 22 additions and 8 deletions
|
@ -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<Semaphore>,
|
||||
last_badge: Arc<RwLock<(u64,Instant)>>,
|
||||
net_status: Arc<RwLock<NetStatus>>,
|
||||
badge_map: Arc<RwLock<HashMap<u64,String>>>,
|
||||
}
|
||||
|
||||
#[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<String> {
|
|||
Html::from(page)
|
||||
}
|
||||
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#"
|
||||
{last_badge_view}
|
||||
|
@ -229,7 +232,7 @@ async fn names(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;
|
||||
|
||||
|
@ -263,8 +266,15 @@ async fn control(state: State<AppState>) -> Html<String> {
|
|||
Html::from(page)
|
||||
}
|
||||
|
||||
async fn last_badge_view(last_badge: &Arc<RwLock<(u64, Instant)>>) -> String {
|
||||
let (last_badge, time) = *last_badge.read().await;
|
||||
async fn last_badge_view(state: &State<AppState>) -> 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<RwLock<(u64, Instant)>>) -> String {
|
|||
} else {
|
||||
format!(r#"
|
||||
<p>
|
||||
most recent badge {last_badge:#0x}<br>
|
||||
most recent badge {last_badge:#0x} ({name})<br>
|
||||
{time}s ago
|
||||
</p>
|
||||
"#)
|
||||
|
@ -323,6 +333,8 @@ async fn set_last(
|
|||
state: State<AppState>,
|
||||
Form(input): Form<NameForm>) -> Html<String> {
|
||||
|
||||
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();
|
||||
|
|
Loading…
Reference in a new issue