diff options
Diffstat (limited to 'src/commands.rs')
| -rw-r--r-- | src/commands.rs | 257 |
1 files changed, 251 insertions, 6 deletions
diff --git a/src/commands.rs b/src/commands.rs index e802bde..ae8ae25 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,6 +1,251 @@ -//use serenity::prelude::*; -//use serenity::framework::StandardFramework; -// -//pub fn register_commands(mut f: StandardFramework) -> StandardFramework { -// f -//} +use std::sync::{Arc, Mutex as SMutex}; +use std::collections::VecDeque; + +use serenity::prelude::*; +use serenity::client::bridge::voice::ClientVoiceManager; +use serenity::framework::StandardFramework; +use serenity::model::channel::GuildChannel; +use serenity::voice::LockedAudio; + +use typemap::Key; + +use {Result, TARGET_GUILD_ID}; + +pub struct VoiceManager; + +impl Key for VoiceManager { + type Value = Arc<Mutex<ClientVoiceManager>>; +} + +impl VoiceManager { + pub fn register(c: &mut Client) { + let mut data = c.data.lock(); + data.insert::<VoiceManager>(Arc::clone(&c.voice_manager)); + } +} + +struct PlayArgs { + url: String, + initiator: String, +} + +struct CurrentItem { + init_args: PlayArgs, + audio: Option<LockedAudio>, +} + +pub struct PlayQueue { + queue: VecDeque<PlayArgs>, + playing: Option<CurrentItem>, +} + +impl Key for PlayQueue { + type Value = Arc<SMutex<PlayQueue>>; +} + +impl PlayQueue { + fn new() -> Self { + PlayQueue { + queue: VecDeque::new(), + playing: None, + } + } + + pub fn register(c: &mut Client) { + let mut data = c.data.lock(); + data.insert::<PlayQueue>(Arc::new(SMutex::new(PlayQueue::new()))); + } + + fn advance(&mut self) { + self.queue.pop_front().map(|info| { + self.playing = Some(CurrentItem { + init_args: info, + audio: None, + }); + }); + } +} + +fn send(channel: &GuildChannel, text: &str, tts: bool) -> Result<()> { + channel.send_message(|m| m.content(text).tts(tts))?; + Ok(()) +} + +pub fn register_commands(f: StandardFramework) -> StandardFramework { + f + .cmd("skip", skip) + .cmd("pause", pause) + .cmd("resume", resume) + .cmd("list", list) + .cmd("die", die) + .cmd("meme", meme) + .cmd("mute", mute) + .cmd("unmute", unmute) +} + +command!(skip(ctx, _msg) { + let data = ctx.data.lock(); + + let mut mgr_lock = data.get::<VoiceManager>().cloned().unwrap(); + let mut manager = mgr_lock.lock(); + + let mut queue_lock = data.get::<PlayQueue>().cloned().unwrap(); + let mut play_queue = queue_lock.lock().unwrap(); + + if let Some(handler) = manager.get_mut(*TARGET_GUILD_ID) { + handler.stop(); + play_queue.advance(); + } else { + debug!("got skip with no handler attached"); + } +}); + +command!(pause(ctx, msg) { + let mut queue_lock = ctx.data.lock().get::<PlayQueue>().cloned().unwrap(); + let mut play_queue = queue_lock.lock().unwrap(); + + let channel_tmp = msg.channel().unwrap().guild().unwrap(); + let channel = channel_tmp.read(); + + let done = || send(&channel, "r u srs", msg.tts); + + let current_item = match play_queue.playing { + Some(ref x) => x, + None => { + done()?; + return Ok(()); + }, + }; + + let locked_audio = match current_item.audio { + Some(ref x) => x, + None => { + done()?; + return Ok(()); + }, + }; + + let mut audio = locked_audio.lock(); + + if !audio.playing { + done()?; + return Ok(()); + } + + audio.pause(); +}); + +command!(resume(ctx, msg) { + let mut queue_lock = ctx.data.lock().get::<PlayQueue>().cloned().unwrap(); + let mut play_queue = queue_lock.lock().unwrap(); + + let channel_tmp = msg.channel().unwrap().guild().unwrap(); + let channel = channel_tmp.read(); + + let done = || send(&channel, "r u srs", msg.tts); + + let current_item = match play_queue.playing { + Some(ref x) => x, + None => { + done()?; + return Ok(()); + }, + }; + + let locked_audio = match current_item.audio { + Some(ref x) => x, + None => { + done()?; + return Ok(()); + }, + }; + + let mut audio = locked_audio.lock(); + + if audio.playing { + done()?; + return Ok(()); + } + + audio.play(); +}); + +command!(die(ctx, msg) { + let data = ctx.data.lock(); + + let mut mgr_lock = data.get::<VoiceManager>().cloned().unwrap(); + let mut manager = mgr_lock.lock(); + + let mut queue_lock = data.get::<PlayQueue>().cloned().unwrap(); + let mut play_queue = queue_lock.lock().unwrap(); + + let channel_tmp = msg.channel().unwrap().guild().unwrap(); + let channel = channel_tmp.read(); + + play_queue.playing = None; + play_queue.queue.clear(); + + if let Some(handler) = manager.get_mut(*TARGET_GUILD_ID) { + handler.stop(); + } else { + send(&channel, "YOU die", msg.tts)?; + debug!("got die with no handler attached"); + } +}); + +command!(list(ctx, msg) { + let mut queue_lock = ctx.data.lock().get::<PlayQueue>().cloned().unwrap(); + let mut play_queue = queue_lock.lock().unwrap(); + + let channel_tmp = msg.channel().unwrap().guild().unwrap(); + let channel = channel_tmp.read(); + + match play_queue.playing { + Some(ref info) => { + send(&channel, &format!("Currently playing {} ({})", info.init_args.url, info.init_args.initiator), msg.tts)?; + }, + None => { + debug!("`list` called with no items in queue"); + send(&channel, "Nothing is playing you fucking meme", msg.tts)?; + return Ok(()); + }, + } + + play_queue.queue.iter().for_each(|info| { + channel.say(&format!("{} ({})", info.url, info.initiator)).unwrap(); + }); +}); + +command!(meme(_ctx, _msg) { + +}); + +command!(mute(ctx, _msg) { + let mut mgr_lock = ctx.data.lock().get::<VoiceManager>().cloned().unwrap(); + let mut manager = mgr_lock.lock(); + + manager.get_mut(*TARGET_GUILD_ID) + .map(|handler| { + if handler.self_mute { + trace!("Already muted.") + } else { + handler.mute(true); + trace!("Muted"); + } + }); +}); + +command!(unmute(ctx, _msg) { + let mut mgr_lock = ctx.data.lock().get::<VoiceManager>().cloned().unwrap(); + let mut manager = mgr_lock.lock(); + + manager.get_mut(*TARGET_GUILD_ID) + .map(|handler| { + if !handler.self_mute { + trace!("Already unmuted.") + } else { + handler.mute(false); + trace!("Unmuted"); + } + }); +});
\ No newline at end of file |
