rust/hedgewars-server/src/server/handlers.rs
changeset 14788 6dea1ca64992
parent 14786 8ecdb5c6bb2a
child 14789 18240b308505
equal deleted inserted replaced
14787:0e64acbc3f8b 14788:6dea1ca64992
     1 use mio;
     1 use mio;
     2 use std::{collections::HashMap, io, io::Write};
     2 use std::{collections::HashMap, io, io::Write};
     3 
     3 
     4 use super::{
     4 use super::{
     5     actions::{Destination, DestinationRoom},
     5     actions::{Destination, DestinationGroup},
     6     core::HWServer,
     6     core::HWServer,
     7     coretypes::{ClientId, Replay, RoomId},
     7     coretypes::{ClientId, Replay, RoomId},
     8     room::RoomSave,
     8     room::RoomSave,
     9 };
     9 };
    10 use crate::{
    10 use crate::{
   128         &'b mut self,
   128         &'b mut self,
   129         server: &'a HWServer,
   129         server: &'a HWServer,
   130     ) -> impl Iterator<Item = (Vec<ClientId>, HWServerMessage)> + 'a {
   130     ) -> impl Iterator<Item = (Vec<ClientId>, HWServerMessage)> + 'a {
   131         let client_id = self.client_id;
   131         let client_id = self.client_id;
   132         self.messages.drain(..).map(move |m| {
   132         self.messages.drain(..).map(move |m| {
   133             let ids = get_recipients(server, client_id, &m.destination);
   133             let ids = get_recipients(server, client_id, m.destination);
   134             (ids, m.message)
   134             (ids, m.message)
   135         })
   135         })
   136     }
   136     }
   137 
   137 
   138     pub fn remove_client(&mut self, client_id: ClientId) {
   138     pub fn remove_client(&mut self, client_id: ClientId) {
   157 }
   157 }
   158 
   158 
   159 fn get_recipients(
   159 fn get_recipients(
   160     server: &HWServer,
   160     server: &HWServer,
   161     client_id: ClientId,
   161     client_id: ClientId,
   162     destination: &Destination,
   162     destination: Destination,
   163 ) -> Vec<ClientId> {
   163 ) -> Vec<ClientId> {
   164     let mut ids = match *destination {
   164     match destination {
   165         Destination::ToSelf => vec![client_id],
   165         Destination::ToSelf => vec![client_id],
   166         Destination::ToId(id) => vec![id],
   166         Destination::ToId(id) => vec![id],
   167         Destination::ToAll {
   167         Destination::ToIds(ids) => ids,
   168             room_id: DestinationRoom::Lobby,
   168         Destination::ToAll { group, skip_self } => {
   169             ..
   169             let mut ids = match group {
   170         } => server.collect_lobby_clients(),
   170                 DestinationGroup::All => server.clients.iter().map(|(id, _)| id).collect(),
   171         Destination::ToAll {
   171                 DestinationGroup::Lobby => server.collect_lobby_clients(),
   172             room_id: DestinationRoom::Room(id),
   172                 DestinationGroup::Protocol(proto) => server.protocol_clients(proto),
   173             ..
   173                 DestinationGroup::Room(id) => server.collect_room_clients(id),
   174         } => server.collect_room_clients(id),
   174             };
   175         Destination::ToAll {
   175 
   176             protocol: Some(proto),
   176             if skip_self {
   177             ..
   177                 if let Some(index) = ids.iter().position(|id| *id == client_id) {
   178         } => server.protocol_clients(proto),
   178                     ids.remove(index);
   179         Destination::ToAll { .. } => server.clients.iter().map(|(id, _)| id).collect::<Vec<_>>(),
   179                 }
   180     };
   180             }
   181     if let Destination::ToAll {
   181 
   182         skip_self: true, ..
   182             ids
   183     } = destination
   183         }
   184     {
   184     }
   185         if let Some(index) = ids.iter().position(|id| *id == client_id) {
       
   186             ids.remove(index);
       
   187         }
       
   188     }
       
   189     ids
       
   190 }
   185 }
   191 
   186 
   192 pub fn handle(
   187 pub fn handle(
   193     server: &mut HWServer,
   188     server: &mut HWServer,
   194     client_id: ClientId,
   189     client_id: ClientId,