From f1c6aa015baac7474cfb5a24fe2a04bf430ab5f2 Mon Sep 17 00:00:00 2001 From: salmonik Date: Mon, 24 Aug 2026 18:21:55 +0200 Subject: Client: read PLAY_START response before animating; show error immediately on insufficient balance. Add versioning to AGENTS.md. --- src/bin/client/repl.rs | 77 ++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 33 deletions(-) (limited to 'src/bin') diff --git a/src/bin/client/repl.rs b/src/bin/client/repl.rs index dfcf0d2..c7e3b9d 100644 --- a/src/bin/client/repl.rs +++ b/src/bin/client/repl.rs @@ -85,7 +85,12 @@ impl ClientState { if let Some(mut stream) = self.stream.take() { match self.game_manager.start_game(&mut stream) { Ok(()) => { - self.play_spin_animation(&mut stream); + let response = self.read_server_response(&mut stream); + if response.trim().starts_with("ERROR") { + println!("\n{}", response.trim()); + } else { + self.play_spin_animation(&response); + } self.game_manager.reset_phase_to_waiting(); } Err(e) => println!("\nError starting game: {:?}", e), @@ -654,7 +659,16 @@ impl ClientState { // else do nothing } - fn play_spin_animation(&mut self, stream: &mut TlsStream) { + /// Read the server response after PLAY_START. + fn read_server_response(&self, stream: &mut TlsStream) -> String { + let mut response = String::new(); + let mut reader = std::io::BufReader::new(stream.try_clone().unwrap()); + let _ = reader.read_line(&mut response); + response + } + + /// Run the spinning animation and display the final result. + fn play_spin_animation(&mut self, response: &str) { use std::io::Write; use std::thread; use std::time::Duration; @@ -680,39 +694,36 @@ impl ClientState { thread::sleep(delay); } - let mut response_str = String::new(); - let mut reader = std::io::BufReader::new(stream.try_clone().unwrap()); - if reader.read_line(&mut response_str).is_ok() { - let response = response_str.trim(); - - if response.starts_with("GAME_RESULT") { - let parts: Vec<&str> = response.split_whitespace().collect(); - if parts.len() >= 7 { - let reels = parts[5]; - let win_type = parts[6]; - - execute!(stdout(), Clear(ClearType::CurrentLine), MoveToColumn(0)).unwrap(); - print!( - "[ {} ] [ {} ] [ {} ]", - reels.chars().nth(0).unwrap_or('?'), - reels.chars().nth(1).unwrap_or('?'), - reels.chars().nth(2).unwrap_or('?') - ); - println!(); - - if win_type == "jackpot" { - println!("\n🎉 JACKPOT! 🎉"); - } else if win_type == "two" { - println!("\n✨ Two of a kind! ✨"); - } else { - println!("\nNo win."); - } - - println!("Winnings: {} PLN", parts[2]); - println!("New Balance: {} PLN", parts[4]); - stdout().flush().unwrap(); + let response = response.trim(); + if response.starts_with("GAME_RESULT") { + let parts: Vec<&str> = response.split_whitespace().collect(); + if parts.len() >= 7 { + let reels = parts[5]; + let win_type = parts[6]; + + execute!(stdout(), Clear(ClearType::CurrentLine), MoveToColumn(0)).unwrap(); + print!( + "[ {} ] [ {} ] [ {} ]", + reels.chars().nth(0).unwrap_or('?'), + reels.chars().nth(1).unwrap_or('?'), + reels.chars().nth(2).unwrap_or('?') + ); + println!(); + + if win_type == "jackpot" { + println!("\n🎉 JACKPOT! 🎉"); + } else if win_type == "two" { + println!("\n✨ Two of a kind! ✨"); + } else { + println!("\nNo win."); } + + println!("Winnings: {} PLN", parts[2]); + println!("New Balance: {} PLN", parts[4]); + stdout().flush().unwrap(); } + } else if response.starts_with("ERROR") { + println!("\n{}", response); } } } -- cgit v1.2.3