team04_server/messages/
hello_client.rs1use 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}