use std::sync::Arc; use serde::Serialize; use uuid::Uuid; use crate::service::ServiceContext; pub mod audit; pub mod categories; pub mod channel_roles; pub mod channels; pub mod custom_emojis; pub mod events; pub mod forum_tags; pub mod integrations; pub mod invitations; pub mod members; pub mod repo_links; pub mod session; pub mod slash_commands; pub mod stages; pub mod util; pub mod voice; pub mod webhooks; pub use session::ImSession; #[derive(Clone)] pub struct ImService { pub ctx: Arc, } impl ImService { pub(crate) fn emit_event(&self, event: events::ImEvent) { let _ = self.ctx.im_events.publish(event); } pub(crate) async fn publish(&self, subject: &str, request_id: Uuid, event: &T) { match self .ctx .nats .publish_with_headers( subject, &serde_json::to_vec(event).unwrap_or_default(), vec![("X-Request-Id".into(), request_id.to_string())], ) .await { Ok(_) => { tracing::debug!(subject, %request_id, "nats event published"); } Err(e) => { tracing::warn!(subject, error = %e, "nats publish failed"); } } } }