use actix::prelude::{Actor, Context, Recipient};
use crate::core::auth0::UserDetails;
use crate::websocket::webchat::output::Level;
use crate::websocket::webchat::output::OutputMessage;
use crate::websocket::webchat::output::OutputMessageType;
use crate::websocket::webchat::output::TypedMessage;
use crate::websocket::webchat::ConnectId;
#[allow(dead_code)]
pub struct Server {
pub ctx: actix_web::web::Data<crate::server::AppContext>,
pub connections: std::collections::HashMap<ConnectId, Recipient<OutputMessage>>,
pub user_infos: std::collections::HashMap<ConnectId, UserDetails>,
pub subscribes: std::collections::HashMap<ConnectId, Vec<String>>,
}
impl Actor for Server {
type Context = Context<Self>;
}
impl Server {
pub fn build(ctx: actix_web::web::Data<crate::server::AppContext>) -> Self {
Self {
ctx,
connections: std::collections::HashMap::default(),
user_infos: std::collections::HashMap::default(),
subscribes: std::collections::HashMap::default(),
}
}
pub fn destroy(&mut self, connection_id: &str) {
self.connections.remove(connection_id);
self.user_infos.remove(connection_id);
self.subscribes.remove(connection_id);
}
pub fn send_message(
&self,
level: Level,
ty: OutputMessageType,
connect_id: &str,
msg: &str,
id: Option<String>,
) {
if let Some(socket_recipient) = self.connections.get(connect_id) {
socket_recipient.do_send(OutputMessage {
id,
level,
ty,
msg: TypedMessage::TextMessage(msg.to_string()),
});
} else {
log::warn!("attempting to send message but couldn't find user id.");
}
}
pub fn send_json(
&self,
level: Level,
ty: OutputMessageType,
connect_id: &str,
msg: serde_json::Value,
id: Option<String>,
) {
if let Some(socket_recipient) = self.connections.get(connect_id) {
socket_recipient.do_send(OutputMessage {
id,
level,
ty,
msg: TypedMessage::JsonMessage(msg),
});
} else {
log::warn!("attempting to send message but couldn't find user id.");
}
}
pub fn broadcase_message(&self, level: Level, ty: OutputMessageType, msg: &str) {
self.connections
.iter()
.for_each(|conn| self.send_message(level, ty, conn.0, msg, None));
}
}