From e42c102135e9beeafa4da01930c70898e602a143 Mon Sep 17 00:00:00 2001 From: Artlef Date: Sun, 1 Mar 2020 20:11:14 +0100 Subject: [PATCH] Fix concurrency issue when choosing role --- src/bin/client.rs | 46 +++++++++++++++++++++++++++++++--------------- src/bin/server.rs | 1 + 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index 1a10d38..b5c0d8d 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -1,5 +1,6 @@ extern crate ctrlc; use clichess::RecvPositionError; +use clichess::UserRole; use serde_json::json; use shakmaty::fen::Fen; use shakmaty::{Chess, Color, Outcome, Position, Setup}; @@ -41,7 +42,7 @@ fn main() { let mut client = Client { player: clichess::Player { - role: clichess::UserRole::Spectator, + role: UserRole::Spectator, username: username, public_key: public_key, }, @@ -55,11 +56,18 @@ fn main() { Some(role) => client.player.role = role.clone(), None => return, }; - println!( - "Hello, {} !\n\r You're playing with the {} pieces", - client.player.username, - client.player.role.to_string() - ); + if client.player.role == UserRole::Spectator { + println!( + "Hello, {} !\n\r You're spectating !", + client.player.username + ) + } else { + println!( + "Hello, {} !\n\r You're playing with the {} pieces", + client.player.username, + client.player.role.to_string() + ); + } println!("Fetching initial chess position..."); let mut current_position = fetch_initial_chess_position(&client); loop { @@ -215,20 +223,20 @@ fn parse_position(string: &str) -> Chess { position } -fn prompt_user_for_role(client: &Client, stream: &mut UnixStream) -> Option { +fn prompt_user_for_role(client: &Client, stream: &mut UnixStream) -> Option { let mut role = None; loop { println!("fetching roles from server..."); let available_roles = fetch_available_roles(client); println!("available roles fetched."); let mut prompt = String::new(); - if !available_roles.contains(&clichess::UserRole::White) - && !available_roles.contains(&clichess::UserRole::Black) + if !available_roles.contains(&UserRole::White) + && !available_roles.contains(&UserRole::Black) { - prompt.push_str("You can only spectate this game."); - } else if available_roles.contains(&clichess::UserRole::White) { + prompt.push_str("You can only spectate this game. Press enter to start spectating."); + } else if available_roles.contains(&UserRole::White) { prompt = String::from("Do you want to play as White (W)"); - if available_roles.contains(&clichess::UserRole::White) { + if available_roles.contains(&UserRole::White) { prompt.push_str(", Black (B)"); } prompt.push_str(" or Spectate (S)?"); @@ -237,11 +245,18 @@ fn prompt_user_for_role(client: &Client, stream: &mut UnixStream) -> Option role = Some(r), Err(e) => { @@ -264,6 +279,7 @@ fn prompt_user_for_role(client: &Client, stream: &mut UnixStream) -> Option Chess { parse_position(&fetch_message_from_server(client)) } -fn fetch_available_roles(client: &Client) -> Vec { +fn fetch_available_roles(client: &Client) -> Vec { roles_from_str(&fetch_message_from_server(client)).unwrap() } -fn roles_from_str(s: &str) -> Result, String> { +fn roles_from_str(s: &str) -> Result, String> { s.split(',').map(clichess::parse_to_role).collect() } diff --git a/src/bin/server.rs b/src/bin/server.rs index 135d5ea..714e214 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -202,6 +202,7 @@ fn receive_user_role( } else { println!("KO"); clichess::write_to_stream(stream, String::from("KO")).unwrap(); + clichess::read_line_from_stream(stream).expect("Player closed connection."); continue; } }