diff --git a/src/client.rs b/src/client.rs index 7b21db0..16ea3d2 100644 --- a/src/client.rs +++ b/src/client.rs @@ -8,6 +8,7 @@ use control; use proto::{Response, Request}; use proto::server::*; use room; +use user; #[derive(Debug)] enum IncomingMessage { @@ -33,7 +34,7 @@ pub struct Client { login_status: LoginStatus, rooms: room::RoomMap, - privileged_users: collections::HashSet, + users: user::UserMap, } impl Client { @@ -55,7 +56,7 @@ impl Client { login_status: LoginStatus::Pending, rooms: room::RoomMap::new(), - privileged_users: collections::HashSet::new(), + users: user::UserMap::new(), } } @@ -296,9 +297,6 @@ impl Client { fn handle_privileged_users_response( &mut self, mut response: PrivilegedUsersResponse) { - self.privileged_users.clear(); - for username in response.users.drain(..) { - self.privileged_users.insert(username); - } + self.users.update_privileges(response); } } diff --git a/src/user.rs b/src/user.rs index a97a25f..d3c475b 100644 --- a/src/user.rs +++ b/src/user.rs @@ -1,3 +1,6 @@ +use std::collections; +use proto::server; + /// This enumeration is the list of possible user statuses. #[derive(Clone, Copy, Debug)] pub enum Status { @@ -24,6 +27,52 @@ pub struct User { pub num_files: usize, /// The number of folders this user shares. pub num_folders: usize, - /// True if the user has free download slots, False if the user doesn't. - pub has_free_slots: bool, + /// The number of free download slots of this user. + pub num_free_slots: usize, +} + +/// Contains the mapping from user names to user data and provides a clean +/// interface to interact with it. +#[derive(Debug)] +pub struct UserMap { + /// The actual map from user names to user data and privileged status. + map: collections::HashMap, + /// The set of privileged users. + privileged: collections::HashSet, +} + +impl UserMap { + /// Creates an empty mapping. + pub fn new() -> Self { + UserMap { + map: collections::HashMap::new(), + privileged: collections::HashSet::new(), + } + } + + /// Looks up the given user name in the map, returning an immutable + /// reference to the associated data if found. + pub fn get(&self, name: &str) -> Option<&User> { + self.map.get(name) + } + + /// Update the set of privileged users based on the last server response. + pub fn update_privileges( + &mut self, mut response: server::PrivilegedUsersResponse) + { + self.privileged.clear(); + for name in response.users.drain(..) { + self.privileged.insert(name); + } + } + + /// Marks the given user as privileged. + pub fn add_privileged(&mut self, name: String) { + self.privileged.insert(name); + } + + /// Checks if the given user is privileged. + pub fn is_privileged(&self, name: &str) -> bool { + self.privileged.contains(name) + } }