Added repeat and queue listing, still lots of work that needs to be done.
This commit is contained in:
parent
c2e443410f
commit
cda6199fc7
|
@ -14,7 +14,7 @@ import java.awt.*;
|
||||||
*/
|
*/
|
||||||
public class CommandHandler {
|
public class CommandHandler {
|
||||||
|
|
||||||
private static String PREFIX = "!";
|
public static String PREFIX = "!";
|
||||||
|
|
||||||
private final HandieBot bot;
|
private final HandieBot bot;
|
||||||
|
|
||||||
|
@ -40,8 +40,10 @@ public class CommandHandler {
|
||||||
this.bot.getMusicPlayer().skipTrack(guild);
|
this.bot.getMusicPlayer().skipTrack(guild);
|
||||||
} else if (command.equals("help")){
|
} else if (command.equals("help")){
|
||||||
this.sendHelpInfo(user);
|
this.sendHelpInfo(user);
|
||||||
} else if (command.equals("playnow") && args.length == 1){
|
} else if (command.equals("queue") && args.length == 0){
|
||||||
|
this.bot.getMusicPlayer().showQueueList(guild);
|
||||||
|
} else if (command.equals("repeat")){
|
||||||
|
this.bot.getMusicPlayer().toggleRepeat(guild);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,11 @@ import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
|
||||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||||
|
import handiebot.command.CommandHandler;
|
||||||
import sx.blah.discord.handle.obj.IChannel;
|
import sx.blah.discord.handle.obj.IChannel;
|
||||||
import sx.blah.discord.handle.obj.IGuild;
|
import sx.blah.discord.handle.obj.IGuild;
|
||||||
import sx.blah.discord.handle.obj.IVoiceChannel;
|
import sx.blah.discord.handle.obj.IVoiceChannel;
|
||||||
|
import sx.blah.discord.util.EmbedBuilder;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -34,6 +36,49 @@ public class MusicPlayer {
|
||||||
AudioSourceManagers.registerRemoteSources(playerManager);
|
AudioSourceManagers.registerRemoteSources(playerManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggles the playlist's repeating.
|
||||||
|
* @param guild The guild to perform the action on.
|
||||||
|
*/
|
||||||
|
public void toggleRepeat(IGuild guild){
|
||||||
|
GuildMusicManager musicManager = this.getGuildMusicManager(guild);
|
||||||
|
musicManager.scheduler.setRepeat(!musicManager.scheduler.isRepeating());
|
||||||
|
this.getMessageChannel(guild).sendMessage("**Repeat** is now *"+(musicManager.scheduler.isRepeating() ? "On" : "Off")+"*.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a formatted message to the guild about the first few items in a queue.
|
||||||
|
* @param guild The guild to show the queue for.
|
||||||
|
*/
|
||||||
|
public void showQueueList(IGuild guild){
|
||||||
|
GuildMusicManager musicManager = this.getGuildMusicManager(guild);
|
||||||
|
List<AudioTrack> tracks = musicManager.scheduler.queueList();
|
||||||
|
if (tracks.size() == 0) {
|
||||||
|
this.getMessageChannel(guild).sendMessage("The queue is empty. Use **"+ CommandHandler.PREFIX+"play** *URL* to add songs.");
|
||||||
|
} else {
|
||||||
|
EmbedBuilder builder = new EmbedBuilder();
|
||||||
|
builder.withColor(255, 0, 0);
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < (tracks.size() <= 10 ? tracks.size() : 10); i++) {
|
||||||
|
sb.append(i+1);
|
||||||
|
sb.append(". ");
|
||||||
|
sb.append('[');
|
||||||
|
sb.append(tracks.get(i).getInfo().title);
|
||||||
|
sb.append("](");
|
||||||
|
sb.append(tracks.get(i).getInfo().uri);
|
||||||
|
sb.append(") [");
|
||||||
|
int seconds = (int) (tracks.get(i).getInfo().length/1000);
|
||||||
|
int minutes = seconds / 60;
|
||||||
|
sb.append(minutes);
|
||||||
|
sb.append(":");
|
||||||
|
sb.append(seconds % 60);
|
||||||
|
sb.append("]\n");
|
||||||
|
}
|
||||||
|
builder.appendField("Showing " + (tracks.size() <= 10 ? tracks.size() : "the first 10") + " tracks.", sb.toString(), false);
|
||||||
|
this.getMessageChannel(guild).sendMessage(builder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads a URL to the queue, or outputs an error message if it fails.
|
* Loads a URL to the queue, or outputs an error message if it fails.
|
||||||
* @param guild The guild to load the URL to.
|
* @param guild The guild to load the URL to.
|
||||||
|
@ -81,7 +126,7 @@ public class MusicPlayer {
|
||||||
if (voiceChannel != null){
|
if (voiceChannel != null){
|
||||||
musicManager.scheduler.queue(track);
|
musicManager.scheduler.queue(track);
|
||||||
IChannel channel = this.getMessageChannel(guild);
|
IChannel channel = this.getMessageChannel(guild);
|
||||||
channel.sendMessage("Added ["+track.getInfo().title+"] to the queue.");
|
channel.sendMessage("Added **"+track.getInfo().title+"** to the queue.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -117,11 +162,11 @@ public class MusicPlayer {
|
||||||
* @return The voice channel the bot is now connected to.
|
* @return The voice channel the bot is now connected to.
|
||||||
*/
|
*/
|
||||||
private IVoiceChannel connectToMusicChannel(IGuild guild){
|
private IVoiceChannel connectToMusicChannel(IGuild guild){
|
||||||
for (IVoiceChannel voiceChannel : guild.getVoiceChannelsByName(CHANNEL_NAME)){
|
List<IVoiceChannel> voiceChannels = guild.getVoiceChannelsByName(CHANNEL_NAME);
|
||||||
if (!voiceChannel.isConnected()) {
|
if (voiceChannels.size() == 1){
|
||||||
voiceChannel.join();
|
if (!voiceChannels.get(0).isConnected())
|
||||||
return voiceChannel;
|
voiceChannels.get(0).join();
|
||||||
}
|
return voiceChannels.get(0);
|
||||||
}
|
}
|
||||||
IVoiceChannel voiceChannel = guild.createVoiceChannel(CHANNEL_NAME);
|
IVoiceChannel voiceChannel = guild.createVoiceChannel(CHANNEL_NAME);
|
||||||
voiceChannel.join();
|
voiceChannel.join();
|
||||||
|
|
|
@ -6,6 +6,8 @@ import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.BlockingQueue;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
|
@ -16,6 +18,8 @@ public class TrackScheduler extends AudioEventAdapter {
|
||||||
|
|
||||||
private final AudioPlayer player;
|
private final AudioPlayer player;
|
||||||
private final BlockingQueue<AudioTrack> queue;
|
private final BlockingQueue<AudioTrack> queue;
|
||||||
|
private boolean repeat = false;
|
||||||
|
private AudioTrack currentTrack = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new track scheduler with the given player.
|
* Constructs a new track scheduler with the given player.
|
||||||
|
@ -26,6 +30,22 @@ public class TrackScheduler extends AudioEventAdapter {
|
||||||
this.queue = new LinkedBlockingQueue<>();
|
this.queue = new LinkedBlockingQueue<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether or not songs get placed back into the queue once they're played.
|
||||||
|
* @param value True if the playlist should repeat.
|
||||||
|
*/
|
||||||
|
public void setRepeat(boolean value){
|
||||||
|
this.repeat = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether or not repeating is enabled.
|
||||||
|
* @return True if repeating, false otherwise.
|
||||||
|
*/
|
||||||
|
public boolean isRepeating(){
|
||||||
|
return this.repeat;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the next track to the queue or play right away if nothing is in the queue.
|
* Add the next track to the queue or play right away if nothing is in the queue.
|
||||||
* @param track The track to play or add to the queue.
|
* @param track The track to play or add to the queue.
|
||||||
|
@ -41,7 +61,12 @@ public class TrackScheduler extends AudioEventAdapter {
|
||||||
* Starts the next track, stopping the current one if it's playing.
|
* Starts the next track, stopping the current one if it's playing.
|
||||||
*/
|
*/
|
||||||
public void nextTrack(){
|
public void nextTrack(){
|
||||||
player.startTrack(queue.poll(), false);
|
AudioTrack track = queue.poll();
|
||||||
|
player.startTrack(track, false);
|
||||||
|
this.currentTrack = track;
|
||||||
|
if (this.repeat){
|
||||||
|
this.queue.add(track);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -49,10 +74,19 @@ public class TrackScheduler extends AudioEventAdapter {
|
||||||
if (endReason.mayStartNext){
|
if (endReason.mayStartNext){
|
||||||
nextTrack();
|
nextTrack();
|
||||||
} else {
|
} else {
|
||||||
|
this.currentTrack = null;
|
||||||
System.out.println(endReason.toString());
|
System.out.println(endReason.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of tracks in the queue.
|
||||||
|
* @return A list of tracks in the queue.
|
||||||
|
*/
|
||||||
|
public List<AudioTrack> queueList(){
|
||||||
|
return new ArrayList<>(this.queue);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception){
|
public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception){
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
|
|
Loading…
Reference in New Issue