cards/server/src/game_handler.rs

136 lines
3.9 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};
2024-08-10 19:50:26 -04:00
// This file is disgusting, don't look at it
2024-08-08 05:29:32 -04:00
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
let tx = self
.state
.online_users
.read()
.unwrap()
.get(&addr)
.unwrap()
.read()
.unwrap()
.tx
.clone();
2024-08-10 19:50:26 -04:00
tracing::debug!("{:#?}", &new_game_object);
let mut black_text = "Error".to_string();
if let Some(ref current_black) = new_game_object.current_black {
black_text = current_black.text.to_owned()
}
tracing::debug!("{:#?}", &new_game_object.white);
let meta = GameMeta {
name: new_game_object.name.clone(),
host: new_game_object.host.read().unwrap().name.clone(),
players: new_game_object
.players
.iter()
2024-08-11 19:51:30 -04:00
.map(|player| {
self.state
.user_uuid
.read()
.unwrap()
.get(&player.0)
.unwrap()
.read()
.unwrap()
.name
.clone()
})
2024-08-10 19:50:26 -04:00
.collect(),
czar: new_game_object.host.read().unwrap().name.clone(),
black: black_text,
white: new_game_object
2024-08-11 19:51:30 -04:00
.players
.get(&new_game_object.host.read().unwrap().uuid)
.unwrap()
2024-08-10 19:50:26 -04:00
.white
.iter()
.map(|card| card.text.clone())
.collect(),
};
tracing::debug!("{:#?}", &meta);
tx.send(serde_json::to_string(&meta).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();
}
}
}