diff --git a/src/main/java/com/jagrosh/jmusicbot/commands/music/PlayCmd.java b/src/main/java/com/jagrosh/jmusicbot/commands/music/PlayCmd.java index 4ba556a82..d6e33724a 100644 --- a/src/main/java/com/jagrosh/jmusicbot/commands/music/PlayCmd.java +++ b/src/main/java/com/jagrosh/jmusicbot/commands/music/PlayCmd.java @@ -36,6 +36,9 @@ import com.jagrosh.jmusicbot.utils.FormatUtil; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -61,7 +64,7 @@ public PlayCmd(Bot bot) super(bot); this.loadingEmoji = bot.getConfig().getLoading(); this.name = "play"; - this.arguments = ""; + this.arguments = " [?shuffle]"; this.help = "plays the provided song"; this.aliases = bot.getConfig().getAliases(this.name); this.beListening = true; @@ -72,7 +75,10 @@ public PlayCmd(Bot bot) @Override public void doCommand(CommandEvent event) { - if(event.getArgs().isEmpty() && event.getMessage().getAttachments().isEmpty()) + String argsIn = event.getArgs(); + boolean shuffle = argsIn.endsWith(" ?shuffle"); + if(shuffle) argsIn = argsIn.replace(" ?shuffle",""); + if(argsIn.isEmpty() && event.getMessage().getAttachments().isEmpty()) { AudioHandler handler = (AudioHandler)event.getGuild().getAudioManager().getSendingHandler(); if(handler.getPlayer().getPlayingTrack()!=null && handler.getPlayer().isPaused()) @@ -91,13 +97,16 @@ public void doCommand(CommandEvent event) builder.append("\n`").append(event.getClient().getPrefix()).append(name).append(" ` - plays the provided song, playlist, or stream"); for(Command cmd: children) builder.append("\n`").append(event.getClient().getPrefix()).append(name).append(" ").append(cmd.getName()).append(" ").append(cmd.getArguments()).append("` - ").append(cmd.getHelp()); + builder.append("\n`").append("Tip: Append ` ?shuffle` to the command to shuffle playlists before loading"); event.reply(builder.toString()); return; } - String args = event.getArgs().startsWith("<") && event.getArgs().endsWith(">") - ? event.getArgs().substring(1,event.getArgs().length()-1) - : event.getArgs().isEmpty() ? event.getMessage().getAttachments().get(0).getUrl() : event.getArgs(); - event.reply(loadingEmoji+" Loading... `["+args+"]`", m -> bot.getPlayerManager().loadItemOrdered(event.getGuild(), args, new ResultHandler(m,event,false))); + + String args = argsIn.startsWith("<") && argsIn.endsWith(">") + ? argsIn.substring(1, argsIn.length()-1) + : argsIn.isEmpty() ? event.getMessage().getAttachments().get(0).getUrl() : argsIn; + + event.reply(loadingEmoji+" Loading... `["+args+"]`", m -> bot.getPlayerManager().loadItemOrdered(event.getGuild(), args, new ResultHandler(m,event,false, shuffle))); } private class ResultHandler implements AudioLoadResultHandler @@ -105,12 +114,14 @@ private class ResultHandler implements AudioLoadResultHandler private final Message m; private final CommandEvent event; private final boolean ytsearch; - - private ResultHandler(Message m, CommandEvent event, boolean ytsearch) + private final boolean shuffle; + + private ResultHandler(Message m, CommandEvent event, boolean ytsearch, boolean shuffle) { this.m = m; this.event = event; this.ytsearch = ytsearch; + this.shuffle = shuffle; } private static final Pattern YOUTUBE_REGEX = Pattern.compile("^((?:https?:)?\\/\\/)?((?:www|m)\\.)?((?:youtube(?:-nocookie)?\\.com|youtu.be))(\\/(?:[\\w\\-]+\\?v=|embed\\/|live\\/|v\\/)?)([\\w\\-]+)(\\S+)?$"); @@ -168,7 +179,9 @@ private int loadPlaylist(AudioPlaylist playlist, AudioTrack exclude) int[] count = {0}; final Settings settings = event.getClient().getSettingsFor(event.getGuild()); - playlist.getTracks().stream().forEach((track) -> { + final List tracks = playlist.getTracks(); + if(shuffle) Collections.shuffle(tracks); + tracks.stream().forEach((track) -> { if(!bot.getConfig().isTooLong(track) && !track.equals(exclude)) { AudioHandler handler = (AudioHandler)event.getGuild().getAudioManager().getSendingHandler(); @@ -238,7 +251,7 @@ public void noMatches() if(ytsearch) m.editMessage(FormatUtil.filter(event.getClient().getWarning()+" No results found for `"+event.getArgs()+"`.")).queue(); else - bot.getPlayerManager().loadItemOrdered(event.getGuild(), "ytsearch:"+event.getArgs(), new ResultHandler(m,event,true)); + bot.getPlayerManager().loadItemOrdered(event.getGuild(), "ytsearch:"+event.getArgs(), new ResultHandler(m,event,true, shuffle)); } @Override