feat: remove the need for constant polling data

This commit is contained in:
2026-03-27 13:08:20 -04:00
Unverified
parent 73e435d5ec
commit 4e131fac31
4 changed files with 124 additions and 15 deletions

View File

@@ -44,14 +44,21 @@ impl Server {
) -> Result<(), anyhow::Error> {
if requested_username.is_empty() {
return Err(anyhow::anyhow!(format!(
"ERROR:INVALID:ID:{}",
"ERROR:INVALID:CONNECT:{}",
requested_username
)));
}
if requested_username.chars().any(|c| matches!(c, ':' | ',' | '|') || c.is_control()) {
return Err(anyhow::anyhow!(format!(
"ERROR:INVALID:CONNECT:{}",
requested_username
)));
}
if requested_username == SERVER_PLAYER_USERNAME {
return Err(anyhow::anyhow!(format!(
"ERROR:INVALID:ID:{}",
"ERROR:INVALID:CONNECT:{}",
requested_username
)));
}
@@ -66,7 +73,7 @@ impl Server {
let existing_client = clients_guard.get(&requested_username).cloned();
if existing_client.is_some() && !reconnecting {
return Err(anyhow::anyhow!(format!(
"ERROR:INVALID:ID:{}",
"ERROR:INVALID:CONNECT:{}",
requested_username
)));
}
@@ -81,12 +88,14 @@ impl Server {
self.clients.write().await.insert(
requested_username.clone(),
Arc::new(RwLock::new(Client::new(
requested_username,
requested_username.clone(),
tx.clone(),
addr.to_string().parse()?,
))),
);
self.broadcast(&format!("CONNECT:{}", requested_username)).await;
return Ok(());
}
@@ -217,6 +226,7 @@ impl Server {
self.clients.write().await.remove(&username);
self.usernames.write().await.remove(&addr);
let _ = send(&tx, "DISCONNECT:ACK");
self.broadcast(&format!("DISCONNECT:{}", username)).await;
Ok(())
}
@@ -264,6 +274,7 @@ impl Server {
let _ = send(&tx, "READY:ACK");
drop(client);
drop(clients_guard);
self.broadcast(&format!("READY:{}:{}", username, true)).await;
if let Some(opponent_username) = self.find_reservation_opponent(&username).await {
let clients_guard = self.clients.read().await;
@@ -278,6 +289,14 @@ impl Server {
false,
)));
self.matches.write().await.insert(match_id, new_match.clone());
let match_guard = new_match.read().await;
self
.broadcast(&format!(
"GAME:START:{},{},{}",
match_id, match_guard.player1, match_guard.player2
))
.await;
drop(match_guard);
client.ready = false;
client.current_match = Some(match_id);
@@ -294,6 +313,7 @@ impl Server {
opponent.ready = false;
opponent.current_match = Some(match_id);
opponent.color = !client.color;
let opponent_username = opponent.username.clone();
self
.reservations
@@ -301,6 +321,12 @@ impl Server {
.await
.retain(|(p1, p2)| !(p1 == &client.username && p2 == &opponent.username));
drop(opponent);
drop(client);
drop(clients_guard);
self.broadcast(&format!("READY:{}:{}", username, false)).await;
self.broadcast(&format!("READY:{}:{}", opponent_username, false)).await;
return Ok(());
}
@@ -316,6 +342,15 @@ impl Server {
is_demo_mode,
)));
self.matches.write().await.insert(match_id, new_match.clone());
let match_guard = new_match.read().await;
self
.broadcast(&format!(
"GAME:START:{},{},{}",
match_id, match_guard.player1, match_guard.player2
))
.await;
drop(match_guard);
client.ready = false;
client.current_match = Some(match_id);
client.color = if new_match.read().await.player1 == username {
@@ -355,6 +390,9 @@ impl Server {
}
}));
}
drop(client);
self.broadcast(&format!("READY:{}:{}", username, false)).await;
}
Ok(())
@@ -1202,8 +1240,17 @@ impl Server {
false,
)));
self.matches.write().await.insert(match_id, new_match.clone());
let match_guard = new_match.read().await;
self
.broadcast(&format!(
"GAME:START:{},{},{}",
match_id, match_guard.player1, match_guard.player2
))
.await;
drop(match_guard);
player1.ready = false;
let player1_name = player1.username.clone();
player1.current_match = Some(match_id);
player1.color = if new_match.read().await.player1 == player1_username {
let _ = send(&tx, "GAME:START:1");
@@ -1216,6 +1263,7 @@ impl Server {
};
player2.ready = false;
let player2_name = player2.username.clone();
player2.current_match = Some(match_id);
player2.color = !player1.color;
@@ -1224,6 +1272,12 @@ impl Server {
.write()
.await
.retain(|(p1, p2)| !(p1 == &player1_username && p2 == &player2_username));
drop(player2);
drop(player1);
drop(clients_guard);
self.broadcast(&format!("READY:{}:{}", player1_name, false)).await;
self.broadcast(&format!("READY:{}:{}", player2_name, false)).await;
}
}