feat: add sending and receiving moves and captures

This commit is contained in:
2026-08-17 21:47:03 +02:00
parent 9b86e95701
commit bb2599a3ca
3 changed files with 94 additions and 10 deletions

View File

@@ -119,10 +119,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
} }
Some(ClientData::AvailableCaptures(capture_paths)) => { Some(ClientData::AvailableCaptures(capture_paths)) => {
info!("Available captures paths: {:?}", capture_paths);
todo!() todo!()
} }
Some(ClientData::AvailableMoves(move_paths)) => todo!(), Some(ClientData::AvailableMoves(move_paths)) => {
info!("Available moves: {:?}", move_paths);
todo!();
},
Some(ClientData::TextMessage {sender, content}) => { Some(ClientData::TextMessage {sender, content}) => {
info!("[{}] - {}", sender, content); info!("[{}] - {}", sender, content);

View File

@@ -181,9 +181,17 @@ impl Client {
} }
ServerMessage::AvailableCaptures { captures } => todo!(), ServerMessage::AvailableCaptures { captures } => {
ServerMessage::AvailableMoves { moves } => todo!(), let _ = update_sender.send(ClientData::AvailableCaptures(captures)).await;
ServerMessage::GameEnd { result } => todo!(), },
ServerMessage::AvailableMoves { moves } => {
let _ = update_sender.send(ClientData::AvailableMoves(moves)).await;
},
ServerMessage::GameEnd { result } => {
let _ = update_sender.send(ClientData::GameEnd(result)).await;
},
} }
} else { } else {
error!("Connection broken!"); error!("Connection broken!");
@@ -194,9 +202,17 @@ impl Client {
oldest_cmd = commands_receiver.recv() => { oldest_cmd = commands_receiver.recv() => {
if let Some(oldest_cmd) = oldest_cmd { if let Some(oldest_cmd) = oldest_cmd {
match oldest_cmd { match oldest_cmd {
ClientCommands::SendCapture(capture_path) => todo!(), ClientCommands::SendCapture(capture_path) => {
debug!("Sending capture path: {:?}", capture_path);
let msg = Message::new(ClientMessage::RequestCapture { capture_path });
send_message(msg, &conn_sender).await;
},
ClientCommands::SendMove { from, to } => todo!(), ClientCommands::SendMove { from, to } => {
debug!("Sending move from: {} to: {}", from, to);
let msg = Message::new(ClientMessage::RequestMove { from, to});
send_message(msg, &conn_sender).await;
},
ClientCommands::SendText(content) => { ClientCommands::SendText(content) => {
debug!("Seding text message: {}", content); debug!("Seding text message: {}", content);

View File

@@ -12,7 +12,7 @@ use uuid::Uuid;
use crate::{ use crate::{
logic::{ logic::{
board::{board_view::BoardView, pawn::CapturePath}, board::{board_view::BoardView, pawn::CapturePath},
game_master::GameMaster, game_master::{GameMaster, GameResult},
math::position::Position, math::position::Position,
}, },
network::{ network::{
@@ -335,11 +335,68 @@ impl Server {
/* === Sending messages === */ /* === Sending messages === */
/// Wrapper around broadcast_current_turn and broadcast_board_view. Should be used after every /// Should be used after every players move
/// players move
async fn on_player_action(&mut self) { async fn on_player_action(&mut self) {
self.broadcast_board_view().await; self.broadcast_board_view().await;
self.broadcast_current_turn().await; self.broadcast_current_turn().await;
let Some(gm) = &self.game_master else {
error!("Game master not set while player made an action!");
return;
};
let captures = gm.get_current_player_captures();
let moves = gm.get_current_player_moves();
let current_player = gm.get_current_turn();
if let Some(result) = gm.get_game_result() {
info!("Game ended with result: {:?}", result);
self.handle_game_end(result).await;
}
if !captures.is_empty() {
debug!("Current captures: {:?}", captures);
self.send_player_captures(current_player, captures).await;
return;
}
if !moves.is_empty() {
debug!("Current moves: {:?}", moves);
self.send_player_moves(current_player, moves).await;
return;
}
panic!("on_player_action should never get here");
}
async fn send_player_captures(&mut self, current_player: Uuid, captures: Vec<CapturePath>) {
let Some(addr) = self.get_client_by_id(current_player) else {
error!("Could not get player connection, while sending him his captures!");
return;
};
let msg = Message::new(ServerMessage::AvailableCaptures { captures });
self.send_message(*addr, msg).await;
}
async fn send_player_moves(
&mut self,
current_player: Uuid,
moves: Vec<crate::logic::board::pawn::MovePath>,
) {
let Some(addr) = self.get_client_by_id(current_player) else {
error!("Could not get player connection, while sending him his moves!");
return;
};
let msg = Message::new(ServerMessage::AvailableMoves { moves });
self.send_message(*addr, msg).await;
}
async fn handle_game_end(&mut self, result: GameResult) {
let msg = Message::new(ServerMessage::GameEnd { result });
self.broadcast_message(msg).await;
self.state.stage = ServerStage::End;
} }
async fn broadcast_board_view(&mut self) { async fn broadcast_board_view(&mut self) {
@@ -396,7 +453,7 @@ impl Server {
match msg { match msg {
Ok(msg) => { Ok(msg) => {
for identity in self.connections.values_mut() { for identity in self.connections.values_mut() {
identity.sender.send(msg.clone()).await; let _ = identity.sender.send(msg.clone()).await;
} }
} }
Err(e) => { Err(e) => {
@@ -406,6 +463,13 @@ impl Server {
} }
} }
fn get_client_by_id(&self, id: Uuid) -> Option<&SocketAddr> {
self.connections
.iter()
.find(|(_, indentity)| indentity.identity.id == id)
.map(|(addr, _)| addr)
}
fn remove_client(&mut self, addr: SocketAddr) { fn remove_client(&mut self, addr: SocketAddr) {
warn!("Removing: {:?} from connection list", addr); warn!("Removing: {:?} from connection list", addr);
let is_ready = &mut self.connections.get_mut(&addr).expect("Couldn't get the identity of disconnected player. I don't think i should panic but i don't care fuck you").identity.is_ready; let is_ready = &mut self.connections.get_mut(&addr).expect("Couldn't get the identity of disconnected player. I don't think i should panic but i don't care fuck you").identity.is_ready;