charcoal_client/
serenity.rs1use futures::executor;
3use std::sync::Arc;
4
5use crate::{init_charcoal, Charcoal, CharcoalConfig};
6use serenity::prelude::TypeMapKey;
7pub use serenity::client::ClientBuilder;
9use serenity::*;
10use tokio::sync::Mutex;
11
12pub struct CharcoalKey;
13
14impl TypeMapKey for CharcoalKey {
15 type Value = Arc<Mutex<Charcoal>>;
16}
17
18pub trait SerenityInit {
19 #[must_use]
20 fn register_charcoal(self, broker: String, config: CharcoalConfig) -> Self;
22}
23
24impl SerenityInit for ClientBuilder {
25 fn register_charcoal(self, broker: String, config: CharcoalConfig) -> Self {
26 let c = init_charcoal(broker, config);
27 self.type_map_insert::<CharcoalKey>(executor::block_on(c))
28 }
29}
30
31#[macro_export]
32macro_rules! get_handler_from_serenity_mutable {
33 ($ctx: expr,$msg: expr,$reference: ident) => {
34 let r = $ctx.data.read().await;
35 let guild = $msg.guild(&$ctx.cache).unwrap();
37 let guild_id = guild.id;
38 let manager = r.get::<CharcoalKey>();
40 let mut mx = manager.unwrap().lock().await;
41 let mut players = mx.players.write().await;
43 $reference = players.get_mut(&guild_id.to_string());
44 };
45}
46
47#[macro_export]
48macro_rules! get_handler_from_serenity {
49 ($ctx: expr,$msg: expr,$reference: ident) => {
50 let r = $ctx.data.read().await;
51 let guild = $msg.guild(&$ctx.cache).unwrap();
53 let guild_id = guild.id;
54 let manager = r.get::<CharcoalKey>();
56 let mut mx = manager.unwrap().lock().await;
57 let players = mx.players.read().await;
59 $reference = players.get(&guild_id.to_string());
60 };
61}