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 {
});
}
-
}