diff --git a/src/client.rs b/src/client.rs index 207e8f4..f4a8beb 100644 --- a/src/client.rs +++ b/src/client.rs @@ -577,8 +577,8 @@ impl Client { } // Then update the user structs based on the info we just got. - for (name, user) in response.users.drain(..) { - self.users.insert(name, user); + for user in response.users.drain(..) { + self.users.insert(user); } let control_response = control::RoomJoinResponse { room_name: response.room_name }; @@ -640,7 +640,7 @@ impl Client { fn handle_room_user_joined_response(&mut self, response: server::RoomUserJoinedResponse) { let result = self.rooms.insert_member( &response.room_name, - response.user_name.clone(), + response.user.name.clone(), ); if let Err(err) = result { error!("RoomUserJoinedResponse: {}", err); @@ -649,7 +649,7 @@ impl Client { self.send_to_controller(control::Response::RoomUserJoinedResponse( control::RoomUserJoinedResponse { room_name: response.room_name, - user_name: response.user_name, + user_name: response.user.name, }, )); } diff --git a/src/proto/server/response.rs b/src/proto/server/response.rs index 1353f99..9713f09 100644 --- a/src/proto/server/response.rs +++ b/src/proto/server/response.rs @@ -521,7 +521,7 @@ impl ProtoDecode for PrivilegedUsersResponse { #[derive(Debug, Eq, PartialEq)] pub struct RoomJoinResponse { pub room_name: String, - pub users: Vec<(String, User)>, + pub users: Vec, pub owner: Option, pub operators: Vec, } @@ -537,8 +537,9 @@ impl ReadFromPacket for RoomJoinResponse { let num_users: usize = try!(packet.read_value()); for _ in 0..num_users { - let name : String = try!(packet.read_value()); + let name: String = try!(packet.read_value()); let user = User { + name: name, status: UserStatus::Offline, average_speed: 0, num_downloads: 0, @@ -548,7 +549,7 @@ impl ReadFromPacket for RoomJoinResponse { num_free_slots: 0, country: String::new(), }; - response.users.push((name, user)); + response.users.push(user); } try!(response.read_user_infos(packet)); @@ -570,14 +571,14 @@ impl RoomJoinResponse { fn read_user_infos(&mut self, packet: &mut Packet) -> Result<(), PacketReadError> { let num_statuses: usize = try!(packet.read_value()); for i in 0..num_statuses { - if let Some(&mut (_, ref mut user)) = self.users.get_mut(i) { + if let Some(user) = self.users.get_mut(i) { user.status = try!(packet.read_value()); } } let num_infos: usize = try!(packet.read_value()); for i in 0..num_infos { - if let Some(&mut (_, ref mut user)) = self.users.get_mut(i) { + if let Some(user) = self.users.get_mut(i) { user.average_speed = try!(packet.read_value()); user.num_downloads = try!(packet.read_value()); user.unknown = try!(packet.read_value()); @@ -588,14 +589,14 @@ impl RoomJoinResponse { let num_free_slots: usize = try!(packet.read_value()); for i in 0..num_free_slots { - if let Some(&mut (_, ref mut user)) = self.users.get_mut(i) { + if let Some(user) = self.users.get_mut(i) { user.num_free_slots = try!(packet.read_value()); } } let num_countries: usize = try!(packet.read_value()); for i in 0..num_countries { - if let Some(&mut (_, ref mut user)) = self.users.get_mut(i) { + if let Some(user) = self.users.get_mut(i) { user.country = try!(packet.read_value()); } } @@ -676,8 +677,8 @@ impl ProtoEncode for RoomJoinResponse { let mut user_infos = vec![]; let mut user_free_slots = vec![]; let mut user_countries = vec![]; - for &(ref user_name, ref user) in &self.users { - user_names.push(user_name); + for user in &self.users { + user_names.push(&user.name); user_statuses.push(user.status); user_infos.push(UserInfo::from_user(user)); user_free_slots.push(user.num_free_slots as u32); @@ -706,7 +707,7 @@ fn build_users( mut infos: Vec, mut free_slots: Vec, mut countries: Vec, -) -> Vec<(String, User)> { +) -> Vec { let mut users = vec![]; loop { @@ -718,19 +719,17 @@ fn build_users( match (name_opt, status_opt, info_opt, slots_opt, country_opt) { (Some(name), Some(status), Some(info), Some(slots), Some(country)) => { - users.push(( - name, - User { - status: status, - average_speed: info.average_speed as usize, - num_downloads: info.num_downloads as usize, - unknown: info.unknown as usize, - num_files: info.num_files as usize, - num_folders: info.num_folders as usize, - num_free_slots: slots as usize, - country: country, - } - )) + users.push(User { + name: name, + status: status, + average_speed: info.average_speed as usize, + num_downloads: info.num_downloads as usize, + unknown: info.unknown as usize, + num_files: info.num_files as usize, + num_folders: info.num_folders as usize, + num_free_slots: slots as usize, + country: country, + }) } _ => break, } @@ -903,14 +902,13 @@ impl ReadFromPacket for RoomTickersResponse { #[derive(Debug, Eq, PartialEq)] pub struct RoomUserJoinedResponse { pub room_name: String, - pub user_name: String, pub user: User, } impl ReadFromPacket for RoomUserJoinedResponse { fn read_from_packet(packet: &mut Packet) -> Result { let room_name = try!(packet.read_value()); - let user_name : String = try!(packet.read_value()); + let user_name = try!(packet.read_value()); let status = try!(packet.read_value()); @@ -925,8 +923,8 @@ impl ReadFromPacket for RoomUserJoinedResponse { Ok(RoomUserJoinedResponse { room_name: room_name, - user_name: user_name, user: User { + name: user_name, status: status, average_speed: average_speed, num_downloads: num_downloads, @@ -1128,32 +1126,28 @@ mod tests { roundtrip(ServerResponse::RoomJoinResponse(RoomJoinResponse { room_name: "red".to_string(), users: vec![ - ( - "alice".to_string(), - User { - status: UserStatus::Online, - average_speed: 1000, - num_downloads: 1001, - unknown: 1002, - num_files: 1003, - num_folders: 1004, - num_free_slots: 1005, - country: "US".to_string(), - } - ), - ( - "barbara".to_string(), - User { - status: UserStatus::Away, - average_speed: 2000, - num_downloads: 2001, - unknown: 2002, - num_files: 2003, - num_folders: 2004, - num_free_slots: 2005, - country: "DE".to_string(), - } - ), + User { + name: "alice".to_string(), + status: UserStatus::Online, + average_speed: 1000, + num_downloads: 1001, + unknown: 1002, + num_files: 1003, + num_folders: 1004, + num_free_slots: 1005, + country: "US".to_string(), + }, + User { + name: "barbara".to_string(), + status: UserStatus::Away, + average_speed: 2000, + num_downloads: 2001, + unknown: 2002, + num_files: 2003, + num_folders: 2004, + num_free_slots: 2005, + country: "DE".to_string(), + }, ], owner: Some("carol".to_string()), operators: vec!["deirdre".to_string(), "erica".to_string()], diff --git a/src/proto/user.rs b/src/proto/user.rs index b6c340e..5b4cce5 100644 --- a/src/proto/user.rs +++ b/src/proto/user.rs @@ -1,6 +1,7 @@ use std::io; -use proto::{DecodeError, MutPacket, Packet, PacketReadError, ProtoDecode, ProtoDecoder, ProtoEncode, ProtoEncoder, ReadFromPacket, WriteToPacket}; +use proto::{DecodeError, MutPacket, Packet, PacketReadError, ProtoDecode, ProtoDecoder, + ProtoEncode, ProtoEncoder, ReadFromPacket, WriteToPacket}; const STATUS_OFFLINE: u32 = 1; const STATUS_AWAY: u32 = 2; @@ -67,6 +68,8 @@ impl ProtoDecode for UserStatus { /// This structure contains the last known information about a fellow user. #[derive(Clone, Debug, Eq, PartialEq, RustcDecodable, RustcEncodable)] pub struct User { + /// The name of the user. + pub name: String, /// The last known status of the user. pub status: UserStatus, /// The average upload speed of the user. diff --git a/src/room.rs b/src/room.rs index 3af704d..889053f 100644 --- a/src/room.rs +++ b/src/room.rs @@ -236,7 +236,7 @@ impl RoomMap { room_name: &str, owner: Option, mut operators: Vec, - members: &Vec<(String, User)>, + members: &[User], ) -> Result<(), Error> { // First look up the room struct. let room = try!(self.get_mut_strict(room_name)); @@ -263,8 +263,8 @@ impl RoomMap { } room.members.clear(); - for &(ref user_name, _) in members.iter() { - room.members.insert(user_name.clone()); + for user in members { + room.members.insert(user.name.clone()); } Ok(()) diff --git a/src/user.rs b/src/user.rs index 7e04a29..dce9e9e 100644 --- a/src/user.rs +++ b/src/user.rs @@ -59,12 +59,16 @@ impl UserMap { /// Inserts the given user info for the given user name in the mapping. /// If there is already data under that name, it is replaced. - pub fn insert(&mut self, user_name: String, user: User) { - self.map.insert(user_name, user); + pub fn insert(&mut self, user: User) { + self.map.insert(user.name.clone(), user); } /// Sets the given user's status to the given value, if such a user exists. - pub fn set_status(&mut self, user_name: &str, status: UserStatus) -> Result<(), UserNotFoundError> { + pub fn set_status( + &mut self, + user_name: &str, + status: UserStatus, + ) -> Result<(), UserNotFoundError> { let user = self.get_mut_strict(user_name)?; user.status = status; Ok(())