aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/07_voice.rs156
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);
+ }
}