@@ -37,6 +38,8 @@ pub fn Home() -> impl IntoView {
+
+
diff --git a/server/src/game_handler.rs b/server/src/game_handler.rs
index b596f58..221d47f 100644
--- a/server/src/game_handler.rs
+++ b/server/src/game_handler.rs
@@ -3,11 +3,22 @@ use crate::AppState;
use crate::Game;
use crate::NewGameManifest;
use crate::NewGameRequest;
+use crate::User;
use std::net::SocketAddr;
use std::sync::{Arc, RwLock};
/// Handle incoming messages over the WebSocket
+pub enum GameHandlerMessage {
+ NewGame {
+ addr: SocketAddr,
+ new_game: NewGameRequest,
+ },
+ JoinGame {
+ user: Arc
,
+ game_name: String,
+ },
+}
pub struct GameHandler {
state: Arc,
}
@@ -17,27 +28,43 @@ impl GameHandler {
GameHandler { state }
}
- pub async fn handle(&self, message: (SocketAddr, NewGameRequest)) {
+ pub async fn handle(&self, message: GameHandlerMessage) {
+ match message {
+ GameHandlerMessage::NewGame { addr, new_game } => self.new_game(addr, new_game).await,
+ _ => {
+ tracing::debug!("Unhandled at game handler");
+ }
+ }
+ }
+
+ async fn new_game(&self, addr: SocketAddr, new_game: NewGameRequest) {
+ if new_game.packs.is_empty() {
+ tracing::debug!("Cards are empty");
+ return;
+ } else if new_game.name.is_empty() {
+ tracing::debug!("Name are empty");
+ return;
+ }
+
let manifest = NewGameManifest {
- name: message.1.name,
+ name: new_game.name,
host: self
.state
.online_users
.read()
.unwrap()
- .get(&message.0)
+ .get(&addr)
.unwrap()
.clone(),
};
- tracing::debug!("Game Packs {:?}", message.1.packs);
+ tracing::debug!("Game Packs {:?}", new_game.packs);
// create game
if let Ok(new_game_object) = Game::new(manifest) {
- self.state
- .games
- .write()
- .unwrap()
- .insert(new_game_object.name.clone(), RwLock::new(new_game_object));
+ self.state.games.write().unwrap().insert(
+ new_game_object.name.clone(),
+ Arc::new(RwLock::new(new_game_object)),
+ );
self.state
.broadcast_tx
.send(meta_games_browser_update(&self.state))
diff --git a/server/src/lib.rs b/server/src/lib.rs
index 59faccd..d5da201 100644
--- a/server/src/lib.rs
+++ b/server/src/lib.rs
@@ -2,6 +2,7 @@
use anyhow::{Context, Result};
use axum::extract::ws::Message;
+use game_handler::GameHandlerMessage;
use lib::*;
use rand::prelude::IteratorRandom;
use rand::thread_rng;
@@ -364,7 +365,7 @@ pub struct AppState {
pub broadcast_tx: broadcast::Sender,
pub users_tx: mpsc::Sender,
pub messages_tx: mpsc::Sender<(SocketAddr, Message)>,
- pub games_tx: mpsc::Sender<(SocketAddr, NewGameRequest)>,
+ pub games_tx: mpsc::Sender,
pub first_names: Vec,
pub last_names: Vec,
pub reserved_names: RwLock>,
@@ -372,5 +373,5 @@ pub struct AppState {
pub offline_users: RwLock>>>,
pub packs: CardPacks,
pub packs_meta: CardPacksMeta,
- pub games: RwLock>>,
+ pub games: RwLock>>>,
}
diff --git a/server/src/message_handler.rs b/server/src/message_handler.rs
index faebf1e..3cc6f02 100644
--- a/server/src/message_handler.rs
+++ b/server/src/message_handler.rs
@@ -1,5 +1,6 @@
use crate::user_handler::*;
use crate::AppState;
+use crate::GameHandlerMessage;
use axum::extract::ws::{CloseFrame, Message};
use lib::*;
use serde_json::{from_str, to_string};
@@ -41,7 +42,11 @@ impl MessageHandler {
tracing::debug!("passed login to user handler");
}
_new_game if let Ok(new_game) = from_str::(&text) => {
- self.state.games_tx.send((addr, new_game)).await.unwrap();
+ self.state
+ .games_tx
+ .send(GameHandlerMessage::NewGame { addr, new_game })
+ .await
+ .unwrap();
}
_ => tracing::debug!("Unhandled text from {}", addr),
diff --git a/server/src/user_handler.rs b/server/src/user_handler.rs
index 7444823..dffa1fb 100644
--- a/server/src/user_handler.rs
+++ b/server/src/user_handler.rs
@@ -5,6 +5,8 @@ use serde_json::to_string;
use std::net::SocketAddr;
use std::sync::{Arc, RwLock};
+// This file is a mess, don't read it
+
pub enum UserHandlerMessage {
NewUser { user: User, addr: SocketAddr },
UserLogIn { username: String, addr: SocketAddr },
@@ -50,6 +52,7 @@ impl UserHandler {
tx.send(meta_games_browser_update(&self.state))
.await
.unwrap();
+
tx.send(meta_new_game_card_packs(&self.state))
.await
.unwrap();
@@ -134,6 +137,14 @@ impl UserHandler {
old_name,
new_name
};
+ dm.send(
+ serde_json::to_string(&ChatMessage {
+ text: "Welcome back!".to_string(),
+ })
+ .unwrap(),
+ )
+ .await
+ .unwrap();
tracing::debug!("{msg}");
} else if self
@@ -144,6 +155,23 @@ impl UserHandler {
.contains(&new_name)
{
tracing::debug!("name is taken");
+ dm.send(
+ serde_json::to_string(&ChatMessage {
+ text: "Name is taken".to_string(),
+ })
+ .unwrap(),
+ )
+ .await
+ .unwrap();
+ tracing::debug!("{}", old_name.clone());
+ dm.send(
+ to_string::(&UserUpdate {
+ username: old_name.clone(),
+ })
+ .unwrap(),
+ )
+ .await
+ .unwrap();
} else {
self.state
.online_users
@@ -173,6 +201,16 @@ impl UserHandler {
.send(to_string::(&ChatMessage { text: msg }).unwrap())
.unwrap();
tracing::debug!("Name {} reserved.", &new_name);
+
+ // send the user their new name
+ dm.send(
+ to_string::(&UserUpdate {
+ username: new_name.clone(),
+ })
+ .unwrap(),
+ )
+ .await
+ .unwrap();
}
tracing::debug!(
@@ -186,16 +224,6 @@ impl UserHandler {
.unwrap();
broadcast.send(meta_chat_update(&self.state)).unwrap();
- // send the user their new name
- dm.send(
- to_string::(&UserUpdate {
- username: new_name.clone(),
- })
- .unwrap(),
- )
- .await
- .unwrap();
-
tracing::debug!(" HI! login received {} {} {}", addr, new_name, old_name)
}
}