diff --git a/rust/cli_player/src/client.rs b/rust/cli_player/src/client.rs index a0595d4..fe4a8ee 100644 --- a/rust/cli_player/src/client.rs +++ b/rust/cli_player/src/client.rs @@ -162,4 +162,11 @@ impl Client { pub async fn recv_next_message(&self) -> Res { Ok(self.receiver.recv()?) } + + /// Close connection + pub async fn close_connection(&mut self) { + if let Err(e) = self.sink.send(Message::Close(None)).await { + log::debug!("Failed to close WS connection! {:?}", e); + } + } } diff --git a/rust/cli_player/src/ui_screens/game_screen.rs b/rust/cli_player/src/ui_screens/game_screen.rs index 8b3aec7..dfe87b0 100644 --- a/rust/cli_player/src/ui_screens/game_screen.rs +++ b/rust/cli_player/src/ui_screens/game_screen.rs @@ -145,6 +145,7 @@ impl GameScreen { KeyCode::Char('q') if confirm(terminal, "Do you really want to leave game?") => { + self.client.close_connection().await; return Ok(ScreenResult::Canceled); } @@ -192,7 +193,10 @@ impl GameScreen { .await?; self.status = GameStatus::RematchRejected; } - Buttons::QuitGame => return Ok(ScreenResult::Ok(())), + Buttons::QuitGame => { + self.client.close_connection().await; + return Ok(ScreenResult::Ok(())); + } }, _ => {} @@ -249,6 +253,7 @@ impl GameScreen { .await? } ScreenResult::Canceled => { + self.client.close_connection().await; return Ok(ScreenResult::Canceled); } }; diff --git a/rust/sea_battle_backend/src/game.rs b/rust/sea_battle_backend/src/game.rs index afc02ff..5cd97ae 100644 --- a/rust/sea_battle_backend/src/game.rs +++ b/rust/sea_battle_backend/src/game.rs @@ -72,7 +72,7 @@ impl GameStatus { pub fn can_game_continue_with_bot(&self) -> bool { *self != GameStatus::Finished && *self != GameStatus::RematchRejected - && *self != GameStatus::RematchRejected + && *self != GameStatus::RematchRequested } }