diff -r 0eedc17055a0 -r cdf69667593b gameServer2/src/server/server.rs --- a/gameServer2/src/server/server.rs Thu Jun 14 16:44:27 2018 -0400 +++ b/gameServer2/src/server/server.rs Mon Jun 18 09:22:53 2018 -0400 @@ -1,20 +1,18 @@ use slab; -use mio::net::*; -use mio::*; -use std::io; - use utils; -use super::client::*; -use super::room::*; -use super::actions; +use super::{ + client::*, room::*, actions, handlers +}; use protocol::messages::*; -use super::handlers; type Slab = slab::Slab; +#[derive(Debug)] pub enum Destination { + ToAll, ToSelf(ClientId), - ToOthers(ClientId) + ToOthers(ClientId), + ToSelected(Vec) } pub struct PendingMessage(pub Destination, pub HWServerMessage); @@ -67,9 +65,15 @@ } pub fn handle_msg(&mut self, client_id: ClientId, msg: HWProtocolMessage) { + debug!("Handling message {:?} for client {}", msg, client_id); handlers::handle(self, client_id, msg); } + pub fn send_all(&mut self, msg: HWServerMessage) { + self.output.push(PendingMessage( + Destination::ToAll, msg)); + } + pub fn send_self(&mut self, client_id: ClientId, msg: HWServerMessage) { self.output.push(PendingMessage( Destination::ToSelf(client_id), msg)); @@ -80,9 +84,54 @@ 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 react(&mut self, client_id: ClientId, actions: Vec) { for action in actions { actions::run_action(self, client_id, action); } } -} + + pub fn has_room(&self, name: &str) -> bool { + self.rooms.iter().any(|(_, r)| r.name == name) + } + + pub fn find_room(&self, name: &str) -> Option<&HWRoom> { + self.rooms.iter().find(|(_, r)| r.name == name).map(|(_, r)| r) + } + + pub fn find_room_mut(&mut self, name: &str) -> Option<&mut HWRoom> { + self.rooms.iter_mut().find(|(_, r)| r.name == name).map(|(_, r)| r) + } + + pub fn select_clients(&self, f: F) -> Vec + where F: Fn(&(usize, &HWClient)) -> bool { + self.clients.iter().filter(f) + .map(|(_, c)| c.id).collect() + } + + pub fn room_clients(&self, room_id: RoomId) -> Vec { + self.select_clients(|(_, c)| c.room_id == Some(room_id)) + } + + pub fn protocol_clients(&self, protocol: u32) -> Vec { + self.select_clients(|(_, c)| c.protocol_number == protocol) + } + + pub fn other_clients_in_room(&self, self_id: ClientId) -> Vec { + let room_id = self.clients[self_id].room_id; + self.select_clients(|(id, c)| *id != self_id && c.room_id == room_id ) + } + + pub fn client_and_room(&mut self, client_id: ClientId) -> (&mut HWClient, Option<&mut HWRoom>) { + let c = &mut self.clients[client_id]; + if let Some(room_id) = c.room_id { + (c, Some(&mut self.rooms[room_id])) + } else { + (c, None) + } + } +} \ No newline at end of file