From 8031856bc28b734df476b46a37138cde93252e64 Mon Sep 17 00:00:00 2001 From: anthorob Date: Fri, 7 Jan 2022 19:09:49 -0500 Subject: [PATCH] Fix playlist loading and prepare for JDA 5 --- pom.xml | 8 +- src/main/java/netneutrality/GuildManager.java | 21 +++++ .../command/AbstractMusicCommand.java | 6 +- .../command/basic/HelpCommand.java | 22 ++--- .../command/crypto/CryptoPriceCommand.java | 11 +-- .../command/message/PruneCommand.java | 4 +- .../command/music/DeleteQueueCommand.java | 4 +- .../command/music/PlayCommand.java | 4 +- .../command/music/ViewQueueCommand.java | 81 +++++++++++++++++++ .../command/specific/DatabaseCommand.java | 4 +- .../netneutrality/handler/EditHandler.java | 4 +- .../music/LoadResultHandler.java | 5 +- .../netneutrality/music/MusicManager.java | 23 +++--- .../netneutrality/music/SourceFinder.java | 2 +- .../netneutrality/music/TrackScheduler.java | 6 +- .../netneutrality/utils/MessageFunction.java | 58 ++++++++++--- 16 files changed, 200 insertions(+), 63 deletions(-) create mode 100644 src/main/java/netneutrality/command/music/ViewQueueCommand.java diff --git a/pom.xml b/pom.xml index 61208d3..50dbbea 100644 --- a/pom.xml +++ b/pom.xml @@ -136,13 +136,11 @@ 2.17.0 - - commons-logging - commons-logging - 1.2 + org.apache.commons + commons-lang3 + 3.12.0 - com.sedmelluq lavaplayer diff --git a/src/main/java/netneutrality/GuildManager.java b/src/main/java/netneutrality/GuildManager.java index 0429cb2..724efbb 100644 --- a/src/main/java/netneutrality/GuildManager.java +++ b/src/main/java/netneutrality/GuildManager.java @@ -19,6 +19,21 @@ import java.util.concurrent.ConcurrentHashMap; public class GuildManager { + public enum GuildSettings { + MUSIC_ROLE("muisc.role"), MUSIC_CHANNEL("music.channel"), BLACKLIST_CHANNELS("blacklist.exclude.channels"); + + private final String setting; + + GuildSettings(String setting) { + this.setting = setting; + } + + @Override + public String toString() { + return setting; + } + } + public static final Logger logger = LoggerFactory.getLogger(GuildManager.class); private static final Map managers = new ConcurrentHashMap<>(); private final Guild guild; @@ -46,6 +61,12 @@ public class GuildManager { return guildEntity.getSettings().getSettingByKey(key); } + public String getSetting(GuildSettings key) { + reloadSettings(); + System.out.println(key); + return guildEntity.getSettings().getSettingByKey(key.toString()); + } + public void reloadSettings() { guildEntity.reloadSettings(); } diff --git a/src/main/java/netneutrality/command/AbstractMusicCommand.java b/src/main/java/netneutrality/command/AbstractMusicCommand.java index aac0603..7f7e915 100644 --- a/src/main/java/netneutrality/command/AbstractMusicCommand.java +++ b/src/main/java/netneutrality/command/AbstractMusicCommand.java @@ -25,11 +25,11 @@ public abstract class AbstractMusicCommand extends AbstractCommand { @Override public boolean canBeExecutedBy(Guild guild, Member member) { - String roleDb = GuildManager.getManager(guild).getSetting("music.role"); + String roleDb = GuildManager.getManager(guild).getSetting(GuildManager.GuildSettings.MUSIC_ROLE); System.out.println(roleDb); - if (!roleDb.isEmpty()) { - Role neededRole = MusicBot.getJDA().getRoleById(roleDb); + if (roleDb != null && !roleDb.isEmpty()) { + Role neededRole = guild.getRoleById(roleDb); return member.getRoles().contains(neededRole); } diff --git a/src/main/java/netneutrality/command/basic/HelpCommand.java b/src/main/java/netneutrality/command/basic/HelpCommand.java index 098ede5..58a6e97 100644 --- a/src/main/java/netneutrality/command/basic/HelpCommand.java +++ b/src/main/java/netneutrality/command/basic/HelpCommand.java @@ -15,17 +15,6 @@ import java.util.HashMap; public class HelpCommand extends AbstractCommand { - public HelpCommand() { - - } - - @Override - public String execute(MessageReceivedEvent event, String[] args) { - sendHelp(CommandManager.commands, CommandManager.commandsAlias, event.getAuthor(), event.getChannel()); - - return null; - } - @Override public boolean needAdmin() { return false; @@ -66,11 +55,14 @@ public class HelpCommand extends AbstractCommand { return CommandType.UTILITY; } - public void sendHelp(HashMap commands, HashMap alias, User user, MessageChannel channel) { + @Override + public String execute(MessageReceivedEvent event, String[] args) { - if (channel instanceof TextChannel) - channel.sendMessage(new MessageBuilder().append(user).append(" help has been sent your way!").build()).queue(); + if (event.getChannel() instanceof TextChannel) + event.getChannel().sendMessage(new MessageBuilder().append(event.getAuthor()).append(" help has been sent your way!").build()).queue(); - user.openPrivateChannel().queue(t -> t.sendMessage(MessageFunction.buildHelpMessage(commands, alias)).queue()); + event.getAuthor().openPrivateChannel().queue(t -> t.sendMessageEmbeds(MessageFunction.buildHelpMessage(CommandManager.commands, CommandManager.commandsAlias)).queue()); + + return null; } } diff --git a/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java b/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java index 0718590..fb6b852 100644 --- a/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java +++ b/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java @@ -11,7 +11,6 @@ import java.io.IOException; public class CryptoPriceCommand extends AbstractCommand { - private String currency = "USD"; private final String baseURL = "https://min-api.cryptocompare.com/data/price"; private String price = ""; @@ -57,12 +56,13 @@ public class CryptoPriceCommand extends AbstractCommand { @Override public String execute(MessageReceivedEvent event, String[] args) { + String currency = "USD"; if (args.length > 0) { if (args.length == 2) { if (Currency.isCurrency(args[1].toUpperCase())) - this.currency = args[1].toUpperCase(); + currency = args[1].toUpperCase(); else { event.getTextChannel().sendMessage("Please enter a valid currency").queue(); return null; @@ -70,11 +70,12 @@ public class CryptoPriceCommand extends AbstractCommand { } + String finalCurrency = currency; event.getTextChannel().sendMessage("Retreiving price, please wait...").queue(t -> { try { - WebModule ethereumHttp = new WebModule(baseURL + "?fsym=" + args[0] + "&tsyms=" + currency.toUpperCase()).request(); - price = Double.toString(ethereumHttp.getAsObject().getDouble(currency)); + WebModule ethereumHttp = new WebModule(baseURL + "?fsym=" + args[0] + "&tsyms=" + finalCurrency.toUpperCase()).request(); + price = Double.toString(ethereumHttp.getAsObject().getDouble(finalCurrency)); if (price == null) throw new IllegalArgumentException("Crypto doesn't exist"); @@ -84,7 +85,7 @@ public class CryptoPriceCommand extends AbstractCommand { t.editMessage("Error getting price!").queue(); } - t.editMessage(String.format("The current price of %s in %s is %s$", args[0].toUpperCase(), currency, price)).queue(); + t.editMessage(String.format("The current price of %s in %s is %s$", args[0].toUpperCase(), finalCurrency, price)).queue(); }); } diff --git a/src/main/java/netneutrality/command/message/PruneCommand.java b/src/main/java/netneutrality/command/message/PruneCommand.java index f8645a6..98d1f5e 100644 --- a/src/main/java/netneutrality/command/message/PruneCommand.java +++ b/src/main/java/netneutrality/command/message/PruneCommand.java @@ -30,12 +30,12 @@ public class PruneCommand extends AbstractCommand { @Override public String getUsage() { - return "Prune n messages from the channel you are currently on"; + return ""; } @Override public String getDescription() { - return null; + return "Delete n messages from the channel you are currently on"; } @Override diff --git a/src/main/java/netneutrality/command/music/DeleteQueueCommand.java b/src/main/java/netneutrality/command/music/DeleteQueueCommand.java index b21cc43..facb8fb 100644 --- a/src/main/java/netneutrality/command/music/DeleteQueueCommand.java +++ b/src/main/java/netneutrality/command/music/DeleteQueueCommand.java @@ -59,9 +59,9 @@ public class DeleteQueueCommand extends AbstractMusicCommand { if (player.isConnected()) { if (player.isConnectedTo(vChannel)) { - int queueSize = player.getScheduler().queue.size(); + int queueSize = player.getScheduler().getQueue().size(); if (queueSize > 0) { - player.getScheduler().queue.clear(); + player.getScheduler().getQueue().clear(); event.getTextChannel().sendMessage("Removed " + queueSize + (queueSize > 1 ? " tracks" : "track") + " from the queue").queue(); } else { event.getTextChannel().sendMessage("Queue is empty!").queue(); diff --git a/src/main/java/netneutrality/command/music/PlayCommand.java b/src/main/java/netneutrality/command/music/PlayCommand.java index b33761d..aa92d1f 100644 --- a/src/main/java/netneutrality/command/music/PlayCommand.java +++ b/src/main/java/netneutrality/command/music/PlayCommand.java @@ -32,12 +32,12 @@ public class PlayCommand extends AbstractMusicCommand { @Override public String getUsage() { - return null; + return ""; } @Override public String getDescription() { - return null; + return "Get the party going"; } @Override diff --git a/src/main/java/netneutrality/command/music/ViewQueueCommand.java b/src/main/java/netneutrality/command/music/ViewQueueCommand.java new file mode 100644 index 0000000..1f6a60e --- /dev/null +++ b/src/main/java/netneutrality/command/music/ViewQueueCommand.java @@ -0,0 +1,81 @@ +package netneutrality.command.music; + +/* + * Copyright (c) anthorob + * + * This file is closed-source. It should not be distributed or copied in any way or form + */ + +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.VoiceChannel; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import netneutrality.command.AbstractMusicCommand; +import netneutrality.command.Visibility; +import netneutrality.music.MusicManager; +import netneutrality.utils.MessageFunction; + +public class ViewQueueCommand extends AbstractMusicCommand { + @Override + public boolean needAdmin() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public String getCommand() { + return "viewqueue"; + } + + @Override + public String[] getAlias() { + return new String[]{"viewq"}; + } + + @Override + public String getUsage() { + return null; + } + + @Override + public String getDescription() { + return null; + } + + @Override + public Visibility getVisibility() { + return Visibility.CHANNEL; + } + + @Override + public String execute(MessageReceivedEvent event, String[] args) { + Member member = event.getMember(); + + if (member.getVoiceState().inVoiceChannel()) { + MusicManager player = MusicManager.get(event.getGuild()); + VoiceChannel vChannel = member.getVoiceState().getChannel(); + + if (player.isConnected()) { + if (player.isConnectedTo(vChannel)) { + int queueSize = player.getScheduler().getQueue().size(); + if (queueSize > 0) { + + event.getTextChannel().sendMessageEmbeds(MessageFunction.buildViewQueueMessage(player, member)).queue(); + } else { + event.getTextChannel().sendMessage("Queue is empty!").queue(); + } + + } else + event.getTextChannel().sendMessage("Not in your voice channel").queue(); + } else { + event.getTextChannel().sendMessage("Player is not connected").queue(); + } + } else + event.getTextChannel().sendMessage("You are not in a voice channel").queue(); + + return null; + } +} diff --git a/src/main/java/netneutrality/command/specific/DatabaseCommand.java b/src/main/java/netneutrality/command/specific/DatabaseCommand.java index b3db69f..0190ef8 100644 --- a/src/main/java/netneutrality/command/specific/DatabaseCommand.java +++ b/src/main/java/netneutrality/command/specific/DatabaseCommand.java @@ -84,7 +84,7 @@ public class DatabaseCommand extends AbstractCommand { embed.setDescription( "Message from " + message.getSender() + " on the channel " + message.getChannelName()); embed.addField("Message: ", "" + message.getMessage(), false); - event.getTextChannel().sendMessage(embed.build()).queue(); + event.getTextChannel().sendMessageEmbeds(embed.build()).queue(); } else { User user = event.getJDA().getUserById(args[1]); if (user != null) { @@ -101,7 +101,7 @@ public class DatabaseCommand extends AbstractCommand { } embed.setFooter("Guild : " + event.getGuild().getName(), null); - event.getAuthor().openPrivateChannel().queue(t -> t.sendMessage(embed.build()).queue()); + event.getAuthor().openPrivateChannel().queue(t -> t.sendMessageEmbeds(embed.build()).queue()); } } diff --git a/src/main/java/netneutrality/handler/EditHandler.java b/src/main/java/netneutrality/handler/EditHandler.java index 6a991cc..883b171 100644 --- a/src/main/java/netneutrality/handler/EditHandler.java +++ b/src/main/java/netneutrality/handler/EditHandler.java @@ -18,7 +18,7 @@ public class EditHandler extends ListenerAdapter { if (event.getAuthor().isBot()) return; - MTableModel table = DBController.get().prepareAndExecuteAsync("SELECT channelId FROM logging WHERE serverId = ? AND enabled = 1", event.getGuild().getId()).blocking(); + MTableModel table = DBController.get().prepareAndExecuteAsync("SELECT channel_id FROM logging WHERE guild_id = ? AND enabled = 1", event.getGuild().getId()).blocking(); Object logChannel = table.getRowModel(0).getItem(0); if (logChannel != null) { @@ -42,7 +42,7 @@ public class EditHandler extends ListenerAdapter { editEmbed.setFooter("ID : " + event.getMessageId(), null); editEmbed.setTimestamp(event.getMessage().getTimeCreated()); - event.getJDA().getTextChannelById(logChannel.toString()).sendMessage(editEmbed.build()).queue(); + event.getJDA().getTextChannelById(logChannel.toString()).sendMessageEmbeds(editEmbed.build()).queue(); } diff --git a/src/main/java/netneutrality/music/LoadResultHandler.java b/src/main/java/netneutrality/music/LoadResultHandler.java index d89fa67..0413f09 100644 --- a/src/main/java/netneutrality/music/LoadResultHandler.java +++ b/src/main/java/netneutrality/music/LoadResultHandler.java @@ -33,7 +33,7 @@ public class LoadResultHandler implements AudioLoadResultHandler { @Override public void trackLoaded(AudioTrack audioTrack) { if (!silent) { - channel.sendMessage(MessageFunction.buildAddingTrackMessage(audioTrack, user)).queue(); + channel.sendMessageEmbeds(MessageFunction.buildAddingTrackMessage(audioTrack, user)).queue(); } scheduler.queue(audioTrack); @@ -45,9 +45,10 @@ public class LoadResultHandler implements AudioLoadResultHandler { if (identifier.startsWith("ytsearch:")) { AudioTrack track = audioPlaylist.getTracks().get(0); - channel.sendMessage(MessageFunction.buildAddingTrackMessage(track, user)).queue(); + channel.sendMessageEmbeds(MessageFunction.buildAddingTrackMessage(track, user)).queue(); scheduler.queue(track); } else { + channel.sendMessageEmbeds(MessageFunction.buildAddingPlaylistMessage(audioPlaylist, user)).queue(); for (AudioTrack track : audioPlaylist.getTracks()) { scheduler.queue(track); } diff --git a/src/main/java/netneutrality/music/MusicManager.java b/src/main/java/netneutrality/music/MusicManager.java index 1470208..61f73ed 100644 --- a/src/main/java/netneutrality/music/MusicManager.java +++ b/src/main/java/netneutrality/music/MusicManager.java @@ -16,6 +16,7 @@ import netneutrality.ThreadManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -64,8 +65,9 @@ public class MusicManager { guild.getAudioManager().openAudioConnection(vChannel); ((ScheduledExecutorService) ThreadManager.getExecutor("music", ThreadManager.ExecutorType.SCHEDULED, 5)).scheduleWithFixedDelay(() -> { - if ((getCurrentlyPlaying() == null && scheduler.queue.isEmpty()) || vChannel.getMembers().size() == 0) + if ((getCurrentlyPlaying() == null && scheduler.getQueue().isEmpty()) || vChannel.getMembers().size() == 0) { leave(); + } }, 120, 120, TimeUnit.SECONDS); } else logger.error("Error connecting!"); @@ -81,20 +83,19 @@ public class MusicManager { public synchronized void leave() { if (isConnected()) { - player.destroy(); + player.stopTrack(); + guild.getAudioManager().closeAudioConnection(); } scheduler.resetTopic(); - if (guild != null) { - guild.getAudioManager().closeAudioConnection(); - } - } public static void disconnectPlayers() { for (MusicManager mm : managers.values()) { mm.leave(); + mm.player.destroy(); + mm.scheduler.getQueue().clear(); } } @@ -114,7 +115,7 @@ public class MusicManager { } public synchronized void skip() { - if (!scheduler.queue.isEmpty()) { + if (!scheduler.getQueue().isEmpty()) { scheduler.nextTrack(); } else { leave(); @@ -129,9 +130,11 @@ public class MusicManager { return scheduler; } - public List getAllQueuedTrack() { - List queuedTracks = new LinkedList<>(); - scheduler.queue.forEach((a) -> queuedTracks.add(a.getInfo().title)); + public ArrayList getAllQueuedTrack() { + ArrayList queuedTracks = new ArrayList<>(); + scheduler.getQueue().forEach((a) -> { + queuedTracks.add(a.getInfo().title); + }); return queuedTracks; } diff --git a/src/main/java/netneutrality/music/SourceFinder.java b/src/main/java/netneutrality/music/SourceFinder.java index 2196ff4..2a09d40 100644 --- a/src/main/java/netneutrality/music/SourceFinder.java +++ b/src/main/java/netneutrality/music/SourceFinder.java @@ -50,7 +50,7 @@ public class SourceFinder { switch (getSource(url)) { case Youtube: - identifier = youtubeMatcher.group(1); + identifier = url; break; case Soundcloud: identifier = url; diff --git a/src/main/java/netneutrality/music/TrackScheduler.java b/src/main/java/netneutrality/music/TrackScheduler.java index 81cc068..ebc6031 100644 --- a/src/main/java/netneutrality/music/TrackScheduler.java +++ b/src/main/java/netneutrality/music/TrackScheduler.java @@ -20,7 +20,7 @@ public class TrackScheduler extends AudioEventAdapter { private final AudioPlayer player; private TextChannel channel; - public final BlockingQueue queue; + private final BlockingQueue queue; public String topic; public TrackScheduler(AudioPlayer player) { @@ -53,6 +53,10 @@ public class TrackScheduler extends AudioEventAdapter { return channel; } + public BlockingQueue getQueue() { + return queue; + } + public void resetTopic() { if (this.channel != null) { //this.channel.getManager().setTopic(this.topic).queue(); diff --git a/src/main/java/netneutrality/utils/MessageFunction.java b/src/main/java/netneutrality/utils/MessageFunction.java index 063d8b6..9428b11 100644 --- a/src/main/java/netneutrality/utils/MessageFunction.java +++ b/src/main/java/netneutrality/utils/MessageFunction.java @@ -7,13 +7,9 @@ package netneutrality.utils; */ import java.awt.*; -import java.time.Duration; -import java.time.LocalDateTime; import java.time.OffsetDateTime; -import java.util.HashMap; +import java.util.*; import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; @@ -23,6 +19,8 @@ import netneutrality.command.AbstractCommand; import netneutrality.db.DBController; import netneutrality.db.controllers.DBBlacklist; import netneutrality.db.models.MBlacklist; +import netneutrality.music.MusicManager; +import org.apache.commons.lang3.time.DurationFormatUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,23 +58,35 @@ public class MessageFunction { return false; } - public synchronized static MessageEmbed buildAddingTrackMessage(AudioTrack track, Member user) { - Duration d = Duration.ofMillis(track.getDuration()); - + public synchronized static MessageEmbed buildCurrentlyPlayingMessage(AudioTrack track, Member user) { EmbedBuilder message = new EmbedBuilder(); - message.setTitle("Adding track to queue.."); + message.setThumbnail(String.format("https://img.youtube.com/vi/%s/default.jpg", track.getIdentifier())); + message.setTitle("Currently playing:"); message.setColor(Color.BLUE); message.addField("Track title: ", track.getInfo().title, false); - message.addField("Duration: ", d.toMinutesPart() + ":" + d.toSecondsPart(), false); + message.addField("Duration: ", DurationFormatUtils.formatDuration(track.getPosition(), "**HH:mm:ss**", true) + " / " + DurationFormatUtils.formatDuration(track.getDuration(), "**HH:mm:ss**", true), false); message.setFooter("Requested by " + user.getUser().getName(), user.getUser().getAvatarUrl()); message.setTimestamp(OffsetDateTime.now()); + return message.build(); + } + + public synchronized static MessageEmbed buildAddingTrackMessage(AudioTrack track, Member user) { + EmbedBuilder message = new EmbedBuilder(); + message.setThumbnail(String.format("https://img.youtube.com/vi/%s/default.jpg", track.getIdentifier())); + message.setTitle("Adding track to queue.."); + message.setColor(Color.BLUE); + message.addField("Track title: ", track.getInfo().title, false); + message.addField("Duration: ", DurationFormatUtils.formatDuration(track.getDuration(), "**HH:mm:ss**", true), false); + message.setFooter("Requested by " + user.getUser().getName(), user.getUser().getAvatarUrl()); + message.setTimestamp(OffsetDateTime.now()); return message.build(); } public synchronized static MessageEmbed buildAddingPlaylistMessage(AudioPlaylist playlist, Member user) { EmbedBuilder message = new EmbedBuilder(); + message.setThumbnail(String.format("https://img.youtube.com/vi/%s/default.jpg", playlist.getSelectedTrack().getIdentifier())); message.setTitle("Adding playlist to queue.."); message.setColor(Color.BLUE); message.addField("Playlist: ", playlist.getName(), false); @@ -88,6 +98,33 @@ public class MessageFunction { return message.build(); } + public static MessageEmbed buildViewQueueMessage(MusicManager manager, Member user) { + ArrayList tracks = manager.getAllQueuedTrack(); + Collections.reverse(tracks); + AudioTrack current = manager.getCurrentlyPlaying(); + + EmbedBuilder message = new EmbedBuilder(); + message.setTitle("Current queue (showing max 10 items):"); + message.setColor(Color.BLUE); + + int index = 0; + for (String track: tracks) { + String text = track; + + if (Objects.equals(track, current.getInfo().title)) + text += " (Currently playing)"; + + message.addField("Track #" + ++index, text, false); + + if (index == 10) break; + } + + message.setFooter("Requested by " + user.getUser().getName(), user.getUser().getAvatarUrl()); + message.setTimestamp(OffsetDateTime.now()); + + return message.build(); + } + public static MessageEmbed buildHelpMessage(HashMap commands, HashMap alias) { EmbedBuilder message = new EmbedBuilder(); message.setTitle("Commands for Net Neutrality"); @@ -135,5 +172,4 @@ public class MessageFunction { }); } - }