mirror of
https://github.com/szymon-jozef/checkers.git
synced 2026-10-27 19:20:44 +01:00
refactor: move update function of the network client to the constructor
This commit is contained in:
@@ -88,13 +88,11 @@ async fn run_bot() {
|
|||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
|
|
||||||
let Some(mut client) = Client::new().await else {
|
let Some(mut client) = Client::new(None).await else {
|
||||||
println!("Not worky, ending");
|
println!("Not worky, ending");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
|
|
||||||
client.update();
|
|
||||||
|
|
||||||
let (stdin_sender, mut stdin_receiver) = mpsc::channel(1024);
|
let (stdin_sender, mut stdin_receiver) = mpsc::channel(1024);
|
||||||
|
|
||||||
let mut context: ClientContext = ClientContext::default();
|
let mut context: ClientContext = ClientContext::default();
|
||||||
|
|||||||
@@ -23,25 +23,24 @@ pub enum ClientCommands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct Client {
|
pub struct Client {
|
||||||
conn_reciever_incoming: Option<Receiver<(SocketAddr, Message<ServerMessage>)>>,
|
|
||||||
conn_sender_outgoing: Sender<Message<ClientMessage>>,
|
conn_sender_outgoing: Sender<Message<ClientMessage>>,
|
||||||
settings: ClientSettings,
|
|
||||||
|
|
||||||
update_sender: Sender<ServerMessage>,
|
|
||||||
update_receiver: Option<Receiver<ServerMessage>>,
|
update_receiver: Option<Receiver<ServerMessage>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Client {
|
impl Client {
|
||||||
|
/// Creates a new instance of clients, connects it to the server and starts update loop
|
||||||
pub async fn new(settings: Option<ClientSettings>) -> Option<Client> {
|
pub async fn new(settings: Option<ClientSettings>) -> Option<Client> {
|
||||||
let Some(settings) = settings.or(Some(ClientSettings::new())) else {
|
let Some(settings) = settings.or(Some(ClientSettings::new())) else {
|
||||||
error!("Could not load client settings");
|
error!("Could not load client settings");
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
let (conn_sender, conn_reciever) =
|
let (conn_sender, mut conn_reciever) =
|
||||||
mpsc::channel::<(SocketAddr, Message<ServerMessage>)>(1024);
|
mpsc::channel::<(SocketAddr, Message<ServerMessage>)>(1024);
|
||||||
|
|
||||||
let mut conn: Connection<ServerMessage, ClientMessage> =
|
let mut conn: Connection<ServerMessage, ClientMessage> =
|
||||||
Connection::new(ConnectionType::Server, conn_sender);
|
Connection::new(ConnectionType::Server, conn_sender);
|
||||||
|
|
||||||
let conn_sender_outgoing = conn.get_sender();
|
let conn_sender_outgoing = conn.get_sender();
|
||||||
|
|
||||||
let (update_sender, update_receiver) = mpsc::channel(1024);
|
let (update_sender, update_receiver) = mpsc::channel(1024);
|
||||||
@@ -55,32 +54,14 @@ impl Client {
|
|||||||
conn.start_listening().await;
|
conn.start_listening().await;
|
||||||
});
|
});
|
||||||
|
|
||||||
Some(Client {
|
let conn_sender_outgoing_clone = conn_sender_outgoing.clone();
|
||||||
conn_reciever_incoming: Some(conn_reciever),
|
let settings_clone = settings.clone();
|
||||||
conn_sender_outgoing,
|
let update_sender_clone = update_sender.clone();
|
||||||
|
|
||||||
settings,
|
|
||||||
|
|
||||||
update_sender,
|
|
||||||
update_receiver: Some(update_receiver),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update(&mut self) {
|
|
||||||
let Some(mut conn_reciever_incoming) = self.conn_reciever_incoming.take() else {
|
|
||||||
error!("Tried updating, but there's no conn_reciever of incoming messages!");
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
let conn_sender = self.conn_sender_outgoing.clone();
|
|
||||||
|
|
||||||
let settings = self.settings.clone();
|
|
||||||
let update_sender = self.update_sender.clone();
|
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
loop {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
oldest_msg = conn_reciever_incoming.recv() => {
|
oldest_msg = conn_reciever.recv() => {
|
||||||
if let Some(oldest_msg) = oldest_msg {
|
if let Some(oldest_msg) = oldest_msg {
|
||||||
let (addr, msg) = oldest_msg;
|
let (addr, msg) = oldest_msg;
|
||||||
debug!("Got message from: {:?}", addr);
|
debug!("Got message from: {:?}", addr);
|
||||||
@@ -89,10 +70,10 @@ impl Client {
|
|||||||
ServerMessage::RequestHandshake => {
|
ServerMessage::RequestHandshake => {
|
||||||
info!("Server requested handshake!");
|
info!("Server requested handshake!");
|
||||||
let msg = Message::new(ClientMessage::AnswerHandshake {
|
let msg = Message::new(ClientMessage::AnswerHandshake {
|
||||||
player_name: settings.name.clone(),
|
player_name: settings_clone.name.clone(),
|
||||||
});
|
});
|
||||||
|
|
||||||
let _ = conn_sender.send(msg.unwrap()).await;
|
let _ = conn_sender_outgoing_clone.send(msg.unwrap()).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerMessage::AcceptHandshake => {
|
ServerMessage::AcceptHandshake => {
|
||||||
@@ -106,7 +87,7 @@ impl Client {
|
|||||||
|
|
||||||
_ => { // Pass all messages that require player intervention to the
|
_ => { // Pass all messages that require player intervention to the
|
||||||
// local client
|
// local client
|
||||||
let _ = update_sender.send(msg.content).await;
|
let _ = update_sender_clone.send(msg.content).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -117,6 +98,11 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Some(Client {
|
||||||
|
conn_sender_outgoing,
|
||||||
|
update_receiver: Some(update_receiver),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn send_message(&mut self, msg: Result<Message<ClientMessage>, postcard::Error>) {
|
async fn send_message(&mut self, msg: Result<Message<ClientMessage>, postcard::Error>) {
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
use rand::seq::IndexedRandom;
|
use rand::seq::IndexedRandom;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::{logic::game_master::GameResult, network::client::Client};
|
use crate::{
|
||||||
|
logic::game_master::GameResult,
|
||||||
|
network::client::Client,
|
||||||
|
settings::{client_settings::ClientSettings, general_settings::DEFAULT_URL},
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Clone, Copy)]
|
#[derive(PartialEq, Eq, Clone, Copy)]
|
||||||
pub enum BotDificulty {
|
pub enum BotDificulty {
|
||||||
@@ -23,12 +28,14 @@ impl Bot {
|
|||||||
Self { dificulty }
|
Self { dificulty }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn game_loop(&self) {
|
pub async fn game_loop(&self) -> Option<Uuid> {
|
||||||
let mut client = Client::new()
|
let mut client = Client::new(Some(ClientSettings {
|
||||||
|
name: "Bot".to_string(),
|
||||||
|
server_url: DEFAULT_URL,
|
||||||
|
}))
|
||||||
.await
|
.await
|
||||||
.expect("Couldn't connect to the server. Is it online?");
|
.expect("Couldn't connect to the server. Is it online?");
|
||||||
|
|
||||||
client.update();
|
|
||||||
client.signal_readiness().await; // bot is always ready
|
client.signal_readiness().await; // bot is always ready
|
||||||
|
|
||||||
let mut receiver = client
|
let mut receiver = client
|
||||||
@@ -37,7 +44,6 @@ impl Bot {
|
|||||||
|
|
||||||
let dificulty = self.dificulty;
|
let dificulty = self.dificulty;
|
||||||
|
|
||||||
tokio::spawn(async move {
|
|
||||||
loop {
|
loop {
|
||||||
match receiver.recv().await {
|
match receiver.recv().await {
|
||||||
Some(message) => match message {
|
Some(message) => match message {
|
||||||
@@ -61,9 +67,7 @@ impl Bot {
|
|||||||
|
|
||||||
client.send_move(rand_pawn.from, rand_move.clone()).await;
|
client.send_move(rand_pawn.from, rand_move.clone()).await;
|
||||||
}
|
}
|
||||||
crate::network::message::ServerMessage::BroadcastBoardState {
|
crate::network::message::ServerMessage::BroadcastBoardState { board: _ } => {
|
||||||
board: _,
|
|
||||||
} => {
|
|
||||||
info!("Got server state!");
|
info!("Got server state!");
|
||||||
|
|
||||||
match dificulty.clone() {
|
match dificulty.clone() {
|
||||||
@@ -91,9 +95,11 @@ impl Bot {
|
|||||||
match result {
|
match result {
|
||||||
GameResult::Draw => {
|
GameResult::Draw => {
|
||||||
info!("Draw!");
|
info!("Draw!");
|
||||||
|
return None;
|
||||||
}
|
}
|
||||||
GameResult::Lost(loser) => {
|
GameResult::Lost(loser) => {
|
||||||
info!("ID: {} lost!", loser);
|
info!("ID: {} lost!", loser);
|
||||||
|
return Some(loser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,10 +109,9 @@ impl Bot {
|
|||||||
|
|
||||||
None => {
|
None => {
|
||||||
error!("Connection broken! Super advanced ai logging out!");
|
error!("Connection broken! Super advanced ai logging out!");
|
||||||
break;
|
return None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user