team04_server/messages/
lobby_info.rs1use client_role::PlayerRole;
2use player_character::{PlayerCharacter, PlayerCharacterOrNone};
3
4use crate::lobby::state::LobbyState;
5
6use super::*;
7
8pub struct LobbyInfo<'a> {
9 spectators: Vec<&'a str>,
10 players: Vec<Player<'a>>,
11 available_characters: Vec<PlayerCharacter>,
12}
13#[derive(Serialize)]
14pub struct Player<'a> {
15 #[serde(rename = "type")]
16 role: PlayerRole,
17 name: &'a str,
18 character: PlayerCharacterOrNone,
19 ready: bool,
20}
21
22impl<'a> LobbyInfo<'a> {
23 pub fn new_from_lobby_state(lobby_state: &'a LobbyState) -> Self {
24 Self {
25 spectators: lobby_state
26 .clients
27 .spectators
28 .iter()
29 .map(|spectator| spectator.name())
30 .collect(),
31 players: lobby_state
32 .clients
33 .players
34 .players_all()
35 .map(|player| Player {
36 role: player.role,
37 name: player.name(),
38 character: PlayerCharacterOrNone(player.character),
39 ready: player.ready,
40 })
41 .collect(),
42 available_characters: lobby_state.available_characters(),
43 }
44 }
45}
46
47impl MessageTx for LobbyInfo<'_> {
48 fn serialize(&self) -> String {
49 #[derive(Serialize)]
50 struct LobbyInfo<'a, 'b> {
51 #[serde(rename = "messageType")]
52 message_type: &'static str,
53 spectators: &'b Vec<&'a str>,
54 players: &'b Vec<Player<'a>>,
55 #[serde(rename = "availableCharacters")]
56 available_characters: &'b Vec<PlayerCharacter>,
57 }
58
59 let message = LobbyInfo {
60 message_type: "LOBBY_INFO",
61 spectators: &self.spectators,
62 players: &self.players,
63 available_characters: &self.available_characters,
64 };
65
66 serialize(&message)
67 }
68}