massive organization overhaul

dependency updates
config overhaul
This commit is contained in:
John Grosh
2018-11-21 05:31:03 -05:00
parent a7a4b55011
commit aaec886b81
56 changed files with 2528 additions and 2133 deletions

View File

@@ -15,6 +15,8 @@
*/
package com.jagrosh.jmusicbot.audio;
import com.jagrosh.jmusicbot.JMusicBot;
import com.jagrosh.jmusicbot.playlist.PlaylistLoader.Playlist;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
@@ -24,51 +26,53 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import com.jagrosh.jmusicbot.Bot;
import com.jagrosh.jmusicbot.playlist.Playlist;
import com.jagrosh.jmusicbot.queue.FairQueue;
import com.jagrosh.jmusicbot.settings.Settings;
import com.jagrosh.jmusicbot.utils.FormatUtil;
import static com.jagrosh.jmusicbot.utils.FormatUtil.formatTime;
import static com.jagrosh.jmusicbot.utils.FormatUtil.volumeIcon;
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import net.dv8tion.jda.core.EmbedBuilder;
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.MessageBuilder;
import net.dv8tion.jda.core.audio.AudioSendHandler;
import net.dv8tion.jda.core.entities.Game;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.User;
/**
*
* @author John Grosh <john.a.grosh@gmail.com>
*/
public class AudioHandler extends AudioEventAdapter implements AudioSendHandler {
public class AudioHandler extends AudioEventAdapter implements AudioSendHandler
{
private final FairQueue<QueuedTrack> queue = new FairQueue<>();
private final List<AudioTrack> defaultQueue = new LinkedList<>();
private final Set<String> votes = new HashSet<>();
private final PlayerManager manager;
private final AudioPlayer audioPlayer;
private final long guildId;
private final FairQueue<QueuedTrack> queue;
private final Set<String> votes;
private final List<AudioTrack> defaultQueue;
private final Bot bot;
private AudioFrame lastFrame;
private long requester;
public static boolean STAY_IN_CHANNEL;
public static boolean SONG_IN_STATUS;
public static long MAX_SECONDS = -1;
public static boolean USE_NP_REFRESH;
public AudioHandler(AudioPlayer audioPlayer, Guild guild, Bot bot) {
this.audioPlayer = audioPlayer;
this.guildId = guild.getIdLong();
this.bot = bot;
queue = new FairQueue<>();
votes = new HashSet<>();
defaultQueue = new LinkedList<>();
protected AudioHandler(PlayerManager manager, Guild guild, AudioPlayer player)
{
this.manager = manager;
this.audioPlayer = player;
this.guildId = guild.getIdLong();
}
public int addTrack(AudioTrack track, User user)
public int addTrack(QueuedTrack qtrack)
{
if(audioPlayer.getPlayingTrack()==null)
{
requester = user.getIdLong();
audioPlayer.playTrack(track);
audioPlayer.playTrack(qtrack.getTrack());
return -1;
}
else
return queue.add(new QueuedTrack(track, user.getIdLong()));
return queue.add(qtrack);
}
public FairQueue<QueuedTrack> getQueue()
@@ -84,9 +88,9 @@ public class AudioHandler extends AudioEventAdapter implements AudioSendHandler
//current = null;
}
public boolean isMusicPlaying()
public boolean isMusicPlaying(JDA jda)
{
return bot.getJDA().getGuildById(guildId).getSelfMember().getVoiceState().inVoiceChannel() && audioPlayer.getPlayingTrack()!=null;
return guild(jda).getSelfMember().getVoiceState().inVoiceChannel() && audioPlayer.getPlayingTrack()!=null;
}
public Set<String> getVotes()
@@ -101,7 +105,9 @@ public class AudioHandler extends AudioEventAdapter implements AudioSendHandler
public long getRequester()
{
return requester;
if(audioPlayer.getPlayingTrack()==null)
return 0;
return audioPlayer.getPlayingTrack().getUserData(Long.class);
}
public boolean playFromDefault()
@@ -111,83 +117,170 @@ public class AudioHandler extends AudioEventAdapter implements AudioSendHandler
audioPlayer.playTrack(defaultQueue.remove(0));
return true;
}
Guild guild = bot.getJDA().getGuildById(guildId);
if(bot.getSettings(guild)==null || bot.getSettings(guild).getDefaultPlaylist()==null)
Settings settings = manager.getBot().getSettingsManager().getSettings(guildId);
if(settings==null || settings.getDefaultPlaylist()==null)
return false;
Playlist pl = Playlist.loadPlaylist(bot.getSettings(guild).getDefaultPlaylist());
Playlist pl = manager.getBot().getPlaylistLoader().getPlaylist(settings.getDefaultPlaylist());
if(pl==null || pl.getItems().isEmpty())
return false;
pl.loadTracks(bot.getAudioManager(), (at) -> {
pl.loadTracks(manager, (at) ->
{
if(audioPlayer.getPlayingTrack()==null)
audioPlayer.playTrack(at);
else
defaultQueue.add(at);
}, () -> {
if(pl.getTracks().isEmpty() && !STAY_IN_CHANNEL)
guild.getAudioManager().closeAudioConnection();
}, () ->
{
if(pl.getTracks().isEmpty() && !manager.getBot().getConfig().getStay())
manager.getBot().closeAudioConnection(guildId);
});
return true;
}
// Audio Events
@Override
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
if(endReason==AudioTrackEndReason.FINISHED && bot.getSettings(bot.getJDA().getGuildById(guildId)).getRepeatMode())
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason)
{
// if the track ended normally, and we're in repeat mode, re-add it to the queue
if(endReason==AudioTrackEndReason.FINISHED && manager.getBot().getSettingsManager().getSettings(guildId).getRepeatMode())
{
queue.add(new QueuedTrack(track.makeClone(), requester));
queue.add(new QueuedTrack(track.makeClone(), track.getUserData(Long.class)));
}
requester = 0;
if(queue.isEmpty())
{
if(!playFromDefault())
{
if(SONG_IN_STATUS)
bot.resetGame();
if(!STAY_IN_CHANNEL)
bot.getThreadpool().submit(() -> bot.getJDA().getGuildById(guildId).getAudioManager().closeAudioConnection());
bot.updateTopic(guildId, this);
manager.getBot().getNowplayingHandler().onTrackUpdate(guildId, null, this);
if(!manager.getBot().getConfig().getStay())
manager.getBot().closeAudioConnection(guildId);
}
}
else
{
QueuedTrack qt = queue.pull();
requester = qt.getIdentifier();
player.playTrack(qt.getTrack());
}
}
@Override
public void onTrackStart(AudioPlayer player, AudioTrack track) {
votes.clear();
if(SONG_IN_STATUS)
{
if(bot.getJDA().getGuilds().stream().filter(g -> g.getSelfMember().getVoiceState().inVoiceChannel()).count()<=1)
bot.getJDA().getPresence().setGame(Game.listening(track.getInfo().title));
else
bot.resetGame();
}
bot.updateTopic(guildId, this);
}
@Override
public boolean canProvide() {
lastFrame = audioPlayer.provide();
return lastFrame != null;
}
@Override
public byte[] provide20MsAudio() {
return lastFrame.data;
}
@Override
public boolean isOpus() {
return true;
}
public static boolean isTooLong(AudioTrack track)
public void onTrackStart(AudioPlayer player, AudioTrack track)
{
if(MAX_SECONDS<=0)
return false;
return Math.round(track.getDuration()/1000.0) > MAX_SECONDS;
votes.clear();
manager.getBot().getNowplayingHandler().onTrackUpdate(guildId, track, this);
}
// Formatting
public Message getNowPlaying(JDA jda)
{
if(isMusicPlaying(jda))
{
Guild guild = guild(jda);
AudioTrack track = audioPlayer.getPlayingTrack();
MessageBuilder mb = new MessageBuilder();
mb.append(FormatUtil.filter(manager.getBot().getConfig().getSuccess()+" **Now Playing in "+guild.getSelfMember().getVoiceState().getChannel().getName()+"...**"));
EmbedBuilder eb = new EmbedBuilder();
eb.setColor(guild.getSelfMember().getColor());
if(getRequester() != 0)
{
User u = guild.getJDA().getUserById(getRequester());
if(u==null)
eb.setAuthor("Unknown (ID:"+getRequester()+")", null, null);
else
eb.setAuthor(u.getName()+"#"+u.getDiscriminator(), null, u.getEffectiveAvatarUrl());
}
try
{
eb.setTitle(track.getInfo().title, track.getInfo().uri);
}
catch(Exception e)
{
eb.setTitle(track.getInfo().title);
}
if(track instanceof YoutubeAudioTrack && manager.getBot().getConfig().useNPImages())
{
eb.setThumbnail("https://img.youtube.com/vi/"+track.getIdentifier()+"/mqdefault.jpg");
}
if(track.getInfo().author != null && !track.getInfo().author.isEmpty())
eb.setFooter("Source: " + track.getInfo().author, null);
double progress = (double)audioPlayer.getPlayingTrack().getPosition()/track.getDuration();
eb.setDescription((audioPlayer.isPaused() ? JMusicBot.PAUSE_EMOJI : JMusicBot.PLAY_EMOJI)
+ " "+FormatUtil.progressBar(progress)
+ " `[" + FormatUtil.formatTime(track.getPosition()) + "/" + FormatUtil.formatTime(track.getDuration()) + "]` "
+ FormatUtil.volumeIcon(audioPlayer.getVolume()));
return mb.setEmbed(eb.build()).build();
}
else return null;
}
public Message getNoMusicPlaying(JDA jda)
{
Guild guild = guild(jda);
return new MessageBuilder()
.setContent(FormatUtil.filter(manager.getBot().getConfig().getSuccess()+" **Now Playing...**"))
.setEmbed(new EmbedBuilder()
.setTitle("No music playing")
.setDescription(JMusicBot.STOP_EMOJI+" "+FormatUtil.progressBar(-1)+" "+FormatUtil.volumeIcon(audioPlayer.getVolume()))
.setColor(guild.getSelfMember().getColor())
.build()).build();
}
public String getTopicFormat(JDA jda)
{
if(isMusicPlaying(jda))
{
long userid = getRequester();
AudioTrack track = audioPlayer.getPlayingTrack();
String title = track.getInfo().title;
if(title==null || title.equals("Unknown Title"))
title = track.getInfo().uri;
return "**"+title+"** ["+(userid==0 ? "autoplay" : "<@"+userid+">")+"]"
+ "\n"+(audioPlayer.isPaused()?"\u23F8":"\u25B6")+" "
+"["+formatTime(track.getDuration())+"] "
+volumeIcon(audioPlayer.getVolume());
}
else return "No music playing \u23F9 " + volumeIcon(audioPlayer.getVolume());
}
// Audio Send Handler methods
@Override
public boolean canProvide()
{
if (lastFrame == null)
lastFrame = audioPlayer.provide();
return lastFrame != null;
}
@Override
public byte[] provide20MsAudio()
{
if (lastFrame == null)
lastFrame = audioPlayer.provide();
byte[] data = lastFrame != null ? lastFrame.getData() : null;
lastFrame = null;
return data;
}
@Override
public boolean isOpus()
{
return true;
}
// Private methods
private Guild guild(JDA jda)
{
return jda.getGuildById(guildId);
}
}