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
+16 -11
View File
@@ -24,10 +24,16 @@ struct Entry
score: u32,
person: String,
}
enum Leaderboard
{
Hiscores,
Loscores,
Pingscores,
}
#[derive(Clone)]
struct AppState {
tx: mpsc::Sender<(Entry,u8)>,
tx: mpsc::Sender<(Entry,Leaderboard)>,
hiscores: Arc<Mutex<Vec<Entry>>>,
loscores: Arc<Mutex<Vec<Entry>>>,
pingscores: Arc<Mutex<HashMap<String,u64>>>,
@@ -47,7 +53,7 @@ async fn main() {
let loscore_clone1 = Arc::clone(&loscores);
let pingscore_clone1 = Arc::clone(&pingscores);
let (tx, rx) = mpsc::channel::<(Entry,u8)>();
let (tx, rx) = mpsc::channel::<(Entry,Leaderboard)>();
tokio::spawn(
async move {
@@ -94,7 +100,7 @@ async fn leaderboard() -> Html<&'static str> {
Html(include_str!("../leaderboard.html"))
}
// 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
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()
{
Ok((new_entry,0)) =>
Ok((new_entry,Leaderboard::Hiscores)) =>
{
let mut hiscores = hiscores_arc.lock().unwrap();
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();
}
},
Ok((new_entry,1)) =>
Ok((new_entry,Leaderboard::Loscores)) =>
{
let mut loscores = loscores_arc.lock().unwrap();
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();
}
},
Ok((new_entry,2)) =>
Ok((new_entry,Leaderboard::Pingscores)) =>
{
let name = new_entry.person;
let mut pingscores = pingscores_arc.lock().unwrap();
*pingscores.entry(name).or_insert(0) += 1;
drop(pingscores);
}
Ok((_,_)) => println!("Invalid number"),
Err(error) => println!("{error}"),
}
}
@@ -172,7 +177,7 @@ async fn ws_handler(
async fn handle_socket
(
mut socket: WebSocket,
tx: mpsc::Sender<(Entry,u8)>,
tx: mpsc::Sender<(Entry,Leaderboard)>,
hiscores_arc: Arc<Mutex<Vec<Entry>>>,
loscores_arc: Arc<Mutex<Vec<Entry>>>,
pingscores_arc: Arc<Mutex<HashMap<String, u64>>>,
@@ -202,12 +207,12 @@ async fn handle_socket
match msg {
Ok(Message::Text(_)) => {
if random_bool(CHANCE) {
let _ = tx.send((Entry{ person: name.clone(), score: value },0)); //hiscores
let _ = tx.send((Entry{ person: name.clone(), score: 0 },2)); //hiscores
let _ = tx.send((Entry{ person: name.clone(), score: value },Leaderboard::Hiscores)); //hiscores
let _ = tx.send((Entry{ person: name.clone(), score: 0 },Leaderboard::Pingscores)); //pingscores
if value == 0
{
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 };
value = 0