diff --git a/src/client.rs b/src/client.rs index 8217735..dd145ed 100644 --- a/src/client.rs +++ b/src/client.rs @@ -182,7 +182,7 @@ impl Client { ); }, - Err(err) => error!("RoomJoinRequest: {}", err) + Err(err) => error!("RoomLeaveRequest: {}", err) } } @@ -245,6 +245,9 @@ impl Client { ServerResponse::RoomMessageResponse(response) => self.handle_room_message_response(response), + ServerResponse::RoomUserLeftResponse(response) => + self.handle_room_user_left_response(response), + ServerResponse::UserJoinedRoomResponse(response) => self.handle_user_joined_room_response(response), @@ -360,6 +363,20 @@ impl Client { control::Response::RoomMessageResponse(control_response)); } + fn handle_room_user_left_response( + &mut self, response: RoomUserLeftResponse) + { + let result = self.rooms.remove_member( + &response.room_name, &response.user_name + ); + match result { + Ok(()) => { + // TODO send control response + }, + Err(err) => error!("RoomUserLeftResponse: {}", err) + } + } + fn handle_user_joined_room_response( &mut self, response: UserJoinedRoomResponse) { @@ -367,7 +384,10 @@ impl Client { &response.room_name, response.user_name.clone() ); match result { - Ok(()) => self.users.insert(response.user_name, response.user), + Ok(()) => { + self.users.insert(response.user_name, response.user); + // TODO send control response + }, Err(err) => error!("UserJoinedRoomResponse: {}", err) } } diff --git a/src/proto/server/constants.rs b/src/proto/server/constants.rs index 9239fd5..2cf6497 100644 --- a/src/proto/server/constants.rs +++ b/src/proto/server/constants.rs @@ -6,6 +6,7 @@ pub const CODE_ROOM_MESSAGE: u32 = 13; pub const CODE_ROOM_JOIN: u32 = 14; pub const CODE_ROOM_LEAVE: u32 = 15; pub const CODE_USER_JOINED_ROOM: u32 = 16; +pub const CODE_ROOM_USER_LEFT: u32 = 17; pub const CODE_CONNECT_TO_PEER: u32 = 18; pub const CODE_ROOM_LIST: u32 = 64; pub const CODE_PRIVILEGED_USERS: u32 = 69; diff --git a/src/proto/server/response.rs b/src/proto/server/response.rs index 9103eca..cc386e6 100644 --- a/src/proto/server/response.rs +++ b/src/proto/server/response.rs @@ -28,6 +28,7 @@ pub enum ServerResponse { RoomLeaveResponse(RoomLeaveResponse), RoomListResponse(RoomListResponse), RoomMessageResponse(RoomMessageResponse), + RoomUserLeftResponse(RoomUserLeftResponse), UserJoinedRoomResponse(UserJoinedRoomResponse), UserStatusResponse(UserStatusResponse), WishlistIntervalResponse(WishlistIntervalResponse), @@ -83,6 +84,11 @@ impl FromPacket for ServerResponse { try!(RoomMessageResponse::from_packet(packet)) ), + CODE_ROOM_USER_LEFT => + ServerResponse::RoomUserLeftResponse( + try!(RoomUserLeftResponse::from_packet(packet)) + ), + CODE_USER_JOINED_ROOM => ServerResponse::UserJoinedRoomResponse( try!(UserJoinedRoomResponse::from_packet(packet)) @@ -551,6 +557,27 @@ impl FromPacket for UserJoinedRoomResponse { } } +/*================* + * ROOM USER LEFT * + *================*/ + +#[derive(Debug)] +pub struct RoomUserLeftResponse { + pub room_name: String, + pub user_name: String, +} + +impl FromPacket for RoomUserLeftResponse { + fn from_packet(packet: &mut Packet) -> result::Result { + let room_name = try!(packet.read_str()); + let user_name = try!(packet.read_str()); + Ok(RoomUserLeftResponse { + room_name: room_name, + user_name: user_name, + }) + } +} + /*=============* * USER STATUS * *=============*/ diff --git a/src/room.rs b/src/room.rs index 0248c03..8d22a5b 100644 --- a/src/room.rs +++ b/src/room.rs @@ -329,6 +329,7 @@ impl RoomMap { } /// Inserts the given user in the given room's set of members. + /// Returns an error if the room is not found. pub fn insert_member(&mut self, room_name: &str, user_name: String) -> Result<(), Error> { @@ -340,5 +341,19 @@ impl RoomMap { None => Err(Error::RoomNotFound(room_name.to_string())), } } + + /// Removes the given user from the given room's set of members. + /// Returns an error if the room is not found. + pub fn remove_member(&mut self, room_name: &str, user_name: &str) + -> Result<(), Error> + { + match self.map.get_mut(room_name) { + Some(room) => { + room.members.remove(user_name); + Ok(()) + }, + None => Err(Error::RoomNotFound(room_name.to_string())) + } + } }