use futures::executor;
use std::sync::Arc;
use crate::{init_charcoal, Charcoal, CharcoalConfig};
use serenity::prelude::TypeMapKey;
pub use serenity::client::ClientBuilder;
use serenity::*;
use tokio::sync::Mutex;
pub struct CharcoalKey;
impl TypeMapKey for CharcoalKey {
type Value = Arc<Mutex<Charcoal>>;
}
pub trait SerenityInit {
#[must_use]
fn register_charcoal(self, broker: String, config: CharcoalConfig) -> Self;
}
impl SerenityInit for ClientBuilder {
fn register_charcoal(self, broker: String, config: CharcoalConfig) -> Self {
let c = init_charcoal(broker, config);
self.type_map_insert::<CharcoalKey>(executor::block_on(c))
}
}
#[macro_export]
macro_rules! get_handler_from_serenity_mutable {
($ctx: expr,$msg: expr,$reference: ident) => {
let r = $ctx.data.read().await;
let guild = $msg.guild(&$ctx.cache).unwrap();
let guild_id = guild.id;
let manager = r.get::<CharcoalKey>();
let mut mx = manager.unwrap().lock().await;
let mut players = mx.players.write().await;
$reference = players.get_mut(&guild_id.to_string());
};
}
#[macro_export]
macro_rules! get_handler_from_serenity {
($ctx: expr,$msg: expr,$reference: ident) => {
let r = $ctx.data.read().await;
let guild = $msg.guild(&$ctx.cache).unwrap();
let guild_id = guild.id;
let manager = r.get::<CharcoalKey>();
let mut mx = manager.unwrap().lock().await;
let players = mx.players.read().await;
$reference = players.get(&guild_id.to_string());
};
}