enums for leaderboard type

This commit is contained in:
2026-05-29 20:28:44 +01:00
parent 75b3055691
commit 4f6f86c0f8
3 changed files with 17 additions and 12 deletions
+1 -1
View File
@@ -1 +1 @@
{"deadvey":58,"anon":15,"error":0} {"anon":15,"deadvey":58,"error":0}
BIN
View File
Binary file not shown.
+16 -11
View File
@@ -24,10 +24,16 @@ struct Entry
score: u32, score: u32,
person: String, person: String,
} }
enum Leaderboard
{
Hiscores,
Loscores,
Pingscores,
}
#[derive(Clone)] #[derive(Clone)]
struct AppState { struct AppState {
tx: mpsc::Sender<(Entry,u8)>, tx: mpsc::Sender<(Entry,Leaderboard)>,
hiscores: Arc<Mutex<Vec<Entry>>>, hiscores: Arc<Mutex<Vec<Entry>>>,
loscores: Arc<Mutex<Vec<Entry>>>, loscores: Arc<Mutex<Vec<Entry>>>,
pingscores: Arc<Mutex<HashMap<String,u64>>>, pingscores: Arc<Mutex<HashMap<String,u64>>>,
@@ -47,7 +53,7 @@ async fn main() {
let loscore_clone1 = Arc::clone(&loscores); let loscore_clone1 = Arc::clone(&loscores);
let pingscore_clone1 = Arc::clone(&pingscores); let pingscore_clone1 = Arc::clone(&pingscores);
let (tx, rx) = mpsc::channel::<(Entry,u8)>(); let (tx, rx) = mpsc::channel::<(Entry,Leaderboard)>();
tokio::spawn( tokio::spawn(
async move { async move {
@@ -94,7 +100,7 @@ async fn leaderboard() -> Html<&'static str> {
Html(include_str!("../leaderboard.html")) Html(include_str!("../leaderboard.html"))
} }
// receiver: 0 for hiscore, 1 for loscore, 2 for pingscore // receiver: 0 for hiscore, 1 for loscore, 2 for pingscore
fn handle_hiscores(rx: mpsc::Receiver<(Entry, u8)>, hiscores_arc: Arc<Mutex<Vec<Entry>>>, loscores_arc: Arc<Mutex<Vec<Entry>>>,pingscores_arc: Arc<Mutex<HashMap<String,u64>>>,) fn handle_hiscores(rx: mpsc::Receiver<(Entry, Leaderboard)>, hiscores_arc: Arc<Mutex<Vec<Entry>>>, loscores_arc: Arc<Mutex<Vec<Entry>>>,pingscores_arc: Arc<Mutex<HashMap<String,u64>>>,)
{ {
// Panic galore // Panic galore
let mut hiscores = hiscores_arc.lock().unwrap(); let mut hiscores = hiscores_arc.lock().unwrap();
@@ -109,7 +115,7 @@ fn handle_hiscores(rx: mpsc::Receiver<(Entry, u8)>, hiscores_arc: Arc<Mutex<Vec<
{ {
match rx.recv() match rx.recv()
{ {
Ok((new_entry,0)) => Ok((new_entry,Leaderboard::Hiscores)) =>
{ {
let mut hiscores = hiscores_arc.lock().unwrap(); let mut hiscores = hiscores_arc.lock().unwrap();
if new_entry.score > hiscores[19].score { if new_entry.score > hiscores[19].score {
@@ -125,7 +131,7 @@ fn handle_hiscores(rx: mpsc::Receiver<(Entry, u8)>, hiscores_arc: Arc<Mutex<Vec<
file.flush().unwrap(); file.flush().unwrap();
} }
}, },
Ok((new_entry,1)) => Ok((new_entry,Leaderboard::Loscores)) =>
{ {
let mut loscores = loscores_arc.lock().unwrap(); let mut loscores = loscores_arc.lock().unwrap();
if new_entry.score > loscores[19].score { if new_entry.score > loscores[19].score {
@@ -141,14 +147,13 @@ fn handle_hiscores(rx: mpsc::Receiver<(Entry, u8)>, hiscores_arc: Arc<Mutex<Vec<
file.flush().unwrap(); file.flush().unwrap();
} }
}, },
Ok((new_entry,2)) => Ok((new_entry,Leaderboard::Pingscores)) =>
{ {
let name = new_entry.person; let name = new_entry.person;
let mut pingscores = pingscores_arc.lock().unwrap(); let mut pingscores = pingscores_arc.lock().unwrap();
*pingscores.entry(name).or_insert(0) += 1; *pingscores.entry(name).or_insert(0) += 1;
drop(pingscores); drop(pingscores);
} }
Ok((_,_)) => println!("Invalid number"),
Err(error) => println!("{error}"), Err(error) => println!("{error}"),
} }
} }
@@ -172,7 +177,7 @@ async fn ws_handler(
async fn handle_socket async fn handle_socket
( (
mut socket: WebSocket, mut socket: WebSocket,
tx: mpsc::Sender<(Entry,u8)>, tx: mpsc::Sender<(Entry,Leaderboard)>,
hiscores_arc: Arc<Mutex<Vec<Entry>>>, hiscores_arc: Arc<Mutex<Vec<Entry>>>,
loscores_arc: Arc<Mutex<Vec<Entry>>>, loscores_arc: Arc<Mutex<Vec<Entry>>>,
pingscores_arc: Arc<Mutex<HashMap<String, u64>>>, pingscores_arc: Arc<Mutex<HashMap<String, u64>>>,
@@ -202,12 +207,12 @@ async fn handle_socket
match msg { match msg {
Ok(Message::Text(_)) => { Ok(Message::Text(_)) => {
if random_bool(CHANCE) { if random_bool(CHANCE) {
let _ = tx.send((Entry{ person: name.clone(), score: value },0)); //hiscores let _ = tx.send((Entry{ person: name.clone(), score: value },Leaderboard::Hiscores)); //hiscores
let _ = tx.send((Entry{ person: name.clone(), score: 0 },2)); //hiscores let _ = tx.send((Entry{ person: name.clone(), score: 0 },Leaderboard::Pingscores)); //pingscores
if value == 0 if value == 0
{ {
resets += 1; resets += 1;
let _ = tx.send((Entry{ person: name.clone(), score: resets },1));//loscores let _ = tx.send((Entry{ person: name.clone(), score: resets },Leaderboard::Loscores));//loscores
} }
else { resets = 0 }; else { resets = 0 };
value = 0 value = 0