From c2e29415c9a1a145ed5fbd2e526de6c5a69d243a Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 12 Nov 2025 15:54:03 +0100 Subject: [PATCH] added new event system to handle different client events in game and on connection --- server/src/events.rs | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 server/src/events.rs diff --git a/server/src/events.rs b/server/src/events.rs new file mode 100644 index 0000000..0d836b5 --- /dev/null +++ b/server/src/events.rs @@ -0,0 +1,77 @@ +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use tokio::sync::Mutex; +use tokio::sync::mpsc; +use uuid::Uuid; + +#[derive(Serialize, Deserialize, Debug)] +pub struct Step { + pub from: String, + pub to: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "type")] +pub enum ClientEvent { + Join { username: String }, + FindMatch, + Move { from: String, to: String }, + Resign, + Chat { text: String }, + RequestLegalMoves { fen: String }, +} + +#[derive(Debug)] +pub enum ServerEvent { + PlayerJoined(Uuid, String), + PlayerLeft(Uuid), + PlayerJoinedQueue(Uuid), + PlayerJoinedMatch(Uuid, Uuid), // player_id, match_id + PlayerMove(Uuid, Step), + PlayerResigned(Uuid), + MatchCreated(Uuid, Uuid, Uuid), // match_id, white_id, black_id +} + +pub struct EventSystem { + sender: mpsc::UnboundedSender<(Uuid, ClientEvent)>, + receiver: Arc>>, +} + +impl Clone for EventSystem { + fn clone(&self) -> Self { + Self { + sender: self.sender.clone(), + receiver: Arc::clone(&self.receiver), + } + } +} + +impl EventSystem { + pub fn new() -> Self { + let (sender, receiver) = mpsc::unbounded_channel(); + Self { + sender, + receiver: Arc::new(Mutex::new(receiver)), + } + } + + pub async fn send_event( + &self, + player_id: Uuid, + event: ClientEvent, + ) -> Result<(), Box> { + self.sender.send((player_id, event))?; + Ok(()) + } + + pub async fn next_event(&self) -> Option<(Uuid, ClientEvent)> { + let mut receiver = self.receiver.lock().await; + receiver.recv().await + } +} + +impl Default for EventSystem { + fn default() -> Self { + Self::new() + } +}