use serenity; use serenity::voice::ffmpeg; use super::super::prelude::*; 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(()); } let mut data = ctx.data.write(); if let Some(manager_lock) = data.get_mut::().cloned() { let mut manager = manager_lock.lock(); let guild_id = check_result_return_ok!(guild_id(ctx, msg)); if let Some(handler) = handler(guild_id, &mut manager) { let media = match data.get_mut::() { Some(media) => media, None => { display_error_ok!(msg.channel_id.say(&ctx.http, "could not find media data")); return Ok(()); } }; // if current song is the last song in this playlist, just return if media.playlist().is_empty() { print_error!(msg .channel_id .say(&ctx.http, "playlist is empty, no next song available")); return Ok(()); } else { // remove the current song from the playlist let first = media.playlist_mut().remove(0); // stop the current song from playing handler.stop(); // load next song into memory let source = match ffmpeg(first.name.clone()) { Ok(mpeg) => mpeg, Err(_) => { media.playlist_mut().clear(); *media.song_mut() = 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))); } None => println!("error getting callback from media"), } */ *media.song_mut() = Some(handler.play_returning(source)); *media.song_name_mut() = first.name.clone(); print_error!(msg.channel_id.say( &ctx.http, format!("Skipped current song, now playing: {}", first.name) )); } } } Ok(()) }