serenity_additions/menu/
container.rs1use 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
10pub 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}