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::io;
use std::os::unix::net::UnixStream; use std::os::unix::net::UnixStream;
use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::mpsc::{channel, Receiver, Sender};
use std::sync::{Arc, Mutex};
use std::thread; use std::thread;
use std::time; use std::time;
use termion::event::{parse_event, Event, Key}; 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 (display_sender, display_receiver) = channel();
let (waiting_server_msg_sender, waiting_server_msg_receiver) = channel(); let (waiting_server_msg_sender, waiting_server_msg_receiver) = channel();
let keyboard_input_recv = let keyboard_input_recv = start_keyboard_input_thread(
start_keyboard_input_thread(display_sender.clone(), waiting_server_msg_sender.clone()); display_sender.clone(),
waiting_server_msg_sender.clone(),
is_player_turn.clone(),
);
start_display_thread(display_receiver); start_display_thread(display_receiver);
//start a thread to listen to server messages //start a thread to listen to server messages
let server_message_recv = let server_message_recv =
@ -92,8 +97,12 @@ fn main() {
let mut current_position = fetch_initial_chess_position(&client, &mut stream); let mut current_position = fetch_initial_chess_position(&client, &mut stream);
loop { loop {
let is_player_turn = clichess::is_player_turn(&client.player, current_position.turn()); let is_player_turn_loop = clichess::is_player_turn(&client.player, current_position.turn());
if is_player_turn || client.player.role == UserRole::Spectator { {
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(""); let mut message = String::from("");
client client
.opponent_name .opponent_name
@ -119,7 +128,7 @@ fn main() {
if current_position.is_game_over() { if current_position.is_game_over() {
break; break;
} }
if is_player_turn { if is_player_turn_loop {
//it's the user turn, taking user input //it's the user turn, taking user input
let mut input = client.keyboard_input_recv.recv().unwrap(); let mut input = client.keyboard_input_recv.recv().unwrap();
input = String::from(input.trim()); input = String::from(input.trim());
@ -312,6 +321,7 @@ fn start_display_thread(request_recv: Receiver<DisplayMessage>) {
fn start_keyboard_input_thread( fn start_keyboard_input_thread(
display_sender: Sender<DisplayMessage>, display_sender: Sender<DisplayMessage>,
waiting_server_msg_sender: Sender<WaitingServerMsg>, waiting_server_msg_sender: Sender<WaitingServerMsg>,
is_player_turn: Arc<Mutex<bool>>,
) -> Receiver<String> { ) -> Receiver<String> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
thread::spawn(move || { thread::spawn(move || {
@ -322,6 +332,11 @@ fn start_keyboard_input_thread(
loop { loop {
let b = bytes.next().unwrap().unwrap(); let b = bytes.next().unwrap().unwrap();
let e = parse_event(b, &mut bytes).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 { match e {
Event::Key(Key::Ctrl('c')) => { Event::Key(Key::Ctrl('c')) => {
sender.send(String::from(EXIT_MSG)).unwrap(); sender.send(String::from(EXIT_MSG)).unwrap();