use std::{
collections::{hash_set::Iter, HashMap},
net::SocketAddr,
};
use crate::{
room::RoomKey,
user::{UserKey, WorldUser},
};
pub(super) struct UserStore {
users: HashMap<UserKey, WorldUser>,
disconnected_users: HashMap<SocketAddr, UserKey>,
}
impl UserStore {
pub(super) fn new() -> Self {
Self {
users: HashMap::new(),
disconnected_users: HashMap::new(),
}
}
pub(super) fn get(&self, key: &UserKey) -> Option<&WorldUser> {
self.users.get(key)
}
pub(super) fn get_mut(&mut self, key: &UserKey) -> Option<&mut WorldUser> {
self.users.get_mut(key)
}
pub(super) fn contains(&self, key: &UserKey) -> bool {
self.users.contains_key(key)
}
pub(super) fn insert(&mut self, key: UserKey, user: WorldUser) {
self.users.insert(key, user);
}
pub(super) fn remove(&mut self, key: &UserKey) -> Option<WorldUser> {
self.users.remove(key)
}
pub(super) fn len(&self) -> usize {
self.users.len()
}
pub(super) fn iter(&self) -> impl Iterator<Item = (&UserKey, &WorldUser)> {
self.users.iter()
}
pub(super) fn keys_copied(&self) -> Vec<UserKey> {
self.users.keys().copied().collect()
}
pub(super) fn address(&self, key: &UserKey) -> Option<SocketAddr> {
self.users.get(key).map(|u| u.address())
}
pub(super) fn room_keys_iter(&self, key: &UserKey) -> Option<Iter<'_, RoomKey>> {
self.users.get(key).map(|u| u.room_keys().iter())
}
pub(super) fn rooms_count(&self, key: &UserKey) -> Option<usize> {
self.users.get(key).map(|u| u.rooms_count())
}
pub(super) fn register_disconnected(&mut self, addr: SocketAddr, key: UserKey) {
self.disconnected_users.insert(addr, key);
}
pub(super) fn take_disconnected(&mut self, addr: &SocketAddr) -> Option<UserKey> {
self.disconnected_users.remove(addr)
}
}