use crate::{Config, Songbird};
use serenity::{
client::{ClientBuilder, Context},
prelude::TypeMapKey,
};
use std::sync::Arc;
pub struct SongbirdKey;
impl TypeMapKey for SongbirdKey {
type Value = Arc<Songbird>;
}
pub fn register(client_builder: ClientBuilder) -> ClientBuilder {
let voice = Songbird::serenity();
register_with(client_builder, voice)
}
pub fn register_with(client_builder: ClientBuilder, voice: Arc<Songbird>) -> ClientBuilder {
client_builder
.voice_manager_arc(voice.clone())
.type_map_insert::<SongbirdKey>(voice)
}
pub fn register_from_config(client_builder: ClientBuilder, config: Config) -> ClientBuilder {
let voice = Songbird::serenity_from_config(config);
register_with(client_builder, voice)
}
pub async fn get(ctx: &Context) -> Option<Arc<Songbird>> {
let data = ctx.data.read().await;
data.get::<SongbirdKey>().cloned()
}
pub trait SerenityInit {
#[must_use]
fn register_songbird(self) -> Self;
#[must_use]
fn register_songbird_with(self, voice: Arc<Songbird>) -> Self;
#[must_use]
fn register_songbird_from_config(self, config: Config) -> Self;
}
impl SerenityInit for ClientBuilder {
fn register_songbird(self) -> Self {
register(self)
}
fn register_songbird_with(self, voice: Arc<Songbird>) -> Self {
register_with(self, voice)
}
fn register_songbird_from_config(self, config: Config) -> Self {
register_from_config(self, config)
}
}