Skip to main content

serenity_additions/menu/
container.rs

1use crate::core::{BoxedMessage, MessageHandle};
2use crate::Error;
3use crate::Result;
4use dashmap::DashMap;
5use serenity::client::Context;
6use serenity::prelude::TypeMapKey;
7use std::sync::Arc;
8use tokio::sync::Mutex;
9
10/// Container to store event driven messages in the serenity context data
11pub struct EventDrivenMessageContainer;
12pub type MessageRef = Arc<Mutex<BoxedMessage>>;
13pub type EventDrivenMessagesRef = Arc<DashMap<MessageHandle, MessageRef>>;
14
15impl TypeMapKey for EventDrivenMessageContainer {
16    type Value = EventDrivenMessagesRef;
17}
18
19#[tracing::instrument(level = "trace", skip(ctx))]
20pub async fn get_listeners_from_context(ctx: &Context) -> Result<EventDrivenMessagesRef> {
21    let data = ctx.data.read().await;
22    let listeners = data
23        .get::<EventDrivenMessageContainer>()
24        .ok_or(Error::Uninitialized)?;
25    Ok(listeners.clone())
26}