use serenity::{ client::Context, model::{ id::{ ChannelId, MessageId, }, permissions::Permissions, }, }; use lazy_static::lazy_static; use log::debug; use serenity::{ all::CreateMessage, futures::{ AsyncReadExt, StreamExt, }, }; use url::Url; use crate::{ audio::PlayQueue, Result, CONFIG, }; pub async fn currently_playing(ctx: &Context) -> bool { let queue_lock = { let data = ctx.data.read().await; data.get::().cloned().unwrap() }; let play_queue = queue_lock.read().unwrap(); play_queue.playing.is_some() } pub async fn users_listening(ctx: &Context) -> Result { let channel = CONFIG.discord.voice_channel().to_channel(&ctx).await?; let res = channel .guild() .and_then(|ch| ch.guild(&ctx)) .map(|g| { (&g.voice_states) .into_iter() .any(|(_, state)| state.channel_id == Some(CONFIG.discord.voice_channel())) }) .unwrap_or(false); Ok(res) } #[inline] pub async fn send( ctx: &Context, channel: ChannelId, text: impl AsRef, tts: bool, ) -> Result<()> { send_result(ctx, channel, text, tts).await.map(|_| ()) } pub async fn send_result( ctx: &Context, channel: ChannelId, text: impl AsRef, tts: bool, ) -> Result { let text = text.as_ref(); debug!("sending message {:?} to channel {:?} (tts: {})", text, channel, tts); let result = channel.send_message(ctx, CreateMessage::default().content(text).tts(tts)).await?; Ok(result.id) } lazy_static! { static ref REQUIRED_PERMS: Permissions = Permissions::EMBED_LINKS | Permissions::READ_MESSAGES | Permissions::ADD_REACTIONS | Permissions::SEND_MESSAGES | Permissions::SEND_TTS_MESSAGES | Permissions::MENTION_EVERYONE | Permissions::USE_EXTERNAL_EMOJIS | Permissions::CONNECT | Permissions::SPEAK | Permissions::CHANGE_NICKNAME | Permissions::USE_VAD | Permissions::ATTACH_FILES; } lazy_static! { pub static ref OAUTH_URL: Url = Url::parse(&format!( "https://discordapp.com/api/oauth2/authorize?scope=bot&permissions={}&client_id={}", REQUIRED_PERMS.bits(), CONFIG.discord.auth.client_id, )) .unwrap(); }