cards/server/src/game_handler.rs

117 lines
3.4 KiB
Rust
Raw Normal View History

2024-08-08 05:29:32 -04:00
use crate::user_handler::*;
use crate::AppState;
use crate::Game;
use crate::NewGameManifest;
use crate::NewGameRequest;
2024-08-09 01:21:04 -04:00
use crate::User;
2024-08-09 02:57:27 -04:00
use lib::*;
2024-08-08 05:29:32 -04:00
use std::net::SocketAddr;
use std::sync::{Arc, RwLock};
/// Handle incoming messages over the WebSocket
2024-08-09 01:21:04 -04:00
pub enum GameHandlerMessage {
NewGame {
addr: SocketAddr,
new_game: NewGameRequest,
},
JoinGame {
user: Arc<User>,
game_name: String,
},
}
2024-08-08 05:29:32 -04:00
pub struct GameHandler {
state: Arc<AppState>,
}
impl GameHandler {
pub fn new(state: Arc<AppState>) -> Self {
GameHandler { state }
}
2024-08-09 01:21:04 -04:00
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;
}
2024-08-08 05:29:32 -04:00
let manifest = NewGameManifest {
2024-08-09 01:21:04 -04:00
name: new_game.name,
2024-08-08 05:29:32 -04:00
host: self
.state
.online_users
.read()
.unwrap()
2024-08-09 01:21:04 -04:00
.get(&addr)
2024-08-08 05:29:32 -04:00
.unwrap()
.clone(),
};
2024-08-09 01:21:04 -04:00
tracing::debug!("Game Packs {:?}", new_game.packs);
2024-08-08 05:29:32 -04:00
// create game
if let Ok(new_game_object) = Game::new(manifest) {
2024-08-09 02:57:27 -04:00
tracing::debug!("{:#?}", &new_game_object);
let tx = self
.state
.online_users
.read()
.unwrap()
.get(&addr)
.unwrap()
.read()
.unwrap()
.tx
.clone();
tx.send(
serde_json::to_string(&GameMeta {
name: new_game_object.name.clone(),
// host: new_game_object.host.read().unwrap().name.clone(),
// players: new_game_object
// .players
// .iter()
// .map(|player| player.user.read().unwrap().name)
// .collect(),
// czar: new_game_object.host.read().unwrap().name.clone(),
// black: new_game_object
// .current_black
// .clone()
// .unwrap()
// .text
// .clone()
// .to_string()
// .clone(),
// white: new_game_object.white.iter().map(|card| card.text).collect(),
})
.unwrap(),
)
.await
.unwrap();
2024-08-09 01:21:04 -04:00
self.state.games.write().unwrap().insert(
new_game_object.name.clone(),
Arc::new(RwLock::new(new_game_object)),
);
2024-08-08 05:29:32 -04:00
self.state
.broadcast_tx
.send(meta_games_browser_update(&self.state))
.unwrap();
self.state
.broadcast_tx
.send(meta_server_summary_update(&self.state))
.unwrap();
}
}
}