cards/server/src/game_handler.rs
2024-08-09 01:21:04 -04:00

78 lines
2 KiB
Rust

use crate::user_handler::*;
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<User>,
game_name: String,
},
}
pub struct GameHandler {
state: Arc<AppState>,
}
impl GameHandler {
pub fn new(state: Arc<AppState>) -> Self {
GameHandler { state }
}
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: new_game.name,
host: self
.state
.online_users
.read()
.unwrap()
.get(&addr)
.unwrap()
.clone(),
};
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(),
Arc::new(RwLock::new(new_game_object)),
);
self.state
.broadcast_tx
.send(meta_games_browser_update(&self.state))
.unwrap();
self.state
.broadcast_tx
.send(meta_server_summary_update(&self.state))
.unwrap();
}
}
}