From 4c54d9b5e5a540ddf6eed336690ccb24d5153f78 Mon Sep 17 00:00:00 2001 From: Artlef Date: Sun, 29 Nov 2020 00:02:53 +0100 Subject: [PATCH] Do not take client input when it's not his turn --- src/bin/client.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index a316756..7b8fb3c 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -5,6 +5,7 @@ use shakmaty::{fen, Chess, Color, Outcome, Position, Setup}; use std::io; use std::os::unix::net::UnixStream; use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::{Arc, Mutex}; use std::thread; use std::time; use termion::event::{parse_event, Event, Key}; @@ -37,10 +38,14 @@ fn main() { } }; + let is_player_turn = Arc::new(Mutex::new(true)); let (display_sender, display_receiver) = channel(); let (waiting_server_msg_sender, waiting_server_msg_receiver) = channel(); - let keyboard_input_recv = - start_keyboard_input_thread(display_sender.clone(), waiting_server_msg_sender.clone()); + let keyboard_input_recv = start_keyboard_input_thread( + display_sender.clone(), + waiting_server_msg_sender.clone(), + is_player_turn.clone(), + ); start_display_thread(display_receiver); //start a thread to listen to server messages let server_message_recv = @@ -92,8 +97,12 @@ fn main() { let mut current_position = fetch_initial_chess_position(&client, &mut stream); loop { - let is_player_turn = clichess::is_player_turn(&client.player, current_position.turn()); - if is_player_turn || client.player.role == UserRole::Spectator { + let is_player_turn_loop = clichess::is_player_turn(&client.player, current_position.turn()); + { + let mut is_player_turn = is_player_turn.lock().unwrap(); + *is_player_turn = is_player_turn_loop; + } + if is_player_turn_loop || client.player.role == UserRole::Spectator { let mut message = String::from(""); client .opponent_name @@ -119,7 +128,7 @@ fn main() { if current_position.is_game_over() { break; } - if is_player_turn { + if is_player_turn_loop { //it's the user turn, taking user input let mut input = client.keyboard_input_recv.recv().unwrap(); input = String::from(input.trim()); @@ -312,6 +321,7 @@ fn start_display_thread(request_recv: Receiver) { fn start_keyboard_input_thread( display_sender: Sender, waiting_server_msg_sender: Sender, + is_player_turn: Arc>, ) -> Receiver { let (sender, receiver) = channel(); thread::spawn(move || { @@ -322,6 +332,11 @@ fn start_keyboard_input_thread( loop { let b = bytes.next().unwrap().unwrap(); let e = parse_event(b, &mut bytes).unwrap(); + let is_player_turn = is_player_turn.lock().unwrap(); + if !*is_player_turn && e != Event::Key(Key::Ctrl('c')) { + //ignore input when it's not the client turn + continue; + } match e { Event::Key(Key::Ctrl('c')) => { sender.send(String::from(EXIT_MSG)).unwrap();