From a280d525b158b669b97279305b3abef6b6dcbe8a Mon Sep 17 00:00:00 2001 From: szymon Date: Sat, 22 Aug 2026 14:48:52 +0200 Subject: [PATCH] feat: add revoking readiness --- src/bin/client.rs | 11 ++++++++++- src/network/client.rs | 6 ++++++ src/network/message.rs | 1 + src/network/server.rs | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index c96a384..e14a2d0 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -15,6 +15,7 @@ const QUIT_COMMAND: &str = "/quit"; const HELP_COMMAND: &str = "/help"; const SEND_COMMAND: &str = "/send"; const READY_COMMAND: &str = "/ready"; +const UNREADY_COMMAND: &str = "/unready"; const SINGLEPLAYER_COMMAND: &str = "/single"; const CAPTURE_COMMAND: &str = "/capture"; @@ -26,6 +27,8 @@ enum CliCommands { Send, Ready, + Unready, + Single, Capture, @@ -50,6 +53,7 @@ impl TryFrom<&str> for CliCommands { HELP_COMMAND => Ok(CliCommands::Help), SEND_COMMAND => Ok(CliCommands::Send), READY_COMMAND => Ok(CliCommands::Ready), + UNREADY_COMMAND => Ok(CliCommands::Unready), SINGLEPLAYER_COMMAND => Ok(CliCommands::Single), CAPTURE_COMMAND => Ok(CliCommands::Capture), @@ -119,6 +123,7 @@ async fn main() -> Result<(), Box> { │\t {} - quit │\t {} - show this message │\t {} - message the server you're ready +│\t {} - revoke readiness │\t {} - send text message to the server │\t {} - play alone │ @@ -126,7 +131,7 @@ async fn main() -> Result<(), Box> { │\t {} - choose move from the list. First number is pawn you want to move and second is position it should take └─────────────────────────────────────── ", - QUIT_COMMAND, HELP_COMMAND, READY_COMMAND, SEND_COMMAND, SINGLEPLAYER_COMMAND , CAPTURE_COMMAND, MOVE_COMMAND + QUIT_COMMAND, HELP_COMMAND, READY_COMMAND, UNREADY_COMMAND, SEND_COMMAND, SINGLEPLAYER_COMMAND , CAPTURE_COMMAND, MOVE_COMMAND ); println!("───────Type /help for help───────"); @@ -209,6 +214,10 @@ async fn main() -> Result<(), Box> { client.signal_readiness().await; } + CliCommands::Unready => { + client.revoke_readiness().await; + } + CliCommands::Single => { println!("Tried connecting bot to the server! Make sure to be /ready"); tokio::spawn(run_bot()); diff --git a/src/network/client.rs b/src/network/client.rs index 1136f5c..47bce56 100644 --- a/src/network/client.rs +++ b/src/network/client.rs @@ -168,6 +168,12 @@ impl Client { self.send_message(msg).await; } + pub async fn revoke_readiness(&mut self) { + debug!("Revoking readiness and sending it to the server..."); + let msg = Message::new(ClientMessage::SignalUnreadiness); + self.send_message(msg).await; + } + pub fn get_update_receiver(&mut self) -> Option> { self.update_receiver.take() } diff --git a/src/network/message.rs b/src/network/message.rs index 3250e73..91b978a 100644 --- a/src/network/message.rs +++ b/src/network/message.rs @@ -60,6 +60,7 @@ pub enum ServerMessage { pub enum ClientMessage { AnswerHandshake { player_name: String }, SignalReadiness, + SignalUnreadiness, ConnectionDead { addr: SocketAddr }, diff --git a/src/network/server.rs b/src/network/server.rs index f553aaa..6f886be 100644 --- a/src/network/server.rs +++ b/src/network/server.rs @@ -189,6 +189,10 @@ impl Server { self.handle_readiness(addr).await } + ClientMessage::SignalUnreadiness => { + self.handle_unreadiness(addr).await; + } + ClientMessage::RequestCapture { capture_path } => { self.process_capture(capture_path).await; } @@ -337,6 +341,37 @@ impl Server { } } + async fn handle_unreadiness(&mut self, addr: SocketAddr) { + if !self.connections[&addr].is_handshaken { + warn!( + "Connection: {} tried revoking readiness, but hands were not shaken. Ignoring....", + addr + ); + return; + } + + if self.state.stage != ServerStage::Lobby { + warn!( + "Player {} tried revoking readiness, but game already started. Ignoring...", + addr + ); + return; + } + + self.state.ready_count -= 1; + + self.connections + .get_mut(&addr) + .expect("Could not get the indentity of the player that wanted to revoke readinessl") + .identity + .is_ready = false; + + info!( + "Player {} revoked his readiness. Currently ready: {}/{}", + addr, self.state.ready_count, MAX_PLAYABLE_CONNECTIONS + ); + } + /* === Sending messages === */ /// Should be used after every players move