use crate::SystemUiEvent; use std::{collections::HashMap, sync::{mpsc::Sender, Arc}}; #[derive(Clone)] pub struct Logger { system_name: String, ui_sender : Sender<(String, SystemUiEvent)>, name_lookup: Arc>, } impl Logger { pub fn new(system_name: String, system_config: crate::config::System, ui_sender: Sender<(String, SystemUiEvent)>) -> Self { Self { system_name, ui_sender, name_lookup: Arc::new(system_config.members.iter().map(|member| (member.discord_token.clone(), member.name.clone())).collect::>()), } } pub async fn log_connect(&self, member_token: String) { let member_name = self.name_lookup.get(&member_token).expect("Member not found").clone(); let _ = self.ui_sender.send((self.system_name.clone(), SystemUiEvent::GatewayConnect(member_name))); } pub async fn log_disconnect(&self, member_token: String) { let member_name = self.name_lookup.get(&member_token).expect("Member not found").clone(); let _ = self.ui_sender.send((self.system_name.clone(), SystemUiEvent::GatewayDisconnect(member_name))); } pub async fn log_err(&self, member_token: Option, message: String) { let member = member_token.map(|token| self.name_lookup.get(&token).cloned()).flatten(); let _ = self.ui_sender.send(( self.system_name.clone(), SystemUiEvent::LogLine(if let Some(member_name) = member { format!("{member_name}: Error: {message}") } else { format!("{message}") }) )); } pub async fn log_line(&self, member_token: Option, message: String) { let member = member_token.map(|token| self.name_lookup.get(&token).cloned()).flatten(); let _ = self.ui_sender.send(( self.system_name.clone(), SystemUiEvent::LogLine(if let Some(member_name) = member { format!("{member_name}: {message}") } else { format!("{message}") }) )); } }