Do not take client input when it's not his turn

This commit is contained in:
Artlef 2020-11-29 00:02:53 +01:00
parent 8d098c1ea4
commit 4c54d9b5e5

View File

@ -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<DisplayMessage>) {
fn start_keyboard_input_thread(
display_sender: Sender<DisplayMessage>,
waiting_server_msg_sender: Sender<WaitingServerMsg>,
is_player_turn: Arc<Mutex<bool>>,
) -> Receiver<String> {
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();