use serde_json::Value;
use std::collections::HashMap;
use std::sync::mpsc::Sender as MpscSender;
use super::Handler;
use ::model::{ChannelId, GuildId, UserId};
#[derive(Clone, Debug)]
pub struct Manager {
handlers: HashMap<GuildId, Handler>,
user_id: UserId,
ws: MpscSender<Value>,
}
impl Manager {
pub(crate) fn new(ws: MpscSender<Value>, user_id: UserId) -> Manager {
Manager {
handlers: HashMap::new(),
user_id: user_id,
ws: ws,
}
}
pub fn get<G: Into<GuildId>>(&mut self, guild_id: G) -> Option<&mut Handler> {
self.handlers.get_mut(&guild_id.into())
}
#[allow(map_entry)]
pub fn join<C, G>(&mut self, guild_id: G, channel_id: C) -> &mut Handler
where C: Into<ChannelId>, G: Into<GuildId> {
let channel_id = channel_id.into();
let guild_id = guild_id.into();
{
let mut found = false;
if let Some(handler) = self.handlers.get_mut(&guild_id) {
handler.switch_to(channel_id);
found = true;
}
if found {
return self.handlers.get_mut(&guild_id).unwrap();
}
}
let mut handler = Handler::new(guild_id, self.ws.clone(), self.user_id);
handler.join(channel_id);
self.handlers.insert(guild_id, handler);
self.handlers.get_mut(&guild_id).unwrap()
}
pub fn leave<G: Into<GuildId>>(&mut self, guild_id: G) {
if let Some(handler) = self.handlers.get_mut(&guild_id.into()) {
handler.leave();
}
}
pub fn remove<G: Into<GuildId>>(&mut self, guild_id: G) {
let guild_id = guild_id.into();
self.leave(guild_id);
self.handlers.remove(&guild_id);
}
}