Version 1: Basic functionality #1
|
@ -1,24 +1,16 @@
|
|||
package handiebot;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import handiebot.command.CommandHandler;
|
||||
import handiebot.lavaplayer.GuildMusicManager;
|
||||
import handiebot.lavaplayer.MusicPlayer;
|
||||
import sx.blah.discord.api.ClientBuilder;
|
||||
import sx.blah.discord.api.IDiscordClient;
|
||||
import sx.blah.discord.api.events.EventSubscriber;
|
||||
import sx.blah.discord.handle.audio.IAudioManager;
|
||||
import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent;
|
||||
import sx.blah.discord.handle.obj.IChannel;
|
||||
import sx.blah.discord.handle.obj.IGuild;
|
||||
import sx.blah.discord.handle.obj.IVoiceChannel;
|
||||
import sx.blah.discord.util.DiscordException;
|
||||
import sx.blah.discord.util.MissingPermissionsException;
|
||||
import sx.blah.discord.util.RateLimitException;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
@ -45,6 +37,7 @@ public class HandieBot {
|
|||
|
||||
private final AudioPlayerManager playerManager;
|
||||
private final Map<Long, GuildMusicManager> musicManagers;
|
||||
private MusicPlayer musicPlayer;
|
||||
|
||||
private HandieBot() {
|
||||
this.musicManagers = new HashMap<>();
|
||||
|
@ -53,20 +46,11 @@ public class HandieBot {
|
|||
AudioSourceManagers.registerLocalSource(playerManager);
|
||||
|
||||
this.commandHandler = new CommandHandler(this);
|
||||
this.musicPlayer = new MusicPlayer();
|
||||
}
|
||||
|
||||
private synchronized GuildMusicManager getGuildAudioPlayer(IGuild guild) {
|
||||
long guildId = Long.parseLong(guild.getID());
|
||||
GuildMusicManager musicManager = musicManagers.get(guildId);
|
||||
|
||||
if (musicManager == null) {
|
||||
musicManager = new GuildMusicManager(playerManager);
|
||||
musicManagers.put(guildId, musicManager);
|
||||
}
|
||||
|
||||
guild.getAudioManager().setAudioProvider(musicManager.getAudioProvider());
|
||||
|
||||
return musicManager;
|
||||
public MusicPlayer getMusicPlayer(){
|
||||
return this.musicPlayer;
|
||||
}
|
||||
|
||||
@EventSubscriber
|
||||
|
@ -74,76 +58,5 @@ public class HandieBot {
|
|||
this.commandHandler.handleCommand(event);
|
||||
}
|
||||
|
||||
public void loadAndPlay(final IChannel channel, final String trackUrl) {
|
||||
GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild());
|
||||
|
||||
playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() {
|
||||
@Override
|
||||
public void trackLoaded(AudioTrack track) {
|
||||
sendMessageToChannel(channel, "Adding to queue " + track.getInfo().title);
|
||||
|
||||
play(channel.getGuild(), musicManager, track);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playlistLoaded(AudioPlaylist playlist) {
|
||||
AudioTrack firstTrack = playlist.getSelectedTrack();
|
||||
|
||||
if (firstTrack == null) {
|
||||
firstTrack = playlist.getTracks().get(0);
|
||||
}
|
||||
|
||||
sendMessageToChannel(channel, "Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")");
|
||||
|
||||
play(channel.getGuild(), musicManager, firstTrack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void noMatches() {
|
||||
sendMessageToChannel(channel, "Nothing found by " + trackUrl);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFailed(FriendlyException exception) {
|
||||
sendMessageToChannel(channel, "Could not play: " + exception.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void play(IGuild guild, GuildMusicManager musicManager, AudioTrack track) {
|
||||
connectToFirstVoiceChannel(guild.getAudioManager());
|
||||
|
||||
musicManager.scheduler.queue(track);
|
||||
}
|
||||
|
||||
public void skipTrack(IChannel channel) {
|
||||
GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild());
|
||||
musicManager.scheduler.nextTrack();
|
||||
|
||||
sendMessageToChannel(channel, "Skipped to next track.");
|
||||
}
|
||||
|
||||
private void sendMessageToChannel(IChannel channel, String message) {
|
||||
try {
|
||||
channel.sendMessage(message);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void connectToFirstVoiceChannel(IAudioManager audioManager) {
|
||||
for (IVoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) {
|
||||
if (voiceChannel.isConnected()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (IVoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) {
|
||||
try {
|
||||
voiceChannel.join();
|
||||
} catch (MissingPermissionsException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,9 +35,13 @@ public class CommandHandler {
|
|||
String[] args = extractArgs(message);
|
||||
if (guild != null && command != null){
|
||||
if (command.equals("play") && args.length == 1){
|
||||
this.bot.loadAndPlay(channel, args[0]);
|
||||
this.bot.getMusicPlayer().loadToQueue(guild, args[0]);
|
||||
} else if (command.equals("skip") && args.length == 0){
|
||||
this.bot.getMusicPlayer().skipTrack(guild);
|
||||
} else if (command.equals("help")){
|
||||
this.sendHelpInfo(user);
|
||||
} else if (command.equals("playnow") && args.length == 1){
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,145 @@
|
|||
package handiebot.lavaplayer;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import sx.blah.discord.handle.obj.IChannel;
|
||||
import sx.blah.discord.handle.obj.IGuild;
|
||||
import sx.blah.discord.handle.obj.IVoiceChannel;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Andrew Lalis
|
||||
* This class is a container for all the music related functions, and contains methods for easy playback and queue
|
||||
* management.
|
||||
*/
|
||||
public class MusicPlayer {
|
||||
|
||||
private static String CHANNEL_NAME = "music";
|
||||
|
||||
private final AudioPlayerManager playerManager;
|
||||
private final Map<Long, GuildMusicManager> musicManagers;
|
||||
|
||||
public MusicPlayer(){
|
||||
this.musicManagers = new HashMap<>();
|
||||
this.playerManager = new DefaultAudioPlayerManager();
|
||||
AudioSourceManagers.registerLocalSource(playerManager);
|
||||
AudioSourceManagers.registerRemoteSources(playerManager);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a URL to the queue, or outputs an error message if it fails.
|
||||
* @param guild The guild to load the URL to.
|
||||
* @param trackURL A string representing a youtube/soundcloud URL.
|
||||
*/
|
||||
public void loadToQueue(IGuild guild, String trackURL){
|
||||
GuildMusicManager musicManager = this.getGuildMusicManager(guild);
|
||||
this.playerManager.loadItemOrdered(musicManager, trackURL, new AudioLoadResultHandler() {
|
||||
@Override
|
||||
public void trackLoaded(AudioTrack audioTrack) {
|
||||
addToQueue(guild, musicManager, audioTrack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playlistLoaded(AudioPlaylist audioPlaylist) {
|
||||
if (audioPlaylist.getTracks().size() > 0){
|
||||
AudioTrack firstTrack = audioPlaylist.getSelectedTrack();
|
||||
if (firstTrack == null){
|
||||
firstTrack = audioPlaylist.getTracks().get(0);
|
||||
}
|
||||
addToQueue(guild, musicManager,firstTrack);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void noMatches() {
|
||||
getMessageChannel(guild).sendMessage("Unable to find a result for: "+trackURL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFailed(FriendlyException e) {
|
||||
getMessageChannel(guild).sendMessage("Unable to load. "+e.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a track to the queue and sends a message to the appropriate channel notifying users.
|
||||
* @param guild The guild to queue the track in.
|
||||
* @param musicManager The music manager to use.
|
||||
* @param track The track to queue.
|
||||
*/
|
||||
public void addToQueue(IGuild guild, GuildMusicManager musicManager, AudioTrack track){
|
||||
IVoiceChannel voiceChannel = this.connectToMusicChannel(guild);
|
||||
if (voiceChannel != null){
|
||||
musicManager.scheduler.queue(track);
|
||||
IChannel channel = this.getMessageChannel(guild);
|
||||
channel.sendMessage("Added ["+track.getInfo().title+"] to the queue.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Skips the current track.
|
||||
* @param guild The guild to perform the skip on.
|
||||
*/
|
||||
public void skipTrack(IGuild guild){
|
||||
this.getGuildMusicManager(guild).scheduler.nextTrack();
|
||||
this.getMessageChannel(guild).sendMessage("Skipping the current track.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a music manager for a specific guild.
|
||||
* @param guild The guild to get a manager for.
|
||||
* @return A Music Manager for the guild.
|
||||
*/
|
||||
private synchronized GuildMusicManager getGuildMusicManager(IGuild guild){
|
||||
long guildId = Long.parseLong(guild.getStringID());
|
||||
GuildMusicManager musicManager = this.musicManagers.get(guildId);
|
||||
if (musicManager == null){
|
||||
musicManager = new GuildMusicManager(this.playerManager);
|
||||
musicManagers.put(guildId, musicManager);
|
||||
}
|
||||
guild.getAudioManager().setAudioProvider(musicManager.getAudioProvider());
|
||||
return musicManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches for and attempts to connect to a channel called 'music'.
|
||||
* @param guild the guild to get voice channels from.
|
||||
* @return The voice channel the bot is now connected to.
|
||||
*/
|
||||
private IVoiceChannel connectToMusicChannel(IGuild guild){
|
||||
for (IVoiceChannel voiceChannel : guild.getVoiceChannelsByName(CHANNEL_NAME)){
|
||||
if (!voiceChannel.isConnected()) {
|
||||
voiceChannel.join();
|
||||
return voiceChannel;
|
||||
}
|
||||
}
|
||||
IVoiceChannel voiceChannel = guild.createVoiceChannel(CHANNEL_NAME);
|
||||
voiceChannel.join();
|
||||
return voiceChannel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a 'music' message channel where the bot can post info on playing songs, user requests,
|
||||
* etc.
|
||||
* @param guild The guild to get channels from.
|
||||
* @return The channel with that name.
|
||||
*/
|
||||
private IChannel getMessageChannel(IGuild guild){
|
||||
List<IChannel> channels = guild.getChannelsByName(CHANNEL_NAME);
|
||||
if (channels.size() == 1){
|
||||
return channels.get(0);
|
||||
}
|
||||
return guild.createChannel(CHANNEL_NAME);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue