From 95c1890a1e7fb1bfbcf76e5d14f1b0be431ad402 Mon Sep 17 00:00:00 2001 From: Tipragot Date: Fri, 12 Apr 2024 20:52:20 +0200 Subject: [PATCH] Fixed mon reuf --- crates/server/src dada/lib.rs | 42 ------- crates/server/src dada/main.rs | 182 ---------------------------- crates/server/src save/game.rs | 25 ---- crates/server/src save/game_save.rs | 68 ----------- crates/server/src save/lib dada.rs | 97 --------------- crates/server/src save/lib save.rs | 62 ---------- crates/server/src save/lib.rs | 64 ---------- crates/server/src save/login.rs | 20 --- crates/server/src save/main save.rs | 127 ------------------- crates/server/src save/main.rs | 62 ---------- crates/server/src save/utils.rs | 73 ----------- crates/server/src/lib.rs | 4 +- crates/server/src/main.rs | 7 +- 13 files changed, 7 insertions(+), 826 deletions(-) delete mode 100644 crates/server/src dada/lib.rs delete mode 100644 crates/server/src dada/main.rs delete mode 100644 crates/server/src save/game.rs delete mode 100644 crates/server/src save/game_save.rs delete mode 100644 crates/server/src save/lib dada.rs delete mode 100644 crates/server/src save/lib save.rs delete mode 100644 crates/server/src save/lib.rs delete mode 100644 crates/server/src save/login.rs delete mode 100644 crates/server/src save/main save.rs delete mode 100644 crates/server/src save/main.rs delete mode 100644 crates/server/src save/utils.rs diff --git a/crates/server/src dada/lib.rs b/crates/server/src dada/lib.rs deleted file mode 100644 index fa0eeff..0000000 --- a/crates/server/src dada/lib.rs +++ /dev/null @@ -1,42 +0,0 @@ -use std::hash::Hash; -use std::ops::{Deref, DerefMut}; - -use dashmap::mapref::multiple::RefMutMulti; -use dashmap::mapref::one::RefMut; - -pub enum GlobalRefMut<'a, K: Eq + Hash, V> { - Single(RefMut<'a, K, V>), - Multi(RefMutMulti<'a, K, V>), -} - -impl<'a, K: Eq + Hash, V> From> for GlobalRefMut<'a, K, V> { - fn from(v: RefMut<'a, K, V>) -> Self { - Self::Single(v) - } -} - -impl<'a, K: Eq + Hash, V> From> for GlobalRefMut<'a, K, V> { - fn from(v: RefMutMulti<'a, K, V>) -> Self { - Self::Multi(v) - } -} - -impl<'a, K: Eq + Hash, V> Deref for GlobalRefMut<'a, K, V> { - type Target = V; - - fn deref(&self) -> &Self::Target { - match self { - Self::Single(v) => v.value(), - Self::Multi(v) => v.value(), - } - } -} - -impl<'a, K: Eq + Hash, V> DerefMut for GlobalRefMut<'a, K, V> { - fn deref_mut(&mut self) -> &mut Self::Target { - match self { - Self::Single(v) => v.value_mut(), - Self::Multi(v) => v.value_mut(), - } - } -} diff --git a/crates/server/src dada/main.rs b/crates/server/src dada/main.rs deleted file mode 100644 index 11e2ed2..0000000 --- a/crates/server/src dada/main.rs +++ /dev/null @@ -1,182 +0,0 @@ -use std::collections::{HashMap, HashSet}; -use std::hash::RandomState; -use std::sync::Arc; - -use anyhow::{bail, Context}; -use axum::extract::ws::{Message, WebSocket}; -use axum::extract::WebSocketUpgrade; -use axum::routing::get; -use axum::Router; -use dashmap::mapref::entry::Entry; -use dashmap::mapref::multiple::RefMutMulti; -use dashmap::mapref::one::RefMut; -use dashmap::DashMap; -use futures::stream::{SplitSink, SplitStream}; -use futures::{SinkExt, StreamExt}; -use lazy_static::lazy_static; -use serde::de::DeserializeOwned; -use serde::{Deserialize, Serialize}; -use server::GlobalRefMut; -use slotmap::SlotMap; -use tokio::sync::mpsc::{channel, Receiver, Sender}; -use tokio::sync::RwLock; -use uuid::Uuid; - -#[derive(Clone)] -pub struct ConnectionSender(Sender>); - -impl ConnectionSender { - pub async fn send(&mut self, message: T) -> anyhow::Result<()> { - Ok(self.0.send(bincode::serialize(&message)?).await?) - } -} - -pub struct ConnectionReader(SplitStream); - -impl ConnectionReader { - pub async fn read(&mut self) -> anyhow::Result { - loop { - let Message::Binary(message) = self.0.next().await.context("no message")?? else { - continue; - }; - return Ok(bincode::deserialize(&message)?); - } - } -} - -#[tokio::main] -async fn main() { - let app = Router::new().route( - "/", - get(|ws: WebSocketUpgrade| async { - ws.on_upgrade(|socket| async { - let (mut sender, receiver) = socket.split(); - let (send_tx, mut send_rx) = channel(16); - tokio::spawn(async move { - while let Some(message) = send_rx.recv().await { - sender.send(Message::Binary(message)).await?; - } - Ok::<(), axum::Error>(()) - }); - if let Err(e) = handle(ConnectionSender(send_tx), ConnectionReader(receiver)).await - { - eprintln!("Error: {}", e); - } - }) - }), - ); - let listener = tokio::net::TcpListener::bind("0.0.0.0:80") - .await - .expect("failed to bind"); - axum::serve(listener, app).await.expect("failed to serve"); -} - -lazy_static! { - static ref LOBBIES: DashMap = DashMap::new(); -} - -#[derive(Serialize, Deserialize)] -enum LoginRequest { - CreateLobby { - username: String, - public: bool, - }, - JoinLobby { - lobby_id: Option, - username: String, - }, -} - -slotmap::new_key_type! { -struct ConnectionId;} - -struct Lobby { - id: Uuid, - public: bool, - connections: SlotMap, -} - -struct LobbyConnection { - sender: ConnectionSender, - username: String, - ready: bool, -} - -#[derive(Serialize, Deserialize)] -struct LobbyJoined(Uuid); - -#[derive(Serialize, Deserialize)] -struct IAmReady; - -async fn handle( - mut sender: ConnectionSender, - mut receiver: ConnectionReader, -) -> anyhow::Result<()> { - // Find or create a lobby - let login_request: LoginRequest = receiver.read().await?; - let (mut lobby, username) = match login_request { - LoginRequest::CreateLobby { username, public } => (create_lobby(public).await, username), - LoginRequest::JoinLobby { lobby_id, username } => ( - match lobby_id { - Some(id) => LOBBIES.get_mut(&id).context("lobby not found")?.into(), - None => match find_random_lobby().await { - Some(lobby) => lobby, - None => create_lobby(true).await, - }, - }, - username, - ), - }; - - // Add the user to the lobby - let lobby_id = lobby.id; - sender.send(LobbyJoined(lobby_id)).await?; - let connection_id = lobby.connections.insert(LobbyConnection { - sender, - username, - ready: false, - }); - drop(lobby); - - // Wait for the user to be ready - let disconnected = receiver.read::().await.is_err(); - - // Check to start the game - let Entry::Occupied(mut lobby) = LOBBIES.entry(lobby_id) else { - bail!("lobby not found"); - }; - if disconnected { - lobby.get_mut().connections.remove(connection_id); - } - - if lobby.get().connections.is_empty() { - LOBBIES.remove(&lobby_id); - return Ok(()); - } - let should_start = lobby.connections.iter().all(|(_, c)| c.ready); - - todo!() -} - -async fn create_lobby(public: bool) -> GlobalRefMut<'static, Uuid, Lobby> { - loop { - let id = Uuid::new_v4(); - if let Entry::Vacant(e) = LOBBIES.entry(id) { - break e - .insert(Lobby { - id, - public, - connections: SlotMap::with_key(), - }) - .into(); - } - } -} - -async fn find_random_lobby() -> Option> { - LOBBIES - .iter_mut() - .filter(|lobby| lobby.public) - .min_by_key(|lobby| lobby.connections.len()) - .map(GlobalRefMut::from) -} diff --git a/crates/server/src save/game.rs b/crates/server/src save/game.rs deleted file mode 100644 index d2ad7e2..0000000 --- a/crates/server/src save/game.rs +++ /dev/null @@ -1,25 +0,0 @@ -use dashmap::DashMap; -use lazy_static::lazy_static; -use server::SlotDashMap; -use slotmap::SlotMap; -use uuid::Uuid; - -server::new_key_type! { - struct GameId; -} - -lazy_static! { - static ref GAMES: SlotDashMap = SlotDashMap::new(); -} - -slotmap::new_key_type! { - struct PlayerId; -} - -pub struct Game { - players: SlotMap, -} - -pub struct Player { - connection_secret: Uuid, -} diff --git a/crates/server/src save/game_save.rs b/crates/server/src save/game_save.rs deleted file mode 100644 index b798aad..0000000 --- a/crates/server/src save/game_save.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::collections::{HashSet, LinkedList}; -use std::time::Duration; - -use rand::Rng; -use serde::{Deserialize, Serialize}; -use slotmap::SlotMap; -use uuid::Uuid; - -use crate::{receive_message, send_message}; - -slotmap::new_key_type! { - struct ActionId; -} - -#[derive(Serialize, Deserialize)] -struct Action { - title: String, - description: String, - next_actions: SlotMap, - tile_position: Option<(i32, i32)>, - image_id: Uuid, -} - -struct Player { - connection: Option, - secret: Uuid, -} - -impl Player { - fn get_random_action(actions: &SlotMap) -> LinkedList { - if actions.len() == 0 { - return LinkedList::new(); - } - let random_index = rand::thread_rng().gen_range(0..actions.len()); - let action = actions.iter().nth(random_index).unwrap(); - let mut result = LinkedList::new(); - result.push_back(action.0); - result.append(&mut Self::get_random_action(&action.1.next_actions)); - result - } - - async fn make_action( - &mut self, - actions: &SlotMap, - timeout: Duration, - ) -> LinkedList { - let Some(connection) = self.connection else { - return Self::get_random_action(actions); - }; - - let Ok(encoded_message) = bincode::serialize(actions) else { - return Self::get_random_action(actions); - }; - - if !send_message(connection, encoded_message).await { - return Self::get_random_action(actions); - } - - // Get the client response - match tokio::time::timeout(timeout, receive_message(connection)).await { - Ok(Some(response)) => match bincode::deserialize(&response) { - Ok(response) => response, - Err(_) => Self::get_random_action(actions), - }, - _ => Self::get_random_action(actions), - } - } -} diff --git a/crates/server/src save/lib dada.rs b/crates/server/src save/lib dada.rs deleted file mode 100644 index 1c1eb1d..0000000 --- a/crates/server/src save/lib dada.rs +++ /dev/null @@ -1,97 +0,0 @@ -use std::collections::{HashMap, HashSet}; - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct GameId(Uuid); - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct PlayerId(Uuid); - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct PlayerSecret(Uuid); - -#[derive(Serialize, Deserialize)] -pub struct PlayerProfile { - pub username: String, - pub image_id: Uuid, -} - -#[derive(Serialize, Deserialize)] -pub enum LoginRequest { - Create { - username: String, - }, - JoinRandom { - username: String, - }, - Join { - game_id: GameId, - username: String, - }, - Rejoin { - game_id: GameId, - player_id: PlayerId, - secret: PlayerSecret, - }, -} - -#[derive(Serialize, Deserialize)] -pub enum LoginResponse { - Refused(String), - Success(T), -} - -#[derive(Serialize, Deserialize)] -pub struct CreateResponse { - game_id: GameId, - player_id: PlayerId, - secret: PlayerSecret, - options: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct GameSettingField { - pub name: String, - pub description: String, - pub field_type: GameSettingFieldType, -} - -#[derive(Serialize, Deserialize)] -pub enum GameSettingFieldType { - Integer { min: i32, max: i32 }, - Decimal { min: f32, max: f32 }, - String { min_len: usize, max_len: usize }, - Choice { choices: HashSet }, - Boolean, -} - -#[derive(Serialize, Deserialize)] -pub enum GameSettingFieldValue { - Integer(i32), - Decimal(f32), - String(String), - Choice(String), - Boolean(bool), -} - -#[derive(Serialize, Deserialize)] -pub struct JoinRandomResponse { - game_id: GameId, - player_id: PlayerId, - secret: PlayerSecret, - players: HashMap, -} - -#[derive(Serialize, Deserialize)] -pub struct JoinResponse { - player_id: PlayerId, - secret: PlayerSecret, - players: HashMap, -} - -#[derive(Serialize, Deserialize)] -pub struct RejoinResponse { - players: HashMap, -} diff --git a/crates/server/src save/lib save.rs b/crates/server/src save/lib save.rs deleted file mode 100644 index f2c5429..0000000 --- a/crates/server/src save/lib save.rs +++ /dev/null @@ -1,62 +0,0 @@ -use std::marker::PhantomData; - -use dashmap::mapref::entry::Entry; -use dashmap::DashMap; -use uuid::Uuid; - -pub trait UuidKey: From { - fn to_uuid(&self) -> Uuid; -} - -pub struct SlotDashMap(DashMap, PhantomData); - -impl SlotDashMap { - pub fn new() -> Self { - Self(DashMap::new(), PhantomData) - } - - pub fn insert(&self, value: V) -> K { - loop { - let id = Uuid::new_v4(); - let Entry::Vacant(entry) = self.0.entry(id) else { - continue; - }; - entry.insert(value); - return K::from(id); - } - } -} - -impl Default for SlotDashMap { - fn default() -> Self { - Self::new() - } -} - -#[macro_export] -macro_rules! new_key_type { - ( $(#[$outer:meta])* $vis:vis struct $name:ident; $($rest:tt)* ) => { - $(#[$outer])* - #[derive(Copy, Clone, Default, - Eq, PartialEq, Ord, PartialOrd, - Hash, Debug)] - #[repr(transparent)] - $vis struct $name(::uuid::Uuid); - - impl ::core::convert::From<::uuid::Uuid> for $name { - fn from(k: ::uuid::Uuid) -> Self { - $name(k) - } - } - - impl $crate::UuidKey for $name { - fn to_uuid(&self) -> ::uuid::Uuid { - self.0 - } - } - - $crate::new_key_type!($($rest)*); - }; - - () => {} -} diff --git a/crates/server/src save/lib.rs b/crates/server/src save/lib.rs deleted file mode 100644 index 6698b14..0000000 --- a/crates/server/src save/lib.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::collections::HashMap; - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct LobbyId(Uuid); - -#[derive(Serialize, Deserialize)] -pub struct Lobby { - id: LobbyId, - public: bool, - players: HashMap, -} - -#[derive(Serialize, Deserialize)] -pub struct LobbyPlayer { - username: String, - ready: bool, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct PlayerId(Uuid); - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct GameId(Uuid); - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct RejoinToken(Uuid); - -#[derive(Serialize, Deserialize)] -pub enum LoginRequest { - CreateLobby { - username: String, - public: bool, - }, - JoinLobby { - lobby_id: Option, - username: String, - }, - RejoinGame { - token: RejoinToken, - }, -} - -#[derive(Serialize, Deserialize)] -pub struct LobbyJoined { - player_id: PlayerId, - lobby: Lobby, -} - -#[derive(Serialize, Deserialize)] -pub enum LobbyClientPacket { - Ready(bool), -} - -#[derive(Serialize, Deserialize)] -pub enum LobbyServerPacket { - LobbyUpdated(Lobby), - GameStarted(GameId, RejoinToken), -} - -#[derive(Serialize, Deserialize)] -pub struct RejoinResponse; diff --git a/crates/server/src save/login.rs b/crates/server/src save/login.rs deleted file mode 100644 index f18e4cf..0000000 --- a/crates/server/src save/login.rs +++ /dev/null @@ -1,20 +0,0 @@ -use anyhow::{bail, Context}; -use axum::extract::ws::{Message, WebSocket}; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -#[derive(Serialize, Deserialize)] -pub enum LoginRequest { - Create { username: String }, -} - -pub async fn handle_client_login(socket: &mut WebSocket) -> anyhow::Result<()> { - let Message::Binary(login_data) = socket.recv().await.context("client disconnected")?? else { - bail!("expected login request"); - }; - - let login_request = bincode::deserialize(&login_data)?; - match login_request { - LoginRequest::Create { username } => todo!(), - } -} diff --git a/crates/server/src save/main save.rs b/crates/server/src save/main save.rs deleted file mode 100644 index 163446d..0000000 --- a/crates/server/src save/main save.rs +++ /dev/null @@ -1,127 +0,0 @@ -use std::collections::LinkedList; - -use anyhow::{bail, Context}; -use axum::extract::ws::{Message, WebSocket}; -use axum::extract::WebSocketUpgrade; -use axum::routing::get; -use axum::Router; -use dashmap::mapref::entry::Entry; -use dashmap::DashMap; -use futures::{SinkExt, StreamExt}; -use lazy_static::lazy_static; -use serde::de::DeserializeOwned; -use serde::{Deserialize, Serialize}; -use slotmap::SlotMap; -use tokio::sync::mpsc::{channel, Receiver, Sender}; -use uuid::Uuid; - -slotmap::new_key_type! { - struct PlayerId; -} - -enum WorldModification { - SetTile { r: i32, s: i32, image_id: Uuid }, -} - -struct Player { - connection_secret: Uuid, - unsent_modifications: LinkedList, -} - -pub struct Game { - players: SlotMap, -} - -trait Request: DeserializeOwned + Serialize { - type Response: Response; -} - -trait Response: DeserializeOwned + Serialize {} - -lazy_static! { - static ref CLIENTS: DashMap>> = DashMap::new(); - static ref GAMES: DashMap = DashMap::new(); -} - -#[derive(Serialize, Deserialize)] -pub enum LoginRequest { - Create { pseudo: String }, - JoinRandom { pseudo: String }, - Join { game_id: Uuid, pseudo: String }, - Rejoin { game_id: Uuid }, -} - -#[tokio::main] -async fn main() { - let app = Router::new().route( - "/", - get(|ws: WebSocketUpgrade| async { - ws.on_upgrade(|socket| async { - if let Err(e) = handle(socket).await { - eprintln!("Error: {}", e); - } - }) - }), - ); - let listener = tokio::net::TcpListener::bind("0.0.0.0:80") - .await - .expect("failed to bind"); - axum::serve(listener, app).await.expect("failed to serve"); -} - -async fn handle(mut socket: WebSocket) -> anyhow::Result<()> { - let Message::Binary(data) = socket - .recv() - .await - .context("client disconnected before login")?? - else { - bail!("expected login request"); - }; - - let login_request = bincode::deserialize(&data)?; - match login_request { - LoginRequest::Create { pseudo } => todo!(), - LoginRequest::JoinRandom { pseudo } => todo!(), - LoginRequest::Join { game_id, pseudo } => todo!(), - LoginRequest::Rejoin { game_id } => todo!(), - } - - let (mut writer, mut reader) = socket.split(); - - let (global_sender, mut receiver) = channel(128); - let client_id = loop { - let id = Uuid::new_v4(); - let Entry::Vacant(entry) = CLIENTS.entry(id) else { - continue; - }; - entry.insert(global_sender); - break id; - }; - - tokio::spawn(async move { - while let Some(message) = receiver.recv().await { - writer.send(Message::Binary(message)).await?; - } - Ok::<(), axum::Error>(()) - }); - - while let Some(Ok(message)) = reader.next().await { - let Message::Binary(data) = message else { - continue; - }; - - todo!() - } - - CLIENTS.remove(&client_id); - - Ok(()) -} - -async fn send_message(id: Uuid, message: Vec) -> bool { - if let Some(sender) = CLIENTS.get(&id) { - sender.send(message).await.is_ok() - } else { - false - } -} diff --git a/crates/server/src save/main.rs b/crates/server/src save/main.rs deleted file mode 100644 index 5deffdd..0000000 --- a/crates/server/src save/main.rs +++ /dev/null @@ -1,62 +0,0 @@ -use std::collections::HashMap; - -use anyhow::{bail, Context}; -use axum::extract::ws::{Message, WebSocket}; -use axum::extract::WebSocketUpgrade; -use axum::routing::get; -use axum::Router; -use dashmap::mapref::entry::Entry; -use dashmap::DashMap; -use lazy_static::lazy_static; -use serde::{Deserialize, Serialize}; -use server::{GameId, Lobby, LobbyId, LoginRequest, PlayerId}; -use uuid::Uuid; - -lazy_static! { - static ref LOBBIES: DashMap = DashMap::new(); - // static ref GAMES: DashMap = DashMap::new(); -} - -#[tokio::main] -async fn main() { - let app = Router::new().route( - "/", - get(|ws: WebSocketUpgrade| async { - ws.on_upgrade(|socket| async { - if let Err(e) = handle(socket).await { - eprintln!("Error: {}", e); - } - }) - }), - ); - let listener = tokio::net::TcpListener::bind("0.0.0.0:80") - .await - .expect("failed to bind"); - axum::serve(listener, app).await.expect("failed to serve"); -} - -async fn handle(mut socket: WebSocket) -> anyhow::Result<()> { - let Message::Binary(login_data) = socket.recv().await.context("client disconnected")?? else { - bail!("expected login request"); - }; - let login_request = bincode::deserialize(&login_data)?; - match login_request { - LoginRequest::CreateLobby { username, public } => { - let lobby_id = loop { - let id = Uuid::new_v4(); - let Entry::Vacant(entry) = LOBBIES.entry(LobbyId(id)) else { - continue; - }; - entry.insert() - } - } - LoginRequest::JoinLobby { lobby_id, username } => todo!(), - LoginRequest::RejoinGame { token } => todo!(), - } - - Ok(()) -} - -async fn handle_game_creation(mut socket: WebSocket, username: String) -> anyhow::Result<()> { - Ok(()) -} diff --git a/crates/server/src save/utils.rs b/crates/server/src save/utils.rs deleted file mode 100644 index cc67605..0000000 --- a/crates/server/src save/utils.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::marker::PhantomData; - -use dashmap::mapref::entry::Entry; -use dashmap::DashMap; -use uuid::Uuid; - -pub trait UuidKey: From + Copy { - fn to_uuid(&self) -> Uuid; -} - -#[macro_export] -macro_rules! new_id_type { - ( $($vis:vis struct $name:ident;)* ) => { - $( - #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, ::serde::Serialize, ::serde::Deserialize)] - $vis struct $name(::uuid::Uuid); - - impl ::core::convert::From<::uuid::Uuid> for $name { - fn from(k: ::uuid::Uuid) -> Self { - $name(k) - } - } - - impl $crate::utils::UuidKey for $name { - fn to_uuid(&self) -> ::uuid::Uuid { - self.0 - } - } - )* - }; -} - -pub struct IdDashMap(DashMap, PhantomData); - -impl IdDashMap { - pub fn new() -> Self { - Self(DashMap::new(), PhantomData) - } - - pub fn insert(&self, value: V) -> K { - loop { - let id = Uuid::new_v4(); - let Entry::Vacant(entry) = self.0.entry(id) else { - continue; - }; - entry.insert(value); - return K::from(id); - } - } - - pub fn insert_with_id(&self, create_value: impl FnOnce(K) -> V) -> K { - loop { - let id = Uuid::new_v4(); - let Entry::Vacant(entry) = self.0.entry(id) else { - continue; - }; - let id = K::from(id); - let value = create_value(id); - entry.insert(value); - return id; - } - } - - pub fn remove(&self, id: K) { - self.0.remove(&id.to_uuid()); - } -} - -impl Default for IdDashMap { - fn default() -> Self { - Self::new() - } -} diff --git a/crates/server/src/lib.rs b/crates/server/src/lib.rs index f3b07fc..4fd27df 100644 --- a/crates/server/src/lib.rs +++ b/crates/server/src/lib.rs @@ -25,13 +25,13 @@ pub enum ServerPacket { LobbyUpdated(Lobby), } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] pub struct Lobby { pub public: bool, pub players: HashMap, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] pub struct LobbyPlayer { pub username: String, pub ready: bool, diff --git a/crates/server/src/main.rs b/crates/server/src/main.rs index 2ee6c66..c8c231a 100644 --- a/crates/server/src/main.rs +++ b/crates/server/src/main.rs @@ -5,7 +5,6 @@ use axum::extract::ws::{Message, WebSocket}; use axum::extract::WebSocketUpgrade; use axum::routing::get; use axum::Router; -use dashmap::DashMap; use futures::{SinkExt, StreamExt}; use lazy_static::lazy_static; use log::warn; @@ -117,6 +116,8 @@ async fn handle_unauthenticated(client_id: Uuid, packet: ClientPacket) { }, )]), }; + let message = bincode::serialize(&ServerPacket::LobbyUpdated(lobby.clone())) + .expect("failed to serialize lobby"); let mut lobbies = LOBBIES.write().await; lobbies.insert(lobby_id, lobby); CLIENTS @@ -126,6 +127,7 @@ async fn handle_unauthenticated(client_id: Uuid, packet: ClientPacket) { .expect("client not found") .status = ClientStatus::InLobby(lobby_id); send_packet(client_id, ServerPacket::LobbyJoined(lobby_id)).await; + send_message(client_id, message).await; } ClientPacket::JoinLobby { lobby_id, username } => { let mut lobbies = LOBBIES.write().await; @@ -178,7 +180,8 @@ async fn handle_unauthenticated(client_id: Uuid, packet: ClientPacket) { .status = ClientStatus::InLobby(lobby_id); send_packet(client_id, ServerPacket::LobbyJoined(lobby_id)).await; - let message = bincode::serialize(&lobby).expect("failed to serialize lobby"); + let message = bincode::serialize(&ServerPacket::LobbyUpdated(lobby.clone())) + .expect("failed to serialize lobby"); // PAS BON for player_id in lobby.players.keys() { send_message(*player_id, &message).await; }