team04_server/messages/
hello_client.rs

1use std::sync::Arc;
2
3use futures_util::{StreamExt, stream};
4
5use crate::config::{BoardConfig, GameConfig, UnitConfig};
6use crate::server::state::{LobbyId, SyncedServerState};
7
8use super::*;
9
10pub struct HelloClient {
11    lobbies: Vec<Lobby>,
12}
13
14impl HelloClient {
15    pub async fn new_from_server_state(server_state: &SyncedServerState) -> Self {
16        let server_state_lock = server_state.lock().await;
17        let lobbies = server_state_lock
18            .lobbies()
19            .map(|v| (*v.0, v.1.clone()))
20            .collect::<Vec<_>>();
21        drop(server_state_lock);
22        Self {
23            lobbies: stream::iter(lobbies)
24                .then(|(id, lobby)| async move {
25                    let lobby = lobby.lock().await;
26                    Lobby {
27                        lobby_id: id,
28                        players: lobby.clients.players.len(),
29                        max_players: lobby.max_players(),
30                        game_running: lobby.game_started(),
31                        board_config: lobby.configs.board_config.clone(),
32                        game_config: lobby.configs.game_config.clone(),
33                        unit_config: lobby.configs.unit_config.clone(),
34                    }
35                })
36                .collect::<Vec<_>>()
37                .await,
38        }
39    }
40}
41
42#[derive(Serialize)]
43struct Lobby {
44    #[serde(rename = "lobbyID")]
45    lobby_id: LobbyId,
46    players: usize,
47    #[serde(rename = "maxPlayers")]
48    max_players: usize,
49    #[serde(rename = "gameRunning")]
50    game_running: bool,
51    #[serde(rename = "boardConfig")]
52    board_config: Arc<BoardConfig>,
53    #[serde(rename = "gameConfig")]
54    game_config: Arc<GameConfig>,
55    #[serde(rename = "unitConfig")]
56    unit_config: Arc<UnitConfig>,
57}
58
59impl MessageTx for HelloClient {
60    fn serialize(&self) -> String {
61        #[derive(Serialize)]
62        struct HelloClient<'a> {
63            #[serde(rename = "messageType")]
64            message_type: &'static str,
65            lobbies: &'a [Lobby],
66        }
67
68        let message = HelloClient {
69            message_type: "HELLO_CLIENT",
70            lobbies: &self.lobbies,
71        };
72
73        serialize(&message)
74    }
75}