feat: add sending text messages

This commit is contained in:
2026-08-16 16:13:27 +02:00
parent febb0adc43
commit 3fb10c7c69
4 changed files with 71 additions and 30 deletions

View File

@@ -1,3 +1,5 @@
use std::io;
use checkers::network::client::Client;
#[tokio::main]
@@ -5,7 +7,20 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
let mut client: Client = Client::new().await;
client.update().await;
client.update();
println!("=== Write to stding to send text messages ===");
println!("Write /close to leave");
let mut buffer = String::new();
loop {
io::stdin().read_line(&mut buffer)?;
if buffer == "/close\n" {
break;
}
client.send_text_message(buffer.clone()).await;
buffer.clear();
}
return Ok(());
}

View File

@@ -5,16 +5,20 @@ use tokio::sync::mpsc::{self, Receiver, Sender};
use crate::network::{
connection::{Connection, ConnectionType},
message::{ClientMessage, Message, ServerMessage},
message::{
ClientMessage::{self, TextMessage},
Message, ServerMessage,
},
};
#[derive(Clone)]
pub struct ClientSettings {
server_url: SocketAddr,
name: String,
}
pub struct Client {
conn_reciever_incoming: Receiver<(SocketAddr, Message<ServerMessage>)>,
conn_reciever_incoming: Option<Receiver<(SocketAddr, Message<ServerMessage>)>>,
conn_sender_outgoing: Sender<Message<ClientMessage>>,
settings: ClientSettings,
}
@@ -41,37 +45,53 @@ impl Client {
});
Client {
conn_reciever_incoming: conn_reciever,
conn_reciever_incoming: Some(conn_reciever),
conn_sender_outgoing,
settings,
}
}
pub async fn update(&mut self) {
loop {
if let Some(oldest_msg) = self.conn_reciever_incoming.recv().await {
let (addr, msg) = oldest_msg;
info!("Got message from: {:?}", addr);
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;
};
match msg.content {
ServerMessage::RequestHandshake => {
info!("Server requested handshake!");
let msg = Message::new(ClientMessage::AnswerHandshake {
player_name: self.settings.name.clone(),
});
let sender = self.conn_sender_outgoing.clone();
self.send_message(msg).await;
let settings = self.settings.clone();
tokio::spawn(async move {
loop {
if let Some(oldest_msg) = conn_reciever_incoming.recv().await {
let (addr, msg) = oldest_msg;
info!("Got message from: {:?}", addr);
match msg.content {
ServerMessage::RequestHandshake => {
info!("Server requested handshake!");
let msg = Message::new(ClientMessage::AnswerHandshake {
player_name: settings.name.clone(),
});
let _ = sender.send(msg.unwrap()).await;
}
ServerMessage::AcceptHandshake { player_id } => todo!(),
ServerMessage::DeclineHandshake { reason } => todo!(),
ServerMessage::AvailableCaptures { captures } => todo!(),
ServerMessage::AvailableMoves { moves } => todo!(),
ServerMessage::BroadcastBoardState { board } => todo!(),
ServerMessage::BroadcastCurrentTurn { active_player } => todo!(),
ServerMessage::GameEnd { result } => todo!(),
}
ServerMessage::AcceptHandshake { player_id } => todo!(),
ServerMessage::DeclineHandshake { reason } => todo!(),
ServerMessage::AvailableCaptures { captures } => todo!(),
ServerMessage::AvailableMoves { moves } => todo!(),
ServerMessage::BroadcastBoardState { board } => todo!(),
ServerMessage::BroadcastCurrentTurn { active_player } => todo!(),
ServerMessage::GameEnd { result } => todo!(),
}
}
}
});
}
pub async fn send_text_message(&mut self, content: String) {
let msg = Message::new(TextMessage(content));
self.send_message(msg).await;
}
async fn send_message(&mut self, msg: Result<Message<ClientMessage>, postcard::Error>) {

View File

@@ -1,4 +1,4 @@
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use uuid::Uuid;
use crate::logic::{
@@ -53,6 +53,8 @@ pub enum ClientMessage {
RequestCapture { capture_path: CapturePath },
RequestMove { from: Position, to: Position },
TextMessage(String),
}
pub struct Message<T>

View File

@@ -120,11 +120,11 @@ impl Server {
msg_opt = self.reciever.recv() => {
if let Some(oldest_message) = msg_opt {
let (_addr, msg) = oldest_message;
let (addr, msg) = oldest_message;
match msg.content {
ClientMessage::AnswerHandshake { player_name: _ } => {
self.process_handshake();
ClientMessage::AnswerHandshake { player_name } => {
self.process_handshake(addr, player_name);
}
ClientMessage::RequestCapture { capture_path: _ } => {
self.process_capture();
@@ -132,6 +132,9 @@ impl Server {
ClientMessage::RequestMove { from: _, to: _ } => {
self.process_move();
}
ClientMessage::TextMessage (content) => {
info!("{} sent us a message: {}", addr, content);
}
}
} else {
warn!("Couldn't get latest message!");
@@ -144,8 +147,9 @@ impl Server {
/* ======= Processing messages :D helper functions ======== */
fn process_handshake(&self) {
todo!();
fn process_handshake(&self, addr: SocketAddr, player_name: String) {
info!("Client: {:?} sent us his name: {}", addr, player_name);
// TODO! Do something with this name i guess
}
fn process_capture(&self) {