From afb4bd9e89967973ed727fdd0490e59780db5051 Mon Sep 17 00:00:00 2001 From: anthorob Date: Sat, 18 Jun 2022 17:25:36 -0400 Subject: [PATCH] Add new alias for delete queue and improve logic --- bot.properties.example | 5 +- pom.xml | 26 +++-- sql/netneutrality_jpa.sql | 11 +- .../java/netneutrality/NetNeutrality.java | 3 +- .../command/music/DeleteQueueCommand.java | 5 +- .../netneutrality/music/MusicManager.java | 71 ++---------- .../netneutrality/music/QueueManager.java | 22 +++- .../netneutrality/music/TopicManager.java | 10 +- .../music/TrackLoadingHandler.java | 105 ++++++++++++++++++ .../netneutrality/music/TrackScheduler.java | 22 +++- src/main/resources/log4j2.properties | 8 ++ .../music/LoadableSourceTest.java | 3 - 12 files changed, 196 insertions(+), 95 deletions(-) create mode 100644 src/main/java/netneutrality/music/TrackLoadingHandler.java diff --git a/bot.properties.example b/bot.properties.example index 99dab96..0fa8fcf 100644 --- a/bot.properties.example +++ b/bot.properties.example @@ -4,9 +4,10 @@ BOT_PREFIX= BOT_OWNER= BOT_PAPISID= BOT_PSID= +API_PORT=9000 -MYSQL_HOST= -MYSQL_USER= +MYSQL_HOST=127.0.0.1 +MYSQL_USER=root MYSQL_PASSWORD= MYSQL_DATABASE= MYSQL_PORT=3306 diff --git a/pom.xml b/pom.xml index f3f8ee7..8e4b463 100644 --- a/pom.xml +++ b/pom.xml @@ -99,6 +99,12 @@ + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + net.dv8tion JDA @@ -118,7 +124,7 @@ com.squareup.okhttp3 okhttp - 4.9.3 + 4.10.0 @@ -134,7 +140,7 @@ io.sentry sentry - 5.6.3 + 6.0.0 p6spy @@ -146,7 +152,7 @@ org.json json - 20210307 + 20220320 @@ -158,17 +164,17 @@ mysql mysql-connector-java - 8.0.28 + 8.0.29 org.apache.logging.log4j log4j-core - 2.17.1 + 2.17.2 org.apache.logging.log4j log4j-slf4j-impl - 2.17.1 + 2.17.2 @@ -176,6 +182,12 @@ commons-lang3 3.12.0 + + commons-codec + commons-codec + 1.15 + + junit junit @@ -185,7 +197,7 @@ org.openjdk.nashorn nashorn-core - 15.3 + 15.4 diff --git a/sql/netneutrality_jpa.sql b/sql/netneutrality_jpa.sql index 94ebd9a..61976ad 100644 --- a/sql/netneutrality_jpa.sql +++ b/sql/netneutrality_jpa.sql @@ -1,12 +1,3 @@ --- phpMyAdmin SQL Dump --- version 5.1.0 --- https://www.phpmyadmin.net/ --- --- Host: 127.0.0.1:3306 --- Generation Time: Mar 14, 2022 at 08:59 AM --- Server version: 10.4.10-MariaDB --- PHP Version: 7.4.19 - SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; @@ -20,7 +11,9 @@ SET time_zone = "+00:00"; -- -- Database: `netneutrality` -- +CREATE DATABASE IF NOT EXISTS netneutrality CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +USE netneutrality; -- -------------------------------------------------------- -- diff --git a/src/main/java/netneutrality/NetNeutrality.java b/src/main/java/netneutrality/NetNeutrality.java index 3b8f600..5d13e51 100644 --- a/src/main/java/netneutrality/NetNeutrality.java +++ b/src/main/java/netneutrality/NetNeutrality.java @@ -38,6 +38,7 @@ public class NetNeutrality { options.setEnvironment(env); options.setTracesSampleRate(1.0); options.setDebug(env.equals("dev")); + options.setRelease("netneutrality@2.0.0-alpha"); }); if ("dev".equals(env)) { @@ -49,7 +50,7 @@ public class NetNeutrality { CommandManager.init(); MusicManager.initPlayerManager(); jda.addEventListener(new MessageReceivedHandler(), new EditHandler(), new ServerJoinHandler()); - new WebApi(9000); + new WebApi(Integer.parseInt(Settings.getInstance().get("API_PORT", "9000"))); jda.getPresence().setActivity(Activity.watching("you")); Runtime.getRuntime().addShutdownHook(new BaseThreadFactory("shutdown").newThread(new ShutdownThread())); diff --git a/src/main/java/netneutrality/command/music/DeleteQueueCommand.java b/src/main/java/netneutrality/command/music/DeleteQueueCommand.java index 000d060..9efd1bd 100644 --- a/src/main/java/netneutrality/command/music/DeleteQueueCommand.java +++ b/src/main/java/netneutrality/command/music/DeleteQueueCommand.java @@ -34,7 +34,7 @@ public class DeleteQueueCommand extends AbstractMusicCommand { @Override public String[] getAlias() { - return new String[] {"delq", "delqueue"}; + return new String[] {"delq", "delqueue", "clear"}; } @Override @@ -67,8 +67,7 @@ public class DeleteQueueCommand extends AbstractMusicCommand { if (context.getArg(0).equals("all")) { if (queueSize > 0) { - player.leave(); - player.getScheduler().getQueueManager().getQueue().clear(); + player.getScheduler().getQueueManager().clearQueue(); context.reply(String.format("Removed %d track%s from the queue", queueSize--, (queueSize > 1 ? "s" : ""))); } else { context.reply("Queue is empty!"); diff --git a/src/main/java/netneutrality/music/MusicManager.java b/src/main/java/netneutrality/music/MusicManager.java index 01c4eea..225d276 100644 --- a/src/main/java/netneutrality/music/MusicManager.java +++ b/src/main/java/netneutrality/music/MusicManager.java @@ -47,13 +47,14 @@ public class MusicManager { private final Guild guild; private final AudioPlayer player; private final TrackScheduler scheduler; + private TrackLoadingHandler lastLoadingHandler; private ScheduledFuture autoDisconnectThread; private final int baseVolume; private MusicManager(Guild guild) { this.guild = guild; this.player = playerManager.createPlayer(); - this.scheduler = new TrackScheduler(player, guild); + this.scheduler = new TrackScheduler(this); this.baseVolume = Integer.parseInt(GuildManager.getManager(guild).getSetting(GuildManager.Settings.MUSIC_VOLUME)); guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); @@ -117,10 +118,18 @@ public class MusicManager { return info.getRequester(); } + protected AudioPlayer getPlayer() { + return player; + } + public Guild getGuild() { return guild; } + public TrackLoadingHandler getLastLoadingHandler() { + return lastLoadingHandler; + } + public synchronized void leave() { if (isConnected()) { logger.debug("Guild {}: leaving voice channel {}", guild.getId(), guild.getAudioManager().getConnectedChannel().getId()); @@ -183,64 +192,8 @@ public class MusicManager { scheduler.getTopicManager().attachTextChannel(channel); if (identifier != null) { - playerManager.loadItemOrdered(this, identifier, new AudioLoadResultHandler() { - - @Override - public void trackLoaded(AudioTrack audioTrack) { - logger.debug("Guild {}: track loaded: {}", guild.getId(), identifier); - context.deleteMessage(); - - scheduler.getQueueManager().queue(audioTrack, member); - - if (!silent) { - //context.replyToMessage("Added track to queue"); - context.reply(MessageFunction.buildAddingTrackMessage(audioTrack, member, identifier)); - } - } - - @Override - public void playlistLoaded(AudioPlaylist audioPlaylist) { - logger.debug("Guild {}: playlist loaded: {}", guild.getId(), identifier); - context.deleteMessage(); - - if (audioPlaylist.isSearchResult()) { - AudioTrack track = audioPlaylist.getTracks().get(0); - scheduler.getQueueManager().queue(track, member); - - if (!silent) { - //context.replyToMessage(new MessageBuilder("Added track to queue: ").append(String.format("https://youtu.be/%s", track.getIdentifier())).build()); - context.reply(MessageFunction.buildAddingTrackMessage(track, member, String.format("https://youtu.be/%s", track.getIdentifier()))); - } - - } else { - if (!silent) { - //context.replyToMessage("Added playlist to queue"); - context.reply(MessageFunction.buildAddingPlaylistMessage(audioPlaylist, member, identifier)); - } - - for (AudioTrack track : audioPlaylist.getTracks()) { - synchronized (scheduler.getQueueManager().getQueue()) { - scheduler.getQueueManager().queue(track, member); - } - } - } - - - } - - @Override - public void noMatches() { - logger.debug("Guild {}: no matches for identifier {}", guild.getId(), identifier); - context.replyToMessage("No matches found"); - } - - @Override - public void loadFailed(FriendlyException e) { - logger.debug("Guild {}: load failed for identifier {}", guild.getId(), identifier, e); - context.replyToMessage("Failed to load track: " + e.getMessage()); - } - - }); + lastLoadingHandler = new TrackLoadingHandler(identifier, silent, this, context); + playerManager.loadItemOrdered(this, identifier, lastLoadingHandler); } else { context.replyToMessage("No source found to play the given url"); } diff --git a/src/main/java/netneutrality/music/QueueManager.java b/src/main/java/netneutrality/music/QueueManager.java index 6e67c78..5b18728 100644 --- a/src/main/java/netneutrality/music/QueueManager.java +++ b/src/main/java/netneutrality/music/QueueManager.java @@ -87,13 +87,16 @@ public class QueueManager { } private final Logger logger = LoggerFactory.getLogger(QueueManager.class); + + private final TrackScheduler scheduler; private final AudioPlayer player; private final Guild guild; private final Deque queue; - public QueueManager(AudioPlayer player, Guild guild) { - this.player = player; - this.guild = guild; + public QueueManager(TrackScheduler scheduler) { + this.scheduler = scheduler; + this.player = scheduler.getPlayer(); + this.guild = scheduler.getGuild(); this.queue = new LinkedBlockingDeque<>(); } @@ -104,10 +107,23 @@ public class QueueManager { } } + public TrackScheduler getScheduler() { + return scheduler; + } + public Guild getGuild() { return guild; } + public void clearQueue() { + scheduler.getMusicManager().leave(); + scheduler.getMusicManager().getLastLoadingHandler().stopLoading(); + + synchronized (queue) { + queue.clear(); + } + } + public ArrayList getAllQueuedTrack() { synchronized (queue) { ArrayList tracks = new ArrayList<>(); diff --git a/src/main/java/netneutrality/music/TopicManager.java b/src/main/java/netneutrality/music/TopicManager.java index 6a7e267..d080d9a 100644 --- a/src/main/java/netneutrality/music/TopicManager.java +++ b/src/main/java/netneutrality/music/TopicManager.java @@ -15,12 +15,18 @@ import java.util.concurrent.TimeUnit; public class TopicManager { + private final TrackScheduler scheduler; private final Guild guild; private TextChannel channel; private String originalTopic; - public TopicManager(Guild guild) { - this.guild = guild; + public TopicManager(TrackScheduler scheduler) { + this.scheduler = scheduler; + this.guild = scheduler.getGuild(); + } + + public TrackScheduler getScheduler() { + return scheduler; } public Guild getGuild() { diff --git a/src/main/java/netneutrality/music/TrackLoadingHandler.java b/src/main/java/netneutrality/music/TrackLoadingHandler.java new file mode 100644 index 0000000..d887a3b --- /dev/null +++ b/src/main/java/netneutrality/music/TrackLoadingHandler.java @@ -0,0 +1,105 @@ +package netneutrality.music; +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + + +import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; +import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; +import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import net.dv8tion.jda.api.entities.Guild; +import netneutrality.core.context.CommandContext; +import netneutrality.utils.MessageFunction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TrackLoadingHandler implements AudioLoadResultHandler { + private final Logger logger = LoggerFactory.getLogger(TrackLoadingHandler.class); + + private final String identifier; + private final boolean silent; + private boolean loadingDisabled = false; + private final Guild guild; + private final TrackScheduler scheduler; + private final CommandContext context; + + public TrackLoadingHandler(String identifier, boolean silent, MusicManager manager, CommandContext context) { + this.identifier = identifier; + this.silent = silent; + this.guild = manager.getGuild(); + this.scheduler = manager.getScheduler(); + this.context = context; + } + + public synchronized void stopLoading() { + logger.debug("Guild {}: stopped loading of new tracks", guild.getId()); + loadingDisabled = true; + } + + @Override + public void trackLoaded(AudioTrack audioTrack) { + if (loadingDisabled) { + return; + } + + logger.debug("Guild {}: track loaded: {}", guild.getId(), identifier); + context.deleteMessage(); + + scheduler.getQueueManager().queue(audioTrack, context.getGuildUser()); + + if (!silent) { + //context.replyToMessage("Added track to queue"); + context.reply(MessageFunction.buildAddingTrackMessage(audioTrack, context.getGuildUser(), identifier)); + } + } + + @Override + public void playlistLoaded(AudioPlaylist audioPlaylist) { + if (loadingDisabled) { + return; + } + + logger.debug("Guild {}: playlist loaded: {}", guild.getId(), identifier); + context.deleteMessage(); + + if (audioPlaylist.isSearchResult()) { + AudioTrack track = audioPlaylist.getTracks().get(0); + scheduler.getQueueManager().queue(track, context.getGuildUser()); + + if (!silent) { + //context.replyToMessage(new MessageBuilder("Added track to queue: ").append(String.format("https://youtu.be/%s", track.getIdentifier())).build()); + context.reply(MessageFunction.buildAddingTrackMessage(track, context.getGuildUser(), String.format("https://youtu.be/%s", track.getIdentifier()))); + } + + } else { + if (!silent) { + //context.replyToMessage("Added playlist to queue"); + context.reply(MessageFunction.buildAddingPlaylistMessage(audioPlaylist, context.getGuildUser(), identifier)); + } + + for (AudioTrack track : audioPlaylist.getTracks()) { + synchronized (scheduler.getQueueManager().getQueue()) { + scheduler.getQueueManager().queue(track, context.getGuildUser()); + } + } + } + + + } + + @Override + public void noMatches() { + logger.debug("Guild {}: no matches for identifier {}", guild.getId(), identifier); + context.replyToMessage("No matches found"); + } + + @Override + public void loadFailed(FriendlyException e) { + logger.debug("Guild {}: load failed for identifier {}", guild.getId(), identifier, e); + context.replyToMessage("Failed to load track: " + e.getMessage()); + } +} diff --git a/src/main/java/netneutrality/music/TrackScheduler.java b/src/main/java/netneutrality/music/TrackScheduler.java index 4d499fe..658d5d1 100644 --- a/src/main/java/netneutrality/music/TrackScheduler.java +++ b/src/main/java/netneutrality/music/TrackScheduler.java @@ -17,18 +17,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TrackScheduler extends AudioEventAdapter { - private final static Logger logger = LoggerFactory.getLogger(TrackScheduler.class); + private final QueueManager queueManager; private final TopicManager topicManager; + private final MusicManager manager; private final AudioPlayer player; private final Guild guild; - public TrackScheduler(AudioPlayer player, Guild guild) { - this.player = player; - this.guild = guild; - this.queueManager = new QueueManager(player, guild); - this.topicManager = new TopicManager(guild); + public TrackScheduler(MusicManager manager) { + this.manager = manager; + this.player = manager.getPlayer(); + this.guild = manager.getGuild(); + this.queueManager = new QueueManager(this); + this.topicManager = new TopicManager(this); } public QueueManager getQueueManager() { @@ -39,10 +41,18 @@ public class TrackScheduler extends AudioEventAdapter { return topicManager; } + public MusicManager getMusicManager() { + return manager; + } + public AudioPlayer getPlayer() { return player; } + public Guild getGuild() { + return guild; + } + @Override public void onPlayerPause(AudioPlayer player) { // Player was paused diff --git a/src/main/resources/log4j2.properties b/src/main/resources/log4j2.properties index 39aaad3..42be505 100644 --- a/src/main/resources/log4j2.properties +++ b/src/main/resources/log4j2.properties @@ -30,6 +30,14 @@ logger.jda.additivity = false logger.jda.appenderRef.rolling.ref = LogToRollingFile logger.jda.appenderRef.console.ref = consoleLogger +logger.lavaplayer.name = com.sedmelluq.discord +logger.lavaplayer.level = info +logger.lavaplayer.additivity = false +logger.lavaplayer.appenderRef.rolling.ref = LogToRollingFile +logger.lavaplayer.appenderRef.console.ref = consoleLogger + + + logger.app.name = netneutrality logger.app.level = debug logger.app.additivity = false diff --git a/src/test/java/netneutrality/music/LoadableSourceTest.java b/src/test/java/netneutrality/music/LoadableSourceTest.java index 925408c..5a63ef4 100644 --- a/src/test/java/netneutrality/music/LoadableSourceTest.java +++ b/src/test/java/netneutrality/music/LoadableSourceTest.java @@ -23,9 +23,6 @@ public class LoadableSourceTest { LoadableSourceManager loadableSourceManager = new LoadableSourceManager(); CachedSource cachedSource = loadableSourceManager.get(new AppleMostPlayed()); - System.out.println(cachedSource.getLastAccess()); - System.out.println(cachedSource.getSongs()); - assertTrue(cachedSource.getSongs().size() > 0); } } \ No newline at end of file