gameServer2/src/server/actions.rs
author Wuzzy <Wuzzy2@mail.ru>
Mon, 17 Sep 2018 22:37:47 +0200
changeset 13790 4ed202f0428e
parent 13671 09f4a30e50cc
child 13806 5fb40c8e5542
permissions -rw-r--r--
Easier back jumps in Basic Movement Training (fixes bug #692) The explanation of Back Jumping (2/2) has been simplified and the "hard" part has been made easier by lowering the girders. The original idea was that I wanted to force players to learn how to jump higher by delaying the 2nd backspace keypress. But this turned out that this section was too unfair and we have lost at least one player due to rage-quitting, according to feedback.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
     1
use std::{
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
     2
    io, io::Write,
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
     3
    iter::once,
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
     4
    mem::replace
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
     5
};
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
     6
use super::{
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
     7
    server::HWServer,
13528
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
     8
    room::{GameInfo, RoomFlags},
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
     9
    client::HWClient,
13485
fb37745c5bca complete newseed voting
alfadur
parents: 13483
diff changeset
    10
    coretypes::{ClientId, RoomId, GameCfg, VoteType},
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
    11
    room::HWRoom,
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
    12
    handlers
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
    13
};
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    14
use crate::{
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    15
    protocol::messages::{
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    16
        HWProtocolMessage,
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    17
        HWServerMessage,
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    18
        HWServerMessage::*,
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    19
        server_chat
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    20
    },
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
    21
    utils::to_engine_msg
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
    22
};
13485
fb37745c5bca complete newseed voting
alfadur
parents: 13483
diff changeset
    23
use rand::{thread_rng, Rng, distributions::Uniform};
12143
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents:
diff changeset
    24
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    25
pub enum Destination {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
    26
    ToId(ClientId),
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    27
    ToSelf,
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
    28
    ToAll {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    29
        room_id: Option<RoomId>,
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
    30
        protocol: Option<u16>,
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    31
        skip_self: bool
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    32
    }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    33
}
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    34
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    35
pub struct PendingMessage {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    36
    pub destination: Destination,
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    37
    pub message: HWServerMessage
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    38
}
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    39
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    40
impl PendingMessage {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
    41
    pub fn send(message: HWServerMessage, client_id: ClientId) -> PendingMessage {
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
    42
        PendingMessage{ destination: Destination::ToId(client_id), message}
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
    43
    }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
    44
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    45
    pub fn send_self(message: HWServerMessage) -> PendingMessage {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    46
        PendingMessage{ destination: Destination::ToSelf, message }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    47
    }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    48
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    49
    pub fn send_all(message: HWServerMessage) -> PendingMessage {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    50
        let destination = Destination::ToAll {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    51
            room_id: None,
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    52
            protocol: None,
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    53
            skip_self: false,
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    54
        };
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    55
        PendingMessage{ destination, message }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    56
    }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    57
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    58
    pub fn in_room(mut self, clients_room_id: RoomId) -> PendingMessage {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    59
        if let Destination::ToAll {ref mut room_id, ..} = self.destination {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    60
            *room_id = Some(clients_room_id)
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    61
        }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    62
        self
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    63
    }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    64
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
    65
    pub fn with_protocol(mut self, protocol_number: u16) -> PendingMessage {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    66
        if let Destination::ToAll {ref mut protocol, ..} = self.destination {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    67
            *protocol = Some(protocol_number)
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    68
        }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    69
        self
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    70
    }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    71
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    72
    pub fn but_self(mut self) -> PendingMessage {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    73
        if let Destination::ToAll {ref mut skip_self, ..} = self.destination {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    74
            *skip_self = true
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    75
        }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    76
        self
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    77
    }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    78
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    79
    pub fn action(self) -> Action { Send(self) }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    80
}
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    81
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    82
impl Into<Action> for PendingMessage {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    83
    fn into(self) -> Action { self.action() }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    84
}
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    85
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    86
impl HWServerMessage {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
    87
    pub fn send(self, client_id: ClientId) -> PendingMessage { PendingMessage::send(self, client_id) }
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    88
    pub fn send_self(self) -> PendingMessage { PendingMessage::send_self(self) }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    89
    pub fn send_all(self) -> PendingMessage { PendingMessage::send_all(self) }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    90
}
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    91
12143
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents:
diff changeset
    92
pub enum Action {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    93
    Send(PendingMessage),
12144
f3121d7dedec - Handle errors
unc0rr
parents: 12143
diff changeset
    94
    RemoveClient,
f3121d7dedec - Handle errors
unc0rr
parents: 12143
diff changeset
    95
    ByeClient(String),
12147
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12146
diff changeset
    96
    ReactProtocolMessage(HWProtocolMessage),
12150
a482c7a5f6e3 Lobby joining action
unc0rr
parents: 12149
diff changeset
    97
    CheckRegistered,
a482c7a5f6e3 Lobby joining action
unc0rr
parents: 12149
diff changeset
    98
    JoinLobby,
12152
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12151
diff changeset
    99
    AddRoom(String, Option<String>),
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   100
    RemoveRoom(RoomId),
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   101
    MoveToRoom(RoomId),
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   102
    MoveToLobby(String),
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   103
    ChangeMaster(RoomId, Option<ClientId>),
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   104
    RemoveTeam(String),
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   105
    RemoveClientTeams,
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   106
    SendRoomUpdate(Option<String>),
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   107
    StartRoomGame(RoomId),
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   108
    SendTeamRemovalMessage(String),
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   109
    FinishRoomGame(RoomId),
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   110
    SendRoomData{to: ClientId, teams: bool, config: bool, flags: bool},
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   111
    AddVote{vote: bool, is_forced: bool},
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   112
    ApplyVoting(VoteType, RoomId),
12152
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12151
diff changeset
   113
    Warn(String),
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   114
    ProtocolError(String)
12143
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents:
diff changeset
   115
}
12149
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   116
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   117
use self::Action::*;
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   118
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   119
pub fn run_action(server: &mut HWServer, client_id: usize, action: Action) {
12149
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   120
    match action {
13529
5359ff75da3a indulge clippy
alfadur
parents: 13528
diff changeset
   121
        Send(msg) => server.send(client_id, &msg.destination, msg.message),
12149
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   122
        ByeClient(msg) => {
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   123
            let c = &server.clients[client_id];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   124
            let nick = c.nick.clone();
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   125
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   126
            if let Some(id) = c.room_id{
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   127
                if id != server.lobby_id {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   128
                    server.react(client_id, vec![
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   129
                        MoveToLobby(format!("quit: {}", msg.clone()))]);
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   130
                }
13529
5359ff75da3a indulge clippy
alfadur
parents: 13528
diff changeset
   131
            }
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   132
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   133
            server.react(client_id, vec![
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   134
                LobbyLeft(nick, msg.clone()).send_all().action(),
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   135
                Bye(msg).send_self().action(),
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   136
                RemoveClient]);
12149
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   137
        },
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   138
        RemoveClient => {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   139
            server.removed_clients.push(client_id);
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   140
            if server.clients.contains(client_id) {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   141
                server.clients.remove(client_id);
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
   142
            }
12149
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   143
        },
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   144
        ReactProtocolMessage(msg) =>
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   145
            handlers::handle(server, client_id, msg),
12150
a482c7a5f6e3 Lobby joining action
unc0rr
parents: 12149
diff changeset
   146
        CheckRegistered =>
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   147
            if server.clients[client_id].protocol_number > 0 && server.clients[client_id].nick != "" {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   148
                server.react(client_id, vec![
12151
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12150
diff changeset
   149
                    JoinLobby,
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12150
diff changeset
   150
                    ]);
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12150
diff changeset
   151
            },
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12150
diff changeset
   152
        JoinLobby => {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   153
            server.clients[client_id].room_id = Some(server.lobby_id);
12152
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12151
diff changeset
   154
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   155
            let mut lobby_nicks = Vec::new();
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   156
            for (_, c) in server.clients.iter() {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   157
                if c.room_id.is_some() {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   158
                    lobby_nicks.push(c.nick.clone());
12151
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12150
diff changeset
   159
                }
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12150
diff changeset
   160
            }
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   161
            let joined_msg = LobbyJoined(lobby_nicks);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   162
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   163
            let everyone_msg = LobbyJoined(vec![server.clients[client_id].nick.clone()]);
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   164
            let flags_msg = ClientFlags(
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   165
                "+i".to_string(),
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   166
                server.clients.iter()
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   167
                    .filter(|(_, c)| c.room_id.is_some())
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   168
                    .map(|(_, c)| c.nick.clone())
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   169
                    .collect());
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   170
            let server_msg = ServerMessage("\u{1f994} is watching".to_string());
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   171
            let rooms_msg = Rooms(server.rooms.iter()
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   172
                .filter(|(id, _)| *id != server.lobby_id)
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   173
                .flat_map(|(_, r)|
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   174
                    r.info(r.master_id.map(|id| &server.clients[id])))
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   175
                .collect());
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   176
            server.react(client_id, vec![
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   177
                everyone_msg.send_all().but_self().action(),
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   178
                joined_msg.send_self().action(),
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   179
                flags_msg.send_self().action(),
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   180
                server_msg.send_self().action(),
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   181
                rooms_msg.send_self().action(),
12150
a482c7a5f6e3 Lobby joining action
unc0rr
parents: 12149
diff changeset
   182
                ]);
a482c7a5f6e3 Lobby joining action
unc0rr
parents: 12149
diff changeset
   183
        },
12152
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12151
diff changeset
   184
        AddRoom(name, password) => {
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
   185
            let room_id = server.add_room();;
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   186
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   187
            let r = &mut server.rooms[room_id];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   188
            let c = &mut server.clients[client_id];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   189
            r.master_id = Some(c.id);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   190
            r.name = name;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   191
            r.password = password;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   192
            r.protocol_number = c.protocol_number;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   193
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   194
            let actions = vec![
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   195
                RoomAdd(r.info(Some(&c))).send_all()
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   196
                    .with_protocol(r.protocol_number).action(),
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   197
                MoveToRoom(room_id)];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   198
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   199
            server.react(client_id, actions);
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   200
        },
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   201
        RemoveRoom(room_id) => {
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   202
            let r = &mut server.rooms[room_id];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   203
            let actions = vec![RoomRemove(r.name.clone()).send_all()
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   204
                .with_protocol(r.protocol_number).action()];
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   205
            server.rooms.remove(room_id);
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   206
            server.react(client_id, actions);
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   207
        }
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   208
        MoveToRoom(room_id) => {
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   209
            let r = &mut server.rooms[room_id];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   210
            let c = &mut server.clients[client_id];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   211
            r.players_number += 1;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   212
            c.room_id = Some(room_id);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   213
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   214
            let is_master = r.master_id == Some(c.id);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   215
            c.set_is_master(is_master);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   216
            c.set_is_ready(is_master);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   217
            c.set_is_joined_mid_game(false);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   218
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   219
            if is_master {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   220
                r.ready_players_number += 1;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   221
            }
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   222
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   223
            let mut v = vec![
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   224
                RoomJoined(vec![c.nick.clone()]).send_all().in_room(room_id).action(),
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   225
                ClientFlags("+i".to_string(), vec![c.nick.clone()]).send_all().action(),
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   226
                SendRoomUpdate(None)];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   227
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   228
            if !r.greeting.is_empty() {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   229
                v.push(ChatMsg {nick: "[greeting]".to_string(), msg: r.greeting.clone()}
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   230
                    .send_self().action());
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   231
            }
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   232
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   233
            if !c.is_master() {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   234
                let team_names: Vec<_>;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   235
                if let Some(ref mut info) = r.game_info {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   236
                    c.set_is_in_game(true);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   237
                    c.set_is_joined_mid_game(true);
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   238
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   239
                    {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   240
                        let teams = info.client_teams(c.id);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   241
                        c.teams_in_game = teams.clone().count() as u8;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   242
                        c.clan = teams.clone().next().map(|t| t.color);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   243
                        team_names = teams.map(|t| t.name.clone()).collect();
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   244
                    }
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   245
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   246
                    if !team_names.is_empty() {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   247
                        info.left_teams.retain(|name|
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   248
                            !team_names.contains(&name));
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   249
                        info.teams_in_game += team_names.len() as u8;
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   250
                        r.teams = info.teams_at_start.iter()
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   251
                            .filter(|(_, t)| !team_names.contains(&t.name))
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   252
                            .cloned().collect();
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   253
                    }
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   254
                } else {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   255
                    team_names = Vec::new();
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   256
                }
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   257
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   258
                v.push(SendRoomData{ to: client_id, teams: true, config: true, flags: true});
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   259
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   260
                if let Some(ref info) = r.game_info {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   261
                    v.push(RunGame.send_self().action());
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   262
                    v.push(ClientFlags("+g".to_string(), vec![c.nick.clone()])
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   263
                        .send_all().in_room(r.id).action());
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   264
                    v.push(ForwardEngineMessage(
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   265
                        vec![to_engine_msg("e$spectate 1".bytes())])
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   266
                        .send_self().action());
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   267
                    v.push(ForwardEngineMessage(info.msg_log.clone())
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   268
                        .send_self().action());
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   269
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   270
                    for name in &team_names {
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   271
                        v.push(ForwardEngineMessage(
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   272
                            vec![to_engine_msg(once(b'G').chain(name.bytes()))])
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   273
                            .send_all().in_room(r.id).action());
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   274
                    }
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   275
                    if info.is_paused {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   276
                        v.push(ForwardEngineMessage(vec![to_engine_msg(once(b'I'))])
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   277
                            .send_all().in_room(r.id).action())
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   278
                    }
13427
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   279
                }
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   280
            }
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   281
            server.react(client_id, v);
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   282
        }
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   283
        SendRoomData {to, teams, config, flags} => {
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   284
            let mut actions = Vec::new();
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   285
            let room_id = server.clients[client_id].room_id;
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   286
            if let Some(r) = room_id.and_then(|id| server.rooms.get(id)) {
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   287
                if config {
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   288
                    actions.push(ConfigEntry("FULLMAPCONFIG".to_string(), r.map_config())
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   289
                        .send(to).action());
13529
5359ff75da3a indulge clippy
alfadur
parents: 13528
diff changeset
   290
                    for cfg in r.game_config() {
13444
c4f917c6be51 add missing message tests
alfadur
parents: 13433
diff changeset
   291
                        actions.push(cfg.to_server_msg().send(to).action());
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   292
                    }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   293
                }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   294
                if teams {
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   295
                    let current_teams = match r.game_info {
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   296
                        Some(ref info) => &info.teams_at_start,
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   297
                        None => &r.teams
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   298
                    };
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   299
                    for (owner_id, team) in current_teams.iter() {
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   300
                        actions.push(TeamAdd(HWRoom::team_info(&server.clients[*owner_id], &team))
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   301
                            .send(to).action());
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   302
                        actions.push(TeamColor(team.name.clone(), team.color)
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   303
                            .send(to).action());
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   304
                        actions.push(HedgehogsNumber(team.name.clone(), team.hedgehogs_number)
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   305
                            .send(to).action());
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   306
                    }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   307
                }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   308
                if flags {
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   309
                    if let Some(id) = r.master_id {
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   310
                        actions.push(ClientFlags("+h".to_string(), vec![server.clients[id].nick.clone()])
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   311
                            .send(to).action());
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   312
                    }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   313
                    let nicks: Vec<_> = server.clients.iter()
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   314
                        .filter(|(_, c)| c.room_id == Some(r.id) && c.is_ready())
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   315
                        .map(|(_, c)| c.nick.clone()).collect();
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   316
                    if !nicks.is_empty() {
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   317
                        actions.push(ClientFlags("+r".to_string(), nicks)
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   318
                            .send(to).action());
13429
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   319
                    }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   320
                }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   321
            }
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   322
            server.react(client_id, actions);
d8354cb98b98 Send teams&flags on entering a room
alfadur
parents: 13428
diff changeset
   323
        }
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   324
        AddVote{vote, is_forced} => {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   325
            let mut actions = Vec::new();
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   326
            if let Some(r) = server.room(client_id) {
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   327
                let mut result = None;
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   328
                if let Some(ref mut voting) = r.voting {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   329
                    if is_forced || voting.votes.iter().find(|(id, _)| client_id == *id).is_none() {
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   330
                        actions.push(server_chat("Your vote has been counted.".to_string())
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   331
                            .send_self().action());
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   332
                        voting.votes.push((client_id, vote));
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   333
                        let i = voting.votes.iter();
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   334
                        let pro = i.clone().filter(|(_, v)| *v).count();
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   335
                        let contra = i.filter(|(_, v)| !*v).count();
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   336
                        let success_quota = voting.voters.len() / 2 + 1;
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   337
                        if is_forced && vote || pro >= success_quota {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   338
                            result = Some(true);
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   339
                        } else if is_forced && !vote || contra > voting.voters.len() - success_quota {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   340
                            result = Some(false);
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   341
                        }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   342
                    } else {
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   343
                        actions.push(server_chat("You already have voted.".to_string())
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   344
                            .send_self().action());
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   345
                    }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   346
                } else {
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   347
                    actions.push(server_chat("There's no voting going on.".to_string())
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   348
                        .send_self().action());
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   349
                }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   350
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   351
                if let Some(res) = result {
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   352
                    actions.push(server_chat("Voting closed.".to_string())
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   353
                        .send_all().in_room(r.id).action());
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   354
                    let voting = replace(&mut r.voting, None).unwrap();
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   355
                    if res {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   356
                        actions.push(ApplyVoting(voting.kind, r.id));
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   357
                    }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   358
                }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   359
            }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   360
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   361
            server.react(client_id, actions);
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   362
        }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   363
        ApplyVoting(kind, room_id) => {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   364
            let mut actions = Vec::new();
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   365
            let mut id = client_id;
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   366
            match kind {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   367
                VoteType::Kick(nick) => {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   368
                    if let Some(c) = server.find_client(&nick) {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   369
                        if c.room_id == Some(room_id) {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   370
                            id = c.id;
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   371
                            actions.push(Kicked.send_self().action());
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   372
                            actions.push(MoveToLobby("kicked".to_string()));
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   373
                        }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   374
                    }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   375
                },
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   376
                VoteType::Map(None) => (),
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   377
                VoteType::Map(Some(name)) => {
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   378
                    if let Some(location) = server.rooms[room_id].load_config(&name) {
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   379
                        actions.push(server_chat(location.to_string())
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   380
                            .send_all().in_room(room_id).action());
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   381
                        actions.push(SendRoomUpdate(None));
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   382
                        for (_, c) in server.clients.iter() {
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   383
                            if c.room_id == Some(room_id) {
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   384
                               actions.push(SendRoomData{
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   385
                                   to: c.id, teams: false,
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   386
                                   config: true, flags: false})
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   387
                            }
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   388
                        }
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   389
                    }
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   390
                },
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   391
                VoteType::Pause => {
13485
fb37745c5bca complete newseed voting
alfadur
parents: 13483
diff changeset
   392
                    if let Some(ref mut info) = server.rooms[room_id].game_info {
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   393
                        info.is_paused = !info.is_paused;
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   394
                        actions.push(server_chat("Pause toggled.".to_string())
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   395
                            .send_all().in_room(room_id).action());
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   396
                        actions.push(ForwardEngineMessage(vec![to_engine_msg(once(b'I'))])
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   397
                            .send_all().in_room(room_id).action());
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   398
                    }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   399
                },
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   400
                VoteType::NewSeed => {
13485
fb37745c5bca complete newseed voting
alfadur
parents: 13483
diff changeset
   401
                    let seed = thread_rng().gen_range(0, 1_000_000_000).to_string();
fb37745c5bca complete newseed voting
alfadur
parents: 13483
diff changeset
   402
                    let cfg = GameCfg::Seed(seed);
fb37745c5bca complete newseed voting
alfadur
parents: 13483
diff changeset
   403
                    actions.push(cfg.to_server_msg().send_all().in_room(room_id).action());
fb37745c5bca complete newseed voting
alfadur
parents: 13483
diff changeset
   404
                    server.rooms[room_id].set_config(cfg);
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   405
                },
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   406
                VoteType::HedgehogsPerTeam(number) => {
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   407
                    let r = &mut server.rooms[room_id];
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   408
                    let nicks = r.set_hedgehogs_number(number);
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   409
                    actions.extend(nicks.into_iter().map(|n|
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   410
                        HedgehogsNumber(n, number).send_all().in_room(room_id).action()
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   411
                    ));
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   412
                },
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   413
            }
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   414
            server.react(id, actions);
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   415
        }
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   416
        MoveToLobby(msg) => {
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   417
            let mut actions = Vec::new();
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   418
            let lobby_id = server.lobby_id;
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   419
            if let (c, Some(r)) = server.client_and_room(client_id) {
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   420
                r.players_number -= 1;
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   421
                if c.is_ready() && r.ready_players_number > 0 {
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   422
                    r.ready_players_number -= 1;
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   423
                }
13528
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
   424
                if c.is_master() && (r.players_number > 0 || r.is_fixed()) {
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   425
                    actions.push(ChangeMaster(r.id, None));
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   426
                }
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   427
                actions.push(ClientFlags("-i".to_string(), vec![c.nick.clone()])
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   428
                    .send_all().action());
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   429
            }
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   430
            server.react(client_id, actions);
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   431
            actions = Vec::new();
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   432
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   433
            if let (c, Some(r)) = server.client_and_room(client_id) {
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   434
                c.room_id = Some(lobby_id);
13528
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
   435
                if r.players_number == 0 && !r.is_fixed() {
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   436
                    actions.push(RemoveRoom(r.id));
13482
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   437
                } else {
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   438
                    actions.push(RemoveClientTeams);
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   439
                    actions.push(RoomLeft(c.nick.clone(), msg)
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   440
                        .send_all().in_room(r.id).but_self().action());
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   441
                    actions.push(SendRoomUpdate(Some(r.name.clone())));
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   442
                }
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   443
            }
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   444
            server.react(client_id, actions)
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   445
        }
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   446
        ChangeMaster(room_id, new_id) => {
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   447
            let mut actions = Vec::new();
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   448
            let room_client_ids = server.room_clients(room_id);
13528
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
   449
            let new_id = if server.room(client_id).map(|r| r.is_fixed()).unwrap_or(false) {
13482
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   450
                new_id
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   451
            } else {
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   452
                new_id.or_else(||
13529
5359ff75da3a indulge clippy
alfadur
parents: 13528
diff changeset
   453
                    room_client_ids.iter().find(|id| **id != client_id).cloned())
13482
f748a72432f2 Implement greetings & fixed rooms
alfadur
parents: 13448
diff changeset
   454
            };
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   455
            let new_nick = new_id.map(|id| server.clients[id].nick.clone());
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   456
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   457
            if let (c, Some(r)) = server.client_and_room(client_id) {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   458
                match r.master_id {
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   459
                    Some(id) if id == c.id => {
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   460
                        c.set_is_master(false);
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   461
                        r.master_id = None;
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   462
                        actions.push(ClientFlags("-h".to_string(), vec![c.nick.clone()])
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   463
                            .send_all().in_room(r.id).action());
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   464
                    }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   465
                    Some(_) => unreachable!(),
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   466
                    None => {}
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   467
                }
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   468
                r.master_id = new_id;
13528
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
   469
                r.set_join_restriction(false);
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
   470
                r.set_team_add_restriction(false);
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
   471
                let is_fixed = r.is_fixed();
8c5dd562c9f7 Add room flags
alfadur
parents: 13525
diff changeset
   472
                r.set_unregistered_players_restriction(is_fixed);
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   473
                if let Some(nick) = new_nick {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   474
                    actions.push(ClientFlags("+h".to_string(), vec![nick])
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   475
                        .send_all().in_room(r.id).action());
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   476
                }
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   477
            }
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   478
            if let Some(id) = new_id {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   479
                server.clients[id].set_is_master(true)
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   480
            }
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   481
            server.react(client_id, actions);
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   482
        }
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   483
        RemoveTeam(name) => {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   484
            let mut actions = Vec::new();
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   485
            if let (c, Some(r)) = server.client_and_room(client_id) {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   486
                r.remove_team(&name);
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   487
                if let Some(ref mut info) = r.game_info {
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   488
                    info.left_teams.push(name.clone());
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   489
                }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   490
                actions.push(TeamRemove(name.clone()).send_all().in_room(r.id).action());
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   491
                actions.push(SendRoomUpdate(None));
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   492
                if r.game_info.is_some() && c.is_in_game() {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   493
                    actions.push(SendTeamRemovalMessage(name));
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   494
                }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   495
            }
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   496
            server.react(client_id, actions);
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   497
        },
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   498
        RemoveClientTeams => {
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   499
            if let (c, Some(r)) = server.client_and_room(client_id) {
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   500
                let actions = r.client_teams(c.id).map(|t| RemoveTeam(t.name.clone())).collect();
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   501
                server.react(client_id, actions);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   502
            }
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   503
        }
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   504
        SendRoomUpdate(old_name) => {
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   505
            if let (c, Some(r)) = server.client_and_room(client_id) {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   506
                let name = old_name.unwrap_or_else(|| r.name.clone());
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   507
                let actions = vec![RoomUpdated(name, r.info(Some(&c)))
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   508
                    .send_all().with_protocol(r.protocol_number).action()];
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   509
                server.react(client_id, actions);
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   510
            }
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   511
        },
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   512
        StartRoomGame(room_id) => {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   513
            let actions = {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   514
                let (room_clients, room_nicks): (Vec<_>, Vec<_>) = server.clients.iter()
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   515
                    .map(|(id, c)| (id, c.nick.clone())).unzip();
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   516
                let room = &mut server.rooms[room_id];
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   517
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   518
                if !room.has_multiple_clans() {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   519
                    vec![Warn("The game can't be started with less than two clans!".to_string())]
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   520
                } else if room.game_info.is_some() {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   521
                    vec![Warn("The game is already in progress".to_string())]
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   522
                } else {
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   523
                    room.start_round();
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   524
                    for id in room_clients {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   525
                        let c = &mut server.clients[id];
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   526
                        c.set_is_in_game(false);
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   527
                        c.team_indices = room.client_team_indices(c.id);
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   528
                    }
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   529
                    vec![RunGame.send_all().in_room(room.id).action(),
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   530
                         SendRoomUpdate(None),
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   531
                         ClientFlags("+g".to_string(), room_nicks)
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   532
                             .send_all().in_room(room.id).action()]
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   533
                }
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   534
            };
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   535
            server.react(client_id, actions);
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   536
        }
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   537
        SendTeamRemovalMessage(team_name) => {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   538
            let mut actions = Vec::new();
13532
e3ae9eea0689 Implement map voting
alfadur
parents: 13529
diff changeset
   539
            if let Some(r) = server.room(client_id) {
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   540
                if let Some(ref mut info) = r.game_info {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   541
                    let msg = once(b'F').chain(team_name.bytes());
13433
c8425fbcf1d9 Fix spectators joining midgame
alfadur
parents: 13432
diff changeset
   542
                    actions.push(ForwardEngineMessage(vec![to_engine_msg(msg)]).
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   543
                        send_all().in_room(r.id).but_self().action());
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   544
                    info.teams_in_game -= 1;
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   545
                    if info.teams_in_game == 0 {
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   546
                        actions.push(FinishRoomGame(r.id));
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   547
                    }
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   548
                    let remove_msg = to_engine_msg(once(b'F').chain(team_name.bytes()));
13448
2501428303a2 Fix team remove synchronization
alfadur
parents: 13444
diff changeset
   549
                    if let Some(m) = &info.sync_msg {
2501428303a2 Fix team remove synchronization
alfadur
parents: 13444
diff changeset
   550
                        info.msg_log.push(m.clone());
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   551
                    }
13448
2501428303a2 Fix team remove synchronization
alfadur
parents: 13444
diff changeset
   552
                    if info.sync_msg.is_some() {
2501428303a2 Fix team remove synchronization
alfadur
parents: 13444
diff changeset
   553
                        info.sync_msg = None
2501428303a2 Fix team remove synchronization
alfadur
parents: 13444
diff changeset
   554
                    }
2501428303a2 Fix team remove synchronization
alfadur
parents: 13444
diff changeset
   555
                    info.msg_log.push(remove_msg.clone());
13433
c8425fbcf1d9 Fix spectators joining midgame
alfadur
parents: 13432
diff changeset
   556
                    actions.push(ForwardEngineMessage(vec![remove_msg])
13432
6f6a866c86a2 Send more data on room joining
alfadur
parents: 13431
diff changeset
   557
                        .send_all().in_room(r.id).but_self().action());
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   558
                }
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   559
            }
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   560
            server.react(client_id, actions);
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   561
        }
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   562
        FinishRoomGame(room_id) => {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   563
            let mut actions = Vec::new();
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   564
            let old_info;
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   565
            {
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   566
                let r = &mut server.rooms[room_id];
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13482
diff changeset
   567
                old_info = replace(&mut r.game_info, None);
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   568
                r.game_info = None;
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   569
                r.ready_players_number = 1;
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   570
                actions.push(SendRoomUpdate(None));
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   571
                actions.push(RoundFinished.send_all().in_room(r.id).action());
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   572
            }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   573
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   574
            if let Some(info) = old_info {
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   575
                for (_, c) in server.clients.iter() {
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   576
                    if c.room_id == Some(room_id) && c.is_joined_mid_game() {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   577
                        actions.push(SendRoomData{
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   578
                            to: c.id, teams: false,
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   579
                            config: true, flags: false});
13529
5359ff75da3a indulge clippy
alfadur
parents: 13528
diff changeset
   580
                        for name in &info.left_teams {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   581
                            actions.push(TeamRemove(name.clone())
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   582
                                .send(c.id).action());
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   583
                        }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   584
                    }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   585
                }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   586
            }
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   587
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   588
            let nicks: Vec<_> = server.clients.iter_mut()
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   589
                .filter(|(_, c)| c.room_id == Some(room_id))
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   590
                .map(|(_, c)| {
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13532
diff changeset
   591
                    c.set_is_ready(c.is_master());
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   592
                    c.set_is_joined_mid_game(false);
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   593
                    c
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13485
diff changeset
   594
                }).filter_map(|c| if !c.is_master() {
13431
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   595
                    Some(c.nick.clone())
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   596
                } else {
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   597
                    None
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   598
                }).collect();
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   599
            if !nicks.is_empty() {
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   600
                actions.push(ClientFlags("-r".to_string(), nicks)
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   601
                    .send_all().in_room(room_id).action());
f091f69d59e4 Additional round cleanup
alfadur
parents: 13429
diff changeset
   602
            }
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   603
            server.react(client_id, actions);
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13427
diff changeset
   604
        }
12152
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12151
diff changeset
   605
        Warn(msg) => {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   606
            run_action(server, client_id, Warning(msg).send_self().action());
12152
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12151
diff changeset
   607
        }
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   608
        ProtocolError(msg) => {
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   609
            run_action(server, client_id, Error(msg).send_self().action())
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   610
        }
12149
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   611
    }
589a2d7d3dc5 More refactoring
unc0rr
parents: 12148
diff changeset
   612
}