use crate::presence::event_engine::PresenceEffectInvocation;
use crate::{
dx::presence::event_engine::{PresenceEvent, PresenceEventEngine},
lib::{
alloc::{string::String, sync::Arc, vec::Vec},
core::{
fmt::{Debug, Formatter, Result},
ops::{Deref, DerefMut},
},
},
};
#[derive(Debug)]
pub(crate) struct PresenceManager {
pub(crate) inner: Arc<PresenceManagerRef>,
}
impl PresenceManager {
pub fn new(
event_engine: Arc<PresenceEventEngine>,
heartbeat_interval: u64,
suppress_leave_events: bool,
) -> Self {
Self {
inner: Arc::new(PresenceManagerRef {
event_engine,
heartbeat_interval,
suppress_leave_events,
}),
}
}
pub fn terminate(&self) {
self.event_engine
.stop(PresenceEffectInvocation::TerminateEventEngine);
}
}
impl Deref for PresenceManager {
type Target = PresenceManagerRef;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl DerefMut for PresenceManager {
fn deref_mut(&mut self) -> &mut Self::Target {
Arc::get_mut(&mut self.inner).expect("Presence configuration is not unique.")
}
}
impl Clone for PresenceManager {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
pub(crate) struct PresenceManagerRef {
pub event_engine: Arc<PresenceEventEngine>,
heartbeat_interval: u64,
suppress_leave_events: bool,
}
impl PresenceManagerRef {
pub(crate) fn announce_join(
&self,
channels: Option<Vec<String>>,
channel_groups: Option<Vec<String>>,
) {
self.event_engine.process(&PresenceEvent::Joined {
heartbeat_interval: self.heartbeat_interval,
channels,
channel_groups,
});
}
pub(crate) fn announce_left(
&self,
channels: Option<Vec<String>>,
channel_groups: Option<Vec<String>>,
) {
self.event_engine.process(&PresenceEvent::Left {
suppress_leave_events: self.suppress_leave_events,
channels,
channel_groups,
})
}
pub(crate) fn announce_left_all(&self) {
self.event_engine.process(&PresenceEvent::LeftAll {
suppress_leave_events: self.suppress_leave_events,
})
}
pub(crate) fn disconnect(&self) {
self.event_engine.process(&PresenceEvent::Disconnect);
}
pub(crate) fn reconnect(&self) {
self.event_engine.process(&PresenceEvent::Reconnect);
}
}
impl Debug for PresenceManagerRef {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"PresenceConfiguration {{ event_engine: {:?} }}",
self.event_engine
)
}
}