From f7a1f66667ff3b04297449b75ab52919bae8e02f Mon Sep 17 00:00:00 2001 From: Adam Doyle Date: Fri, 11 Oct 2024 23:09:19 -0400 Subject: [PATCH] let game handler handle game things --- server/src/game_handler.rs | 58 ++++++++++++++++++++++---------------- server/src/user_handler.rs | 31 ++++---------------- 2 files changed, 39 insertions(+), 50 deletions(-) diff --git a/server/src/game_handler.rs b/server/src/game_handler.rs index 0247e2a..face585 100644 --- a/server/src/game_handler.rs +++ b/server/src/game_handler.rs @@ -6,6 +6,7 @@ use crate::GameHandlerMessage::*; use crate::SendUserMessage::*; use crate::UserHandlerMessage::*; use lib::*; +use serde_json::to_string; use std::{ net::SocketAddr, sync::{Arc, RwLock}, @@ -21,6 +22,7 @@ pub enum GameHandlerMessage { DeleteGame(GameDeleteRequest), SendGameStateUpdate(Vec), SendGameMetaUpdate(Vec), + BroadcastGamesUpdate(), } /// Handles game stuff @@ -45,6 +47,7 @@ impl GameHandler { DeleteGame(request) => self.delete_game(request).await, SendGameStateUpdate(game_ids) => self.send_game_state_update_all(game_ids), SendGameMetaUpdate(game_ids) => self.send_game_meta_update(game_ids), + BroadcastGamesUpdate() => self.broadcast_games_update(), } } @@ -59,14 +62,7 @@ impl GameHandler { .remove(&request.delete_game_id) .is_some() { - // Broadcast game browser update - if let Err(e) = self - .state - .broadcast_tx - .send(meta_games_browser_update(&self.state)) - { - tracing::error!("Error broadcasting game browser update: {}", e); - } + self.broadcast_games_update(); } else { tracing::error!("User tried to delete a nonexistent game!"); } @@ -206,14 +202,7 @@ impl GameHandler { // Send updates for all players self.send_game_meta_update(vec![game_id.clone()]); - // Broadcast game browser update - if let Err(e) = self - .state - .broadcast_tx - .send(meta_games_browser_update(&self.state)) - { - tracing::error!("Could not broadcast game browser update: {}", e); - }; + self.broadcast_games_update(); // Broadcast server meta update if let Err(e) = self @@ -394,14 +383,7 @@ impl GameHandler { self.send_game_state_update_all(vec![game_id.clone()]); self.send_game_meta_update(vec![game_id]); - // Broadcast game browser update - let msg = meta_games_browser_update(&self.state); - let tx = self.state.broadcast_tx.clone(); - tokio::spawn(async move { - if let Err(e) = tx.send(msg) { - tracing::error!("Could not broadcast game browser update: {}", e); - } - }); + self.broadcast_games_update(); // Broadcast server meta update let msg = meta_server_summary_update(&self.state); @@ -415,4 +397,32 @@ impl GameHandler { tracing::error!("Attempted to create game for nonexistent player!"); } } + + /// Generate games list update + fn broadcast_games_update(&self) { + // TODO: this may get expensive if there are many games + + let games = self + .state + .games + .read() + .unwrap() + .values() + .map(|game| GameBrowserMeta { + uuid: game.read().unwrap().uuid.to_string(), + name: game.read().unwrap().name.clone(), + host: game.read().unwrap().host.read().unwrap().name.clone(), + players: game.read().unwrap().players.len(), + packs: game.read().unwrap().packs.clone(), + }) + .collect::>(); + + let msg = to_string::(&GamesUpdate { games }).unwrap(); + let tx = self.state.broadcast_tx.clone(); + tokio::spawn(async move { + if let Err(e) = tx.send(msg) { + tracing::error!("Error broadcasting games update: {}", e); + } + }); + } } diff --git a/server/src/user_handler.rs b/server/src/user_handler.rs index eb7cbdf..33ee27f 100644 --- a/server/src/user_handler.rs +++ b/server/src/user_handler.rs @@ -135,8 +135,8 @@ impl UserHandler { .insert(addr, new_user.clone()); // Hydrate client - let tx = user_tx.clone(); - let msg = meta_games_browser_update(&self.state); + let tx = self.state.games_tx.clone(); + let msg = GameHandlerMessage::BroadcastGamesUpdate(); tokio::spawn(async move { tx.send(msg).await }); let tx = user_tx.clone(); let msg = meta_new_game_card_packs(&self.state); @@ -303,9 +303,9 @@ impl UserHandler { } } // Send client updates - let tx = broadcast_tx.clone(); - let msg = meta_games_browser_update(&self.state); - tokio::spawn(async move { tx.send(msg) }); + let tx = self.state.games_tx.clone(); + let msg = GameHandlerMessage::BroadcastGamesUpdate(); + tokio::spawn(async move { tx.send(msg).await }); let tx = broadcast_tx.clone(); let msg = meta_chat_update(&self.state); tokio::spawn(async move { tx.send(msg) }); @@ -372,24 +372,3 @@ pub fn meta_server_summary_update(state: &Arc) -> String { }) .unwrap() } - -/// Generate games list update -pub fn meta_games_browser_update(state: &Arc) -> String { - // TODO: this may get expensive if there are many games - - let games = state - .games - .read() - .unwrap() - .values() - .map(|game| GameBrowserMeta { - uuid: game.read().unwrap().uuid.to_string(), - name: game.read().unwrap().name.clone(), - host: game.read().unwrap().host.read().unwrap().name.clone(), - players: game.read().unwrap().players.len(), - packs: game.read().unwrap().packs.clone(), - }) - .collect::>(); - - to_string::(&GamesUpdate { games }).unwrap() -}