rust/hedgewars-server/src/server/actions.rs
changeset 15074 c5a6e8566425
parent 15073 7732013ce64c
child 15075 e935b1ad23f3
equal deleted inserted replaced
15073:7732013ce64c 15074:c5a6e8566425
     1 use super::{
       
     2     client::HWClient,
       
     3     core::HWServer,
       
     4     coretypes::{ClientId, GameCfg, RoomId, VoteType},
       
     5     handlers,
       
     6     room::HWRoom,
       
     7     room::{GameInfo, RoomFlags},
       
     8 };
       
     9 use crate::{
       
    10     protocol::messages::{server_chat, HWProtocolMessage, HWServerMessage, HWServerMessage::*},
       
    11     utils::to_engine_msg,
       
    12 };
       
    13 use rand::{distributions::Uniform, thread_rng, Rng};
       
    14 use std::{io, io::Write, iter::once, mem::replace};
       
    15 
       
    16 #[cfg(feature = "official-server")]
       
    17 use super::database;
       
    18 
       
    19 pub enum DestinationGroup {
       
    20     All,
       
    21     Lobby,
       
    22     Room(RoomId),
       
    23     Protocol(u16),
       
    24 }
       
    25 
       
    26 pub enum Destination {
       
    27     ToId(ClientId),
       
    28     ToIds(Vec<ClientId>),
       
    29     ToSelf,
       
    30     ToAll {
       
    31         group: DestinationGroup,
       
    32         skip_self: bool,
       
    33     },
       
    34 }
       
    35 
       
    36 pub struct PendingMessage {
       
    37     pub destination: Destination,
       
    38     pub message: HWServerMessage,
       
    39 }
       
    40 
       
    41 impl PendingMessage {
       
    42     pub fn send(message: HWServerMessage, client_id: ClientId) -> PendingMessage {
       
    43         PendingMessage {
       
    44             destination: Destination::ToId(client_id),
       
    45             message,
       
    46         }
       
    47     }
       
    48 
       
    49     pub fn send_many(message: HWServerMessage, client_ids: Vec<ClientId>) -> PendingMessage {
       
    50         PendingMessage {
       
    51             destination: Destination::ToIds(client_ids),
       
    52             message,
       
    53         }
       
    54     }
       
    55 
       
    56     pub fn send_self(message: HWServerMessage) -> PendingMessage {
       
    57         PendingMessage {
       
    58             destination: Destination::ToSelf,
       
    59             message,
       
    60         }
       
    61     }
       
    62 
       
    63     pub fn send_all(message: HWServerMessage) -> PendingMessage {
       
    64         let destination = Destination::ToAll {
       
    65             group: DestinationGroup::All,
       
    66             skip_self: false,
       
    67         };
       
    68         PendingMessage {
       
    69             destination,
       
    70             message,
       
    71         }
       
    72     }
       
    73 
       
    74     pub fn in_room(mut self, clients_room_id: RoomId) -> PendingMessage {
       
    75         if let Destination::ToAll { ref mut group, .. } = self.destination {
       
    76             *group = DestinationGroup::Room(clients_room_id)
       
    77         }
       
    78         self
       
    79     }
       
    80 
       
    81     pub fn in_lobby(mut self) -> PendingMessage {
       
    82         if let Destination::ToAll { ref mut group, .. } = self.destination {
       
    83             *group = DestinationGroup::Lobby
       
    84         }
       
    85         self
       
    86     }
       
    87 
       
    88     pub fn with_protocol(mut self, protocol_number: u16) -> PendingMessage {
       
    89         if let Destination::ToAll { ref mut group, .. } = self.destination {
       
    90             *group = DestinationGroup::Protocol(protocol_number)
       
    91         }
       
    92         self
       
    93     }
       
    94 
       
    95     pub fn but_self(mut self) -> PendingMessage {
       
    96         if let Destination::ToAll {
       
    97             ref mut skip_self, ..
       
    98         } = self.destination
       
    99         {
       
   100             *skip_self = true
       
   101         }
       
   102         self
       
   103     }
       
   104 }
       
   105 
       
   106 impl HWServerMessage {
       
   107     pub fn send(self, client_id: ClientId) -> PendingMessage {
       
   108         PendingMessage::send(self, client_id)
       
   109     }
       
   110     pub fn send_many(self, client_ids: Vec<ClientId>) -> PendingMessage {
       
   111         PendingMessage::send_many(self, client_ids)
       
   112     }
       
   113     pub fn send_self(self) -> PendingMessage {
       
   114         PendingMessage::send_self(self)
       
   115     }
       
   116     pub fn send_all(self) -> PendingMessage {
       
   117         PendingMessage::send_all(self)
       
   118     }
       
   119 }