diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/07_voice.rs | 156 |
1 files changed, 127 insertions, 29 deletions
diff --git a/examples/07_voice.rs b/examples/07_voice.rs index 1f9a999..e685f37 100644 --- a/examples/07_voice.rs +++ b/examples/07_voice.rs @@ -5,8 +5,12 @@ extern crate serenity; #[cfg(feature = "voice")] use serenity::client::{CACHE, Client, Context}; #[cfg(feature = "voice")] +use serenity::ext::voice; +#[cfg(feature = "voice")] use serenity::model::{ChannelId, Message}; #[cfg(feature = "voice")] +use serenity::Result as SerenityResult; +#[cfg(feature = "voice")] use std::env; #[cfg(not(feature = "voice"))] @@ -21,19 +25,24 @@ fn main() { .expect("Expected a token in the environment"); let mut client = Client::login_bot(&token); - client.with_framework(|f| - f.configure(|c| c.prefix("~")) + client.with_framework(|f| f + .configure(|c| c + .prefix("~") + .on_mention(true)) .on("deafen", deafen) .on("join", join) .on("leave", leave) .on("mute", mute) - .on("ping", ping)); + .on("play", play) + .on("ping", ping) + .on("undeafen", undeafen) + .on("unmute", unmute)); client.on_ready(|_context, ready| { println!("{} is connected!", ready.user.name); }); - let _ = client.start(); + let _ = client.start().map_err(|why| println!("Client ended: {:?}", why)); } #[cfg(feature = "voice")] @@ -41,7 +50,7 @@ fn deafen(context: &Context, message: &Message, _args: Vec<String>) { let guild_id = match CACHE.read().unwrap().get_guild_channel(message.channel_id) { Some(channel) => channel.guild_id, None => { - let _ = context.say("Groups and DMs not supported"); + check_msg(context.say("Groups and DMs not supported")); return; }, @@ -52,18 +61,18 @@ fn deafen(context: &Context, message: &Message, _args: Vec<String>) { let handler = match shard.manager.get(guild_id) { Some(handler) => handler, None => { - let _ = message.reply("Not in a voice channel"); + check_msg(message.reply("Not in a voice channel")); return; }, }; if handler.is_deafened() { - let _ = context.say("Already deafened"); + check_msg(context.say("Already deafened")); } else { handler.deafen(true); - let _ = context.say("Deafened"); + check_msg(context.say("Deafened")); } } @@ -73,13 +82,13 @@ fn join(context: &Context, message: &Message, args: Vec<String>) { Some(arg) => match arg.parse::<u64>() { Ok(id) => ChannelId(id), Err(_why) => { - let _ = message.reply("Invalid voice channel ID given"); + check_msg(message.reply("Invalid voice channel ID given")); return; }, }, None => { - let _ = message.reply("Requires a voice channel ID be given"); + check_msg(message.reply("Requires a voice channel ID be given")); return; }, @@ -88,18 +97,16 @@ fn join(context: &Context, message: &Message, args: Vec<String>) { let guild_id = match CACHE.read().unwrap().get_guild_channel(message.channel_id) { Some(channel) => channel.guild_id, None => { - let _ = context.say("Groups and DMs not supported"); + check_msg(context.say("Groups and DMs not supported")); return; }, }; let mut shard = context.shard.lock().unwrap(); - let mut manager = &mut shard.manager; + shard.manager.join(Some(guild_id), connect_to); - let _handler = manager.join(Some(guild_id), connect_to); - - let _ = context.say(&format!("Joined {}", connect_to.mention())); + check_msg(context.say(&format!("Joined {}", connect_to.mention()))); } #[cfg(feature = "voice")] @@ -107,23 +114,21 @@ fn leave(context: &Context, message: &Message, _args: Vec<String>) { let guild_id = match CACHE.read().unwrap().get_guild_channel(message.channel_id) { Some(channel) => channel.guild_id, None => { - let _ = context.say("Groups and DMs not supported"); + check_msg(context.say("Groups and DMs not supported")); return; }, }; - let is_connected = match context.shard.lock().unwrap().manager.get(guild_id) { - Some(handler) => handler.channel().is_some(), - None => false, - }; + let mut shard = context.shard.lock().unwrap(); + let has_handler = shard.manager.get(guild_id).is_some(); - if is_connected { - context.shard.lock().unwrap().manager.remove(guild_id); + if has_handler { + shard.manager.remove(guild_id); - let _ = context.say("Left voice channel"); + check_msg(context.say("Left voice channel")); } else { - let _ = message.reply("Not in a voice channel"); + check_msg(message.reply("Not in a voice channel")); } } @@ -132,7 +137,7 @@ fn mute(context: &Context, message: &Message, _args: Vec<String>) { let guild_id = match CACHE.read().unwrap().get_guild_channel(message.channel_id) { Some(channel) => channel.guild_id, None => { - let _ = context.say("Groups and DMs not supported"); + check_msg(context.say("Groups and DMs not supported")); return; }, @@ -143,22 +148,115 @@ fn mute(context: &Context, message: &Message, _args: Vec<String>) { let handler = match shard.manager.get(guild_id) { Some(handler) => handler, None => { - let _ = message.reply("Not in a voice channel"); + check_msg(message.reply("Not in a voice channel")); return; }, }; if handler.is_muted() { - let _ = context.say("Already muted"); + check_msg(context.say("Already muted")); } else { handler.mute(true); - let _ = context.say("Now muted"); + check_msg(context.say("Now muted")); } } #[cfg(feature = "voice")] fn ping(context: &Context, _message: &Message, _args: Vec<String>) { - let _ = context.say("Pong!"); + check_msg(context.say("Pong!")); +} + +#[cfg(feature = "voice")] +fn play(context: &Context, message: &Message, args: Vec<String>) { + let url = match args.get(0) { + Some(url) => url, + None => { + check_msg(context.say("Must provide a URL to a video or audio")); + + return; + }, + }; + + if !url.starts_with("http") { + check_msg(context.say("Must provide a valid URL")); + + return; + } + + let guild_id = match CACHE.read().unwrap().get_guild_channel(message.channel_id) { + Some(channel) => channel.guild_id, + None => { + check_msg(context.say("Error finding channel info")); + + return; + }, + }; + + if let Some(handler) = context.shard.lock().unwrap().manager.get(guild_id) { + let source = match voice::ytdl(url) { + Ok(source) => source, + Err(why) => { + println!("Err starting source: {:?}", why); + + check_msg(context.say("Error sourcing ffmpeg")); + + return; + }, + }; + + handler.play(source); + + check_msg(context.say("Playing song")); + } else { + check_msg(context.say("Not in a voice channel to play in")); + } +} + +#[cfg(feature = "voice")] +fn undeafen(context: &Context, message: &Message, _args: Vec<String>) { + let guild_id = match CACHE.read().unwrap().get_guild_channel(message.channel_id) { + Some(channel) => channel.guild_id, + None => { + check_msg(context.say("Error finding channel info")); + + return; + }, + }; + + if let Some(handler) = context.shard.lock().unwrap().manager.get(guild_id) { + handler.deafen(false); + + check_msg(context.say("Undeafened")); + } else { + check_msg(context.say("Not in a voice channel to undeafen in")); + } +} + +#[cfg(feature = "voice")] +fn unmute(context: &Context, message: &Message, _args: Vec<String>) { + let guild_id = match CACHE.read().unwrap().get_guild_channel(message.channel_id) { + Some(channel) => channel.guild_id, + None => { + check_msg(context.say("Error finding channel info")); + + return; + }, + }; + + if let Some(handler) = context.shard.lock().unwrap().manager.get(guild_id) { + handler.mute(false); + + check_msg(context.say("Unmuted")); + } else { + check_msg(context.say("Not in a voice channel to undeafen in")); + } +} + +/// Checks that a message successfully sent; if not, then logs why to stdout. +fn check_msg(result: SerenityResult<Message>) { + if let Err(why) = result { + println!("Error sending message: {:?}", why); + } } |