charcoal_client/
serenity.rs

1//! Provides ClientBuilder extension for super easy use with serenity
2use futures::executor;
3use std::sync::Arc;
4
5use crate::{init_charcoal, Charcoal, CharcoalConfig};
6use serenity::prelude::TypeMapKey;
7// pub use serenity::client::ClientBuilder;
8pub 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    /// Initializes charcoal and registers it in the Serenity type-map
21    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        // Get the GuildID
36        let guild = $msg.guild(&$ctx.cache).unwrap();
37        let guild_id = guild.id;
38        // Get the charcoal manager from the serenity typemap
39        let manager = r.get::<CharcoalKey>();
40        let mut mx = manager.unwrap().lock().await;
41        // Get the PlayerObject
42        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        // Get the GuildID
52        let guild = $msg.guild(&$ctx.cache).unwrap();
53        let guild_id = guild.id;
54        // Get the charcoal manager from the serenity typemap
55        let manager = r.get::<CharcoalKey>();
56        let mut mx = manager.unwrap().lock().await;
57        // Get the PlayerObject
58        let players = mx.players.read().await;
59        $reference = players.get(&guild_id.to_string());
60    };
61}