2018-11-14 14:29:58 +00:00
|
|
|
use serenity;
|
2018-11-14 15:43:53 +00:00
|
|
|
use serenity::voice::ffmpeg;
|
2018-11-14 14:29:58 +00:00
|
|
|
|
|
|
|
use super::super::prelude::*;
|
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
use serenity::prelude::*;
|
|
|
|
use serenity::{
|
|
|
|
framework::standard::{macros::command, Args, CommandResult},
|
|
|
|
model::channel::Message,
|
|
|
|
};
|
|
|
|
|
|
|
|
#[command]
|
|
|
|
fn skip(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
|
|
|
|
if !channel_contains_author(ctx, msg) {
|
|
|
|
println!(
|
|
|
|
"user {} is not in the same voice channel as the bot",
|
|
|
|
msg.author.name
|
|
|
|
);
|
|
|
|
return Ok(());
|
2018-11-14 14:29:58 +00:00
|
|
|
}
|
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
if let Some(mut manager_lock) = ctx.data.lock().get::<VoiceManager>().cloned() {
|
|
|
|
let mut manager = manager_lock.lock();
|
2018-11-14 14:29:58 +00:00
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
let guild_id = match guild_id(msg.channel_id) {
|
|
|
|
Some(id) => id,
|
|
|
|
None => {
|
|
|
|
println!("error getting guild id");
|
|
|
|
print_error!(msg.channel_id.say("error getting guild id"));
|
2018-11-14 14:29:58 +00:00
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
if let Some(handler) = handler(guild_id, &mut manager) {
|
|
|
|
let data = ctx.data.read();
|
|
|
|
let mut media = match data.get_mut::<MediaData>() {
|
|
|
|
Ok(media) => media,
|
|
|
|
Err(_) => {
|
|
|
|
msg.channel_id.say("could not find media data");
|
2019-04-28 12:13:36 +00:00
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
let mut playlist = media.playlist_mut();
|
|
|
|
let mut song = media.song_mut();
|
2019-04-28 12:13:36 +00:00
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
// if current song is the last song in this playlist, just return
|
|
|
|
if playlist.is_empty() {
|
|
|
|
print_error!(msg
|
|
|
|
.channel_id
|
|
|
|
.say("playlist is empty, no next song available"));
|
2019-04-28 12:13:36 +00:00
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
return Ok(());
|
|
|
|
} else {
|
|
|
|
// remove the current song from the playlist
|
|
|
|
let first = playlist.remove(0);
|
2019-04-28 12:13:36 +00:00
|
|
|
|
2019-07-12 08:39:03 +00:00
|
|
|
// stop the current song from playing
|
|
|
|
handler.stop();
|
|
|
|
|
|
|
|
// load next song into memory
|
|
|
|
let source = match ffmpeg(first.name.clone()) {
|
|
|
|
Ok(mpeg) => mpeg,
|
|
|
|
Err(_) => {
|
|
|
|
playlist.clear();
|
|
|
|
*song = None;
|
|
|
|
|
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// start the next song if possible
|
|
|
|
/*
|
|
|
|
match self.media.next_callback.borrow().as_ref() {
|
|
|
|
Some(callback) => {
|
|
|
|
*song = Some(handler.play_returning_and_callback(source, callback.clone()));
|
|
|
|
let song_name = self.media.name_mut()?;
|
|
|
|
*song_name.borrow_mut() = first.name.clone();
|
|
|
|
|
|
|
|
print_error!(msg
|
|
|
|
.channel_id
|
|
|
|
.say(format!("Skipped current song, now playing: {}", first.name)));
|
2018-12-04 09:04:58 +00:00
|
|
|
}
|
2019-07-12 08:39:03 +00:00
|
|
|
None => println!("error getting callback from media"),
|
2018-12-04 09:04:58 +00:00
|
|
|
}
|
2019-07-12 08:39:03 +00:00
|
|
|
*/
|
|
|
|
*song = Some(handler.play_returning(source));
|
|
|
|
*media.song_name_mut() = first.name.clone();
|
|
|
|
|
|
|
|
print_error!(msg
|
|
|
|
.channel_id
|
|
|
|
.say(format!("Skipped current song, now playing: {}", first.name)));
|
2018-11-14 14:29:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-07-12 08:39:03 +00:00
|
|
|
|
|
|
|
Ok(())
|
2018-11-14 14:29:58 +00:00
|
|
|
}
|