diff -r bb24c3414b0d -r 81e0ed105f5d gameServer2/src/server/server.rs --- a/gameServer2/src/server/server.rs Thu Jun 21 23:09:20 2018 +0200 +++ b/gameServer2/src/server/server.rs Thu Jun 21 17:23:10 2018 -0400 @@ -1,27 +1,19 @@ use slab; use utils; use super::{ - client::*, room::*, actions, handlers + client::*, room::*, actions, handlers, + actions::{Destination, PendingMessage} }; use protocol::messages::*; type Slab = slab::Slab; -#[derive(Debug)] -pub enum Destination { - ToAll, - ToSelf(ClientId), - ToOthers(ClientId), - ToSelected(Vec) -} - -pub struct PendingMessage(pub Destination, pub HWServerMessage); pub struct HWServer { pub clients: Slab, pub rooms: Slab, pub lobby_id: RoomId, - pub output: Vec, + pub output: Vec<(Vec, HWServerMessage)>, pub removed_clients: Vec, } @@ -47,7 +39,7 @@ let client = HWClient::new(entry.key()); entry.insert(client); } - self.send_self(key, HWServerMessage::Connected(utils::PROTOCOL_VERSION)); + self.send(key, Destination::ToSelf, HWServerMessage::Connected(utils::PROTOCOL_VERSION)); key } @@ -69,24 +61,28 @@ handlers::handle(self, client_id, msg); } - pub fn send_all(&mut self, msg: HWServerMessage) { - self.output.push(PendingMessage( - Destination::ToAll, msg)); + fn get_recipients(&self, client_id: ClientId, destination: Destination) -> Vec { + let mut ids = match destination { + Destination::ToSelf => vec![client_id], + Destination::ToAll {room_id: Some(id), ..} => + self.room_clients(id), + Destination::ToAll {protocol: Some(proto), ..} => + self.protocol_clients(proto), + Destination::ToAll {..} => + self.clients.iter().map(|(id, _)| id).collect::>(), + _ => Vec::new() + }; + if let Destination::ToAll {skip_self: true, ..} = destination { + if let Some(index) = ids.iter().position(|id| *id == client_id) { + ids.remove(index); + } + } + ids } - pub fn send_self(&mut self, client_id: ClientId, msg: HWServerMessage) { - self.output.push(PendingMessage( - Destination::ToSelf(client_id), msg)); - } - - pub fn send_others(&mut self, client_id: ClientId, msg: HWServerMessage) { - self.output.push(PendingMessage( - Destination::ToOthers(client_id), msg)); - } - - pub fn send_to_selected(&mut self, client_ids: Vec, msg: HWServerMessage) { - self.output.push(PendingMessage( - Destination::ToSelected(client_ids), msg)); + pub fn send(&mut self, client_id: ClientId, destination: Destination, message: HWServerMessage) { + let ids = self.get_recipients(client_id, destination); + self.output.push((ids, message)); } pub fn react(&mut self, client_id: ClientId, actions: Vec) {