Refactor code to simplify client deconnection

This commit is contained in:
Artlef 2020-05-03 19:44:49 +02:00
parent 56699033d9
commit 2c4b339bc2
2 changed files with 8 additions and 23 deletions

View File

@ -5,7 +5,6 @@ use shakmaty::fen::Fen;
use shakmaty::{Chess, Color, Outcome, Position, Setup}; use shakmaty::{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::atomic::{AtomicBool, Ordering};
use std::sync::mpsc::{channel, Receiver, TryRecvError}; use std::sync::mpsc::{channel, Receiver, TryRecvError};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::thread; use std::thread;
@ -14,13 +13,11 @@ use std::time;
struct Client { struct Client {
player: clichess::Player, player: clichess::Player,
side: Color, side: Color,
running: Arc<AtomicBool>,
input_buffer: Arc<Mutex<String>>, input_buffer: Arc<Mutex<String>>,
server_message_recv: Receiver<String>, server_message_recv: Receiver<String>,
} }
fn main() { fn main() {
let running = setupctrlc();
let username = std::env::args().nth(1).expect("no name given"); let username = std::env::args().nth(1).expect("no name given");
let public_key = std::env::args().nth(2).expect("no public key given"); let public_key = std::env::args().nth(2).expect("no public key given");
//send username and public key to server //send username and public key to server
@ -47,7 +44,6 @@ fn main() {
public_key: public_key, public_key: public_key,
}, },
side: Color::White, side: Color::White,
running: running.clone(),
input_buffer: input_buffer.clone(), input_buffer: input_buffer.clone(),
server_message_recv, server_message_recv,
}; };
@ -133,16 +129,6 @@ fn setup_input_buffer() -> Arc<Mutex<String>> {
buf buf
} }
fn setupctrlc() -> Arc<AtomicBool> {
let running = Arc::new(AtomicBool::new(true));
let r = running.clone();
ctrlc::set_handler(move || {
r.store(false, Ordering::SeqCst);
})
.expect("Error setting Ctrl-C handler");
running
}
fn setup_server_message_recv(stream: &UnixStream) -> io::Result<Receiver<String>> { fn setup_server_message_recv(stream: &UnixStream) -> io::Result<Receiver<String>> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
let thread_stream = stream.try_clone()?; let thread_stream = stream.try_clone()?;
@ -165,7 +151,7 @@ fn read_user_input(client: &Client) -> String {
user_input.clear(); user_input.clear();
} }
let mut input = String::new(); let mut input = String::new();
while client.running.load(Ordering::SeqCst) { loop {
thread::sleep(time::Duration::from_millis(10)); thread::sleep(time::Duration::from_millis(10));
{ {
let user_input = client.input_buffer.lock().unwrap(); let user_input = client.input_buffer.lock().unwrap();
@ -177,11 +163,7 @@ fn read_user_input(client: &Client) -> String {
} }
} }
} }
if client.running.load(Ordering::SeqCst) { input
input
} else {
String::from(EXIT_MSG)
}
} }
//wait for next position from server, then return the current board. //wait for next position from server, then return the current board.
@ -196,7 +178,7 @@ fn get_current_position(client: &Client) -> Result<Chess, RecvPositionError> {
fn fetch_message_from_server(client: &Client) -> String { fn fetch_message_from_server(client: &Client) -> String {
let mut response = String::new(); let mut response = String::new();
while client.running.load(Ordering::SeqCst) { loop {
thread::sleep(time::Duration::from_millis(10)); thread::sleep(time::Duration::from_millis(10));
{ {
let server_response_recv = &client.server_message_recv; let server_response_recv = &client.server_message_recv;

View File

@ -111,7 +111,9 @@ fn main_loop(stream: &mut UnixStream, server: &Server, player: Player, mut playe
others_serv_msg_buf.lock().unwrap().push_str(&chessfen); others_serv_msg_buf.lock().unwrap().push_str(&chessfen);
} }
} }
clichess::write_to_stream(stream, chessfen).unwrap(); if clichess::write_to_stream(stream, chessfen).is_err() {
break;
}
player_turn = chess.turn(); player_turn = chess.turn();
} }
} else { } else {
@ -151,7 +153,8 @@ fn wait_for_opponent_move(server: &Server) -> Result<String, RecvPositionError>
"Client sent message while it's not its turn, this is an error." "Client sent message while it's not its turn, this is an error."
); );
println!("Here is the message: {}", msg); println!("Here is the message: {}", msg);
continue; returned_result = Err(RecvPositionError::UserCanceledError);
break;
} }
} }
Err(TryRecvError::Disconnected) => println!("Error: client disconnected."), Err(TryRecvError::Disconnected) => println!("Error: client disconnected."),