Browse Source

Start fleshing out UserMap.

wip
Titouan Rigoudy 9 years ago
parent
commit
df3c24011c
2 changed files with 55 additions and 8 deletions
  1. +4
    -6
      src/client.rs
  2. +51
    -2
      src/user.rs

+ 4
- 6
src/client.rs View File

@ -8,6 +8,7 @@ use control;
use proto::{Response, Request}; use proto::{Response, Request};
use proto::server::*; use proto::server::*;
use room; use room;
use user;
#[derive(Debug)] #[derive(Debug)]
enum IncomingMessage { enum IncomingMessage {
@ -33,7 +34,7 @@ pub struct Client {
login_status: LoginStatus, login_status: LoginStatus,
rooms: room::RoomMap, rooms: room::RoomMap,
privileged_users: collections::HashSet<String>,
users: user::UserMap,
} }
impl Client { impl Client {
@ -55,7 +56,7 @@ impl Client {
login_status: LoginStatus::Pending, login_status: LoginStatus::Pending,
rooms: room::RoomMap::new(), rooms: room::RoomMap::new(),
privileged_users: collections::HashSet::new(),
users: user::UserMap::new(),
} }
} }
@ -296,9 +297,6 @@ impl Client {
fn handle_privileged_users_response( fn handle_privileged_users_response(
&mut self, mut response: PrivilegedUsersResponse) &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);
} }
} }

+ 51
- 2
src/user.rs View File

@ -1,3 +1,6 @@
use std::collections;
use proto::server;
/// This enumeration is the list of possible user statuses. /// This enumeration is the list of possible user statuses.
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
pub enum Status { pub enum Status {
@ -24,6 +27,52 @@ pub struct User {
pub num_files: usize, pub num_files: usize,
/// The number of folders this user shares. /// The number of folders this user shares.
pub num_folders: usize, 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<String, User>,
/// The set of privileged users.
privileged: collections::HashSet<String>,
}
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)
}
} }

Loading…
Cancel
Save