diff --git a/README.md b/README.md index 706e82c..e763802 100644 --- a/README.md +++ b/README.md @@ -45,12 +45,14 @@ Because the play command is defined as `play [URL]`, and the queue command is de * `skip` - If a song is playing, the bot will skip it and play the next song in the queue. -* `queue [all|clear]` - Lists up to the first 10 items on the queue, if no argument is given. +* `queue [all|clear|save]` - Lists up to the first 10 items on the queue, if no argument is given. - * If you add `all`, the bot will upload a list to [PasteBin](http://pastebin.com) of the entire queue, provided it is greater than 10 elements, and give you a link which expires in 10 minutes. + * `all` - The bot will upload a list to [PasteBin](http://pastebin.com) of the entire queue, provided it is greater than 10 elements, and give you a link which expires in 10 minutes. + + * `clear` - The queue will be cleared and the current song will be stopped. + + * `save ` - The queue will be saved as a playlist with the given name. - * If `clear` is used, the queue will be cleared and the current song will be stopped. - * `repeat [true|false]` - Sets the bot to repeat the playlist, as in once a song is removed from the queue to be played, it is added back to the end of the playlist. * `shuffle [true|false]` - Sets the bot to shuffle the playlist, as in pull a random song from the playlist, with some filters to prevent repeating songs. diff --git a/src/main/java/handiebot/HandieBot.java b/src/main/java/handiebot/HandieBot.java index a92be94..3f13e77 100644 --- a/src/main/java/handiebot/HandieBot.java +++ b/src/main/java/handiebot/HandieBot.java @@ -1,6 +1,7 @@ package handiebot; import handiebot.command.CommandHandler; +import handiebot.command.types.ReactionHandler; import handiebot.lavaplayer.MusicPlayer; import handiebot.utils.DisappearingMessage; import handiebot.view.BotLog; @@ -11,6 +12,7 @@ import sx.blah.discord.api.IDiscordClient; import sx.blah.discord.api.events.EventSubscriber; import sx.blah.discord.handle.impl.events.ReadyEvent; import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent; +import sx.blah.discord.handle.impl.events.guild.channel.message.reaction.ReactionEvent; import sx.blah.discord.handle.obj.IGuild; import sx.blah.discord.util.DiscordException; import sx.blah.discord.util.RateLimitException; @@ -31,12 +33,16 @@ public class HandieBot { private static BotWindow window; public static BotLog log; - private static CommandHandler commandHandler; public static MusicPlayer musicPlayer; @EventSubscriber public void onMessageReceived(MessageReceivedEvent event) { - commandHandler.handleCommand(event); + CommandHandler.handleCommand(event); + } + + @EventSubscriber + public void onReactionReceived(ReactionEvent event){ + ReactionHandler.handleReaction(event); } @EventSubscriber diff --git a/src/main/java/handiebot/command/commands/HelpCommand.java b/src/main/java/handiebot/command/commands/HelpCommand.java index a4d2e7d..bd1c5c9 100644 --- a/src/main/java/handiebot/command/commands/HelpCommand.java +++ b/src/main/java/handiebot/command/commands/HelpCommand.java @@ -5,9 +5,6 @@ import handiebot.command.Commands; import handiebot.command.types.Command; import handiebot.command.types.ContextCommand; import sx.blah.discord.handle.obj.IPrivateChannel; -import sx.blah.discord.util.EmbedBuilder; - -import java.awt.*; /** * @author Andrew Lalis @@ -24,30 +21,25 @@ public class HelpCommand extends ContextCommand { @Override public void execute(CommandContext context) { IPrivateChannel pm = context.getUser().getOrCreatePMChannel(); - EmbedBuilder builder = new EmbedBuilder(); - builder.withAuthorName("HandieBot"); - builder.withAuthorUrl("https://github.com/andrewlalis/HandieBot"); - builder.withAuthorIcon("https://github.com/andrewlalis/HandieBot/blob/master/src/main/resources/icon.png"); - - builder.withColor(new Color(255, 0, 0)); - builder.withDescription("I'm a discord bot that can manage music, as well as some other important functions which will be implemented later on. Some commands are shown below."); - - //Music Commands: - - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder("HandieBot Commands:\n"); for (Command cmd : Commands.commands){ - sb.append('`'); + StringBuilder commandText = new StringBuilder(); + commandText.append("- `"); if (cmd instanceof ContextCommand){ - sb.append(((ContextCommand)cmd).getUsage(context.getGuild())); + commandText.append(((ContextCommand)cmd).getUsage(context.getGuild())); } else { - sb.append(cmd.getUsage()); + commandText.append(cmd.getUsage()); + } + commandText.append("`\n").append(cmd.getDescription()).append("\n\n"); + if (sb.length() + commandText.length() > 2000){ + pm.sendMessage(sb.toString()); + sb = commandText; + } else { + sb.append(commandText); } - sb.append("`\n").append(cmd.getDescription()).append('\n'); } - builder.appendField("Commands:", sb.toString(), false); - - pm.sendMessage(builder.build()); + pm.sendMessage(sb.toString()); } } diff --git a/src/main/java/handiebot/command/commands/music/PlaylistCommand.java b/src/main/java/handiebot/command/commands/music/PlaylistCommand.java index 7e620d7..336ab70 100644 --- a/src/main/java/handiebot/command/commands/music/PlaylistCommand.java +++ b/src/main/java/handiebot/command/commands/music/PlaylistCommand.java @@ -26,14 +26,14 @@ public class PlaylistCommand extends ContextCommand { super("playlist", " [PLAYLIST]", "Do something with a playlist.\n" + - "\tcreate - Creates a playlist.\n" + - "\tdelete - Deletes a playlist.\n" + - "\tshow [PLAYLIST] - If a playlist given, show that, otherwise show a list of playlists.\n" + - "\tadd [URL]... - Adds one or more songs to a playlist.\n" + - "\tremove - Removes a song from a playlist.\n" + - "\trename - Renames a playlist.\n" + - "\tmove - Moves a song from one index to another.\n" + - "\tplay - Queues all songs from a playlist."); + "\t`create ` - Creates a playlist.\n" + + "\t`delete ` - Deletes a playlist.\n" + + "\t`show [PLAYLIST]` - If a playlist given, show that, otherwise show a list of playlists.\n" + + "\t`add [URL]...` - Adds one or more songs to a playlist.\n" + + "\t`remove ` - Removes a song from a playlist.\n" + + "\t`rename ` - Renames a playlist.\n" + + "\t`move ` - Moves a song from one index to another.\n" + + "\t`play ` - Queues all songs from a playlist."); } @Override diff --git a/src/main/java/handiebot/command/commands/music/QueueCommand.java b/src/main/java/handiebot/command/commands/music/QueueCommand.java index 60d864e..6e982a7 100644 --- a/src/main/java/handiebot/command/commands/music/QueueCommand.java +++ b/src/main/java/handiebot/command/commands/music/QueueCommand.java @@ -3,6 +3,11 @@ package handiebot.command.commands.music; import handiebot.HandieBot; import handiebot.command.CommandContext; import handiebot.command.types.ContextCommand; +import handiebot.lavaplayer.playlist.Playlist; +import handiebot.utils.DisappearingMessage; +import handiebot.view.BotLog; + +import static handiebot.HandieBot.log; /** * @author Andrew Lalis @@ -11,19 +16,27 @@ import handiebot.command.types.ContextCommand; public class QueueCommand extends ContextCommand { public QueueCommand() { super("queue", - "[all|clear]", + "[all|clear|save]", "Shows the first 10 songs in the queue.\n" + - "\tall - Shows all songs.\n" + - "\tclear - Clears the queue and stops playing."); + "\t`all` - Shows all songs.\n" + + "\t`clear` - Clears the queue and stops playing.\n" + + "\t`save ` - Saves the queue to a playlist."); } @Override public void execute(CommandContext context) { - if (context.getArgs().length == 1){ + if (context.getArgs().length > 0){ if (context.getArgs()[0].equals("all")){ HandieBot.musicPlayer.showQueueList(context.getGuild(), true); } else if (context.getArgs()[0].equals("clear")){ HandieBot.musicPlayer.clearQueue(context.getGuild()); + log.log(BotLog.TYPE.MUSIC, context.getGuild(), "Cleared queue."); + } else if (context.getArgs()[0].equals("save") && context.getArgs().length == 2){ + Playlist p = HandieBot.musicPlayer.getAllSongsInQueue(context.getGuild()); + p.setName(context.getArgs()[1]); + p.save(); + new DisappearingMessage(context.getChannel(), "Saved "+p.getTrackCount()+" tracks to playlist **"+p.getName()+"**.", 6000); + log.log(BotLog.TYPE.INFO, "Saved queue to playlist ["+p.getName()+"]."); } } else { HandieBot.musicPlayer.showQueueList(context.getGuild(), false); diff --git a/src/main/java/handiebot/command/types/ReactionHandler.java b/src/main/java/handiebot/command/types/ReactionHandler.java new file mode 100644 index 0000000..808b556 --- /dev/null +++ b/src/main/java/handiebot/command/types/ReactionHandler.java @@ -0,0 +1,19 @@ +package handiebot.command.types; + +import sx.blah.discord.handle.impl.events.guild.channel.message.reaction.ReactionEvent; + +/** + * @author Andrew Lalis + * Class which handles user reactions to songs and performs necessary actions. + */ +public class ReactionHandler { + + /** + * Processes a reaction. + * @param event The reaction event to process. + */ + public static void handleReaction(ReactionEvent event){ + + } + +} diff --git a/src/main/java/handiebot/lavaplayer/MusicPlayer.java b/src/main/java/handiebot/lavaplayer/MusicPlayer.java index d944c39..12e488b 100644 --- a/src/main/java/handiebot/lavaplayer/MusicPlayer.java +++ b/src/main/java/handiebot/lavaplayer/MusicPlayer.java @@ -5,6 +5,7 @@ import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; import handiebot.HandieBot; import handiebot.command.CommandHandler; +import handiebot.lavaplayer.playlist.Playlist; import handiebot.lavaplayer.playlist.UnloadedTrack; import handiebot.utils.DisappearingMessage; import handiebot.utils.Pastebin; @@ -204,8 +205,10 @@ public class MusicPlayer { TimeUnit.MILLISECONDS.toSeconds(timeUntilPlay) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeUntilPlay)) )); } - IMessage message = getChatChannel(guild).sendMessage(sb.toString()); - DisappearingMessage.deleteMessageAfter(3000, message); + if (sb.length() > 0) { + IMessage message = getChatChannel(guild).sendMessage(sb.toString()); + DisappearingMessage.deleteMessageAfter(3000, message); + } } } @@ -245,6 +248,22 @@ public class MusicPlayer { log.log(BotLog.TYPE.MUSIC, guild, "Stopped playing music."); } + /** + * Returns a playlist of all songs either in the queue or being played now. + * @param guild The guild to get songs from. + * @return A list of songs in the form of a playlist. + */ + public Playlist getAllSongsInQueue(IGuild guild){ + GuildMusicManager musicManager = getMusicManager(guild); + Playlist p = new Playlist("Active Queue"); + p.copy(musicManager.scheduler.getActivePlaylist()); + UnloadedTrack track = musicManager.scheduler.getPlayingTrack(); + if (track != null){ + p.addTrack(track); + } + return p; + } + /** * Performs the same functions as stop, but with every guild. */ diff --git a/src/main/java/handiebot/lavaplayer/TrackScheduler.java b/src/main/java/handiebot/lavaplayer/TrackScheduler.java index edf3b9c..525699b 100644 --- a/src/main/java/handiebot/lavaplayer/TrackScheduler.java +++ b/src/main/java/handiebot/lavaplayer/TrackScheduler.java @@ -113,6 +113,18 @@ public class TrackScheduler extends AudioEventAdapter { return t; } + /** + * Returns the currently playing track, in unloaded form. + * @return The currently playing track, or null. + */ + public UnloadedTrack getPlayingTrack(){ + AudioTrack track = this.player.getPlayingTrack(); + if (track == null){ + return null; + } + return new UnloadedTrack(track); + } + /** * Returns a list of tracks in the queue. * @return A list of tracks in the queue. @@ -171,9 +183,9 @@ public class TrackScheduler extends AudioEventAdapter { log.log(BotLog.TYPE.MUSIC, this.guild, "Started audio track: "+track.getInfo().title); List channels = this.guild.getChannelsByName(MusicPlayer.CHANNEL_NAME.toLowerCase()); if (channels.size() > 0){ - IMessage message = channels.get(0).sendMessage("Now playing: **"+track.getInfo().title+"**\n"+track.getInfo().uri); + IMessage message = channels.get(0).sendMessage("Now playing: **"+track.getInfo().title+"** "+new UnloadedTrack(track).getFormattedDuration()+"\n"+track.getInfo().uri); RequestBuffer.request(() -> {message.addReaction(":thumbsup:");}).get(); - RequestBuffer.request(() -> {message.addReaction(":thumbsdown:");}); + RequestBuffer.request(() -> {message.addReaction(":thumbsdown:");}).get(); } } diff --git a/src/main/java/handiebot/lavaplayer/playlist/Playlist.java b/src/main/java/handiebot/lavaplayer/playlist/Playlist.java index 442e37a..4ad89fe 100644 --- a/src/main/java/handiebot/lavaplayer/playlist/Playlist.java +++ b/src/main/java/handiebot/lavaplayer/playlist/Playlist.java @@ -40,6 +40,10 @@ public class Playlist { return this.name; } + public void setName(String name){ + this.name = name; + } + public int getTrackCount(){ return this.tracks.size(); }