diff --git a/src/main/java/dev/logal/logalbot/commands/CommandResponse.java b/src/main/java/dev/logal/logalbot/commands/CommandResponse.java index e1573be..e9b35e6 100644 --- a/src/main/java/dev/logal/logalbot/commands/CommandResponse.java +++ b/src/main/java/dev/logal/logalbot/commands/CommandResponse.java @@ -22,6 +22,7 @@ import com.vdurmont.emoji.Emoji; import com.vdurmont.emoji.EmojiManager; import dev.logal.logalbot.tasks.MessageDeleteTask; +import dev.logal.logalbot.tasks.ReactionCallbackExpireTask; import dev.logal.logalbot.utils.ReactionCallbackManager; import dev.logal.logalbot.utils.Scheduler; import net.dv8tion.jda.core.MessageBuilder; @@ -38,8 +39,8 @@ public final class CommandResponse { private MessageEmbed responseEmbed; private User callbacksTarget; - private long deletionDelay = 0; - private TimeUnit deletionDelayUnit; + private long deletionDelay, expireDelay = 0; + private TimeUnit deletionDelayUnit, expireDelayUnit; public CommandResponse(final String emoji, final String response) { this.emoji = EmojiManager.getForAlias(emoji); @@ -57,8 +58,8 @@ public final class CommandResponse { return this; } - public final CommandResponse addReactionCallback(final Emoji emoji, final ReactionCallback callback) { - this.callbacks.put(emoji, callback); + public final CommandResponse addReactionCallback(final String emoji, final ReactionCallback callback) { + this.callbacks.put(EmojiManager.getForAlias(emoji), callback); return this; } @@ -67,6 +68,12 @@ public final class CommandResponse { return this; } + public final CommandResponse setReactionCallbackExpireDelay(final long delay, final TimeUnit unit) { + this.expireDelay = delay; + this.expireDelayUnit = unit; + return this; + } + public final void sendResponse(final TextChannel channel) { final MessageBuilder builder = new MessageBuilder(); builder.setContent(this.emoji.getUnicode() + " " + this.response); @@ -81,12 +88,16 @@ public final class CommandResponse { private final void handleResponseCreation(final Message message) { if ((this.deletionDelay != 0) && (this.deletionDelayUnit != null)) { Scheduler.schedule(new MessageDeleteTask(message), this.deletionDelay, this.deletionDelayUnit); + } else if ((this.expireDelay != 0) && (this.expireDelayUnit != null)) { + Scheduler.schedule(new ReactionCallbackExpireTask(message), this.expireDelay, this.expireDelayUnit); } for (final Map.Entry callback : callbacks.entrySet()) { ReactionCallbackManager.registerCallback(message, callback.getKey(), callback.getValue()); - ReactionCallbackManager.setCallbackTarget(this.callbacksTarget, message); - message.addReaction(callback.getKey().getUnicode()).queue(); + } + + if (callbacksTarget != null) { + ReactionCallbackManager.setCallbackTarget(message, this.callbacksTarget); } } } \ No newline at end of file diff --git a/src/main/java/dev/logal/logalbot/commands/ReactionCallback.java b/src/main/java/dev/logal/logalbot/commands/ReactionCallback.java index b64356e..dc64799 100644 --- a/src/main/java/dev/logal/logalbot/commands/ReactionCallback.java +++ b/src/main/java/dev/logal/logalbot/commands/ReactionCallback.java @@ -15,7 +15,8 @@ package dev.logal.logalbot.commands; // limitations under the License. import net.dv8tion.jda.core.entities.Member; +import net.dv8tion.jda.core.entities.Message; public interface ReactionCallback { - void run(final Member reactor, final long messageID); + void run(final Member reactor, final Message message); } \ No newline at end of file diff --git a/src/main/java/dev/logal/logalbot/commands/audio/Queue.java b/src/main/java/dev/logal/logalbot/commands/audio/Queue.java index bbf973c..2618a01 100644 --- a/src/main/java/dev/logal/logalbot/commands/audio/Queue.java +++ b/src/main/java/dev/logal/logalbot/commands/audio/Queue.java @@ -14,11 +14,16 @@ package dev.logal.logalbot.commands.audio; // See the License for the specific language governing permissions and // limitations under the License. +import java.util.List; import java.util.concurrent.TimeUnit; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; + import dev.logal.logalbot.commands.Command; import dev.logal.logalbot.commands.CommandResponse; import dev.logal.logalbot.utils.AudioUtil; +import dev.logal.logalbot.utils.CommandManager; +import dev.logal.logalbot.utils.ReactionCallbackManager; import dev.logal.logalbot.utils.TrackUtil; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.Member; @@ -48,8 +53,24 @@ public final class Queue implements Command { } } - response.attachEmbed( - TrackUtil.generatePaginatedTrackListInfoEmbed(AudioUtil.getTrackScheduler(guild).getQueue(), page)); + final List queue = AudioUtil.getTrackScheduler(guild).getQueue(); + if (page != 1) { + response.addReactionCallback("arrow_left", (reactor, message) -> { + ReactionCallbackManager.unregisterMessage(message, true); + CommandManager.executeCommand(("queue " + (page - 1)).split(" "), reactor, channel); + }); + } + + if (TrackUtil.doesGreaterPageExist(queue, page)) { + response.addReactionCallback("arrow_right", (reactor, message) -> { + ReactionCallbackManager.unregisterMessage(message, true); + CommandManager.executeCommand(("queue " + (page + 1)).split(" "), reactor, channel); + }); + } + + response.setReactionCallbackTarget(executor); + response.setReactionCallbackExpireDelay(3, TimeUnit.SECONDS); + response.attachEmbed(TrackUtil.generatePaginatedTrackListInfoEmbed(queue, page)); return response; } } \ No newline at end of file diff --git a/src/main/java/dev/logal/logalbot/commands/audio/Remove.java b/src/main/java/dev/logal/logalbot/commands/audio/Remove.java index f1304a0..5c89999 100644 --- a/src/main/java/dev/logal/logalbot/commands/audio/Remove.java +++ b/src/main/java/dev/logal/logalbot/commands/audio/Remove.java @@ -21,7 +21,6 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import dev.logal.logalbot.audio.TrackScheduler; import dev.logal.logalbot.commands.Command; import dev.logal.logalbot.commands.CommandResponse; -import dev.logal.logalbot.commands.ReactionCallback; import dev.logal.logalbot.utils.AudioUtil; import dev.logal.logalbot.utils.CommandManager; import dev.logal.logalbot.utils.ReactionCallbackManager; @@ -31,7 +30,6 @@ import dev.logal.logalbot.utils.VoiceChannelUtil; import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.Member; -import net.dv8tion.jda.core.entities.Message; import net.dv8tion.jda.core.entities.TextChannel; public final class Remove implements Command { @@ -69,18 +67,11 @@ public final class Remove implements Command { break; } - response.addReactionCallback(StringUtil.intToKeycapEmoji(trackNumber), new ReactionCallback() { - @Override - public final void run(final Member reactor, final long messageID) { - ReactionCallbackManager.unregisterMessage(messageID); - channel.getMessageById(messageID).queue(this::deleteMessage); - CommandManager.executeCommand(("remove " + trackNumber).split(" "), reactor, channel); - } - - private void deleteMessage(final Message message) { - message.delete().queue(); - } - }); + response.addReactionCallback(StringUtil.intToKeycapEmoji(trackNumber).getAliases().get(0), + (reactor, message) -> { + ReactionCallbackManager.unregisterMessage(message, true); + CommandManager.executeCommand(("remove " + trackNumber).split(" "), reactor, channel); + }); } response.setReactionCallbackTarget(executor); diff --git a/src/main/java/dev/logal/logalbot/events/GuildMessageReactionAdd.java b/src/main/java/dev/logal/logalbot/events/GuildMessageReactionAdd.java index 804521e..6e133be 100644 --- a/src/main/java/dev/logal/logalbot/events/GuildMessageReactionAdd.java +++ b/src/main/java/dev/logal/logalbot/events/GuildMessageReactionAdd.java @@ -25,7 +25,7 @@ public final class GuildMessageReactionAdd extends ListenerAdapter { Checks.notNull(event, "Event"); if (!event.getUser().equals(event.getJDA().getSelfUser())) { - ReactionCallbackManager.executeCallback(event.getMessageIdLong(), event.getMember(), + ReactionCallbackManager.executeCallback(event.getMessageIdLong(), event.getChannel(), event.getMember(), event.getReactionEmote().getName()); } } diff --git a/src/main/java/dev/logal/logalbot/tasks/MessageDeleteTask.java b/src/main/java/dev/logal/logalbot/tasks/MessageDeleteTask.java index 7c8b604..79485ed 100644 --- a/src/main/java/dev/logal/logalbot/tasks/MessageDeleteTask.java +++ b/src/main/java/dev/logal/logalbot/tasks/MessageDeleteTask.java @@ -29,7 +29,7 @@ public final class MessageDeleteTask implements Runnable { @Override public final void run() { - ReactionCallbackManager.unregisterMessage(messageToDelete.getIdLong()); + ReactionCallbackManager.unregisterMessage(messageToDelete, true); messageToDelete.delete().queue(); } } \ No newline at end of file diff --git a/src/main/java/dev/logal/logalbot/tasks/ReactionCallbackExpireTask.java b/src/main/java/dev/logal/logalbot/tasks/ReactionCallbackExpireTask.java new file mode 100644 index 0000000..86372fb --- /dev/null +++ b/src/main/java/dev/logal/logalbot/tasks/ReactionCallbackExpireTask.java @@ -0,0 +1,34 @@ +package dev.logal.logalbot.tasks; + +// Copyright 2019 Logan Fick + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// https://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import dev.logal.logalbot.utils.ReactionCallbackManager; +import net.dv8tion.jda.core.entities.Message; +import net.dv8tion.jda.core.utils.Checks; + +public final class ReactionCallbackExpireTask implements Runnable { + private final Message messageToExpire; + + public ReactionCallbackExpireTask(final Message message) { + Checks.notNull(message, "Message"); + + this.messageToExpire = message; + } + + @Override + public final void run() { + ReactionCallbackManager.unregisterMessage(messageToExpire, false); + } +} \ No newline at end of file diff --git a/src/main/java/dev/logal/logalbot/utils/ReactionCallbackManager.java b/src/main/java/dev/logal/logalbot/utils/ReactionCallbackManager.java index 6be85ca..64586a1 100644 --- a/src/main/java/dev/logal/logalbot/utils/ReactionCallbackManager.java +++ b/src/main/java/dev/logal/logalbot/utils/ReactionCallbackManager.java @@ -22,6 +22,7 @@ import com.vdurmont.emoji.EmojiManager; import dev.logal.logalbot.commands.ReactionCallback; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Message; +import net.dv8tion.jda.core.entities.TextChannel; import net.dv8tion.jda.core.entities.User; import net.dv8tion.jda.core.utils.Checks; @@ -44,37 +45,47 @@ public final class ReactionCallbackManager { } callbackDictionary.get(message.getIdLong()).put(emoji, callback); + message.addReaction(emoji.getUnicode()).queue(); } - public static final void setCallbackTarget(final User user, final Message message) { + public static final void setCallbackTarget(final Message message, final User user) { Checks.notNull(user, "User"); Checks.notNull(message, "Messsage"); targetDictionary.put(message.getIdLong(), user.getIdLong()); } - public static final void unregisterMessage(final long messageID) { - Checks.notNull(messageID, "Message ID"); + public static final void unregisterMessage(final Message message, final boolean delete) { + Checks.notNull(message, "Message"); - callbackDictionary.remove(messageID); - targetDictionary.remove(messageID); + callbackDictionary.remove(message.getIdLong()); + targetDictionary.remove(message.getIdLong()); + + if (delete) { + message.delete().queue(); + } else { + message.addReaction(EmojiManager.getForAlias("no_entry").getUnicode()).queue(); + } } - public static final void executeCallback(final long messageID, final Member reactor, final String emoji) { + public static final void executeCallback(final long messageID, final TextChannel channel, final Member reactor, + final String emoji) { Checks.notNull(messageID, "Message ID"); Checks.notNull(reactor, "Reactor"); Checks.notEmpty(emoji, "Emoji"); - if (callbackDictionary.containsKey(messageID)) { - if (targetDictionary.containsKey(messageID) - && !targetDictionary.get(messageID).equals(reactor.getUser().getIdLong())) { - return; - } + channel.getMessageById(messageID).queue((message) -> { + if (callbackDictionary.containsKey(messageID)) { + if (targetDictionary.containsKey(messageID) + && !targetDictionary.get(messageID).equals(reactor.getUser().getIdLong())) { + return; + } - final Emoji parsedEmoji = EmojiManager.getByUnicode(emoji); - if (callbackDictionary.get(messageID).containsKey(parsedEmoji)) { - callbackDictionary.get(messageID).get(parsedEmoji).run(reactor, messageID); + final Emoji parsedEmoji = EmojiManager.getByUnicode(emoji); + if (callbackDictionary.get(messageID).containsKey(parsedEmoji)) { + callbackDictionary.get(messageID).get(parsedEmoji).run(reactor, message); + } } - } + }); } } \ No newline at end of file diff --git a/src/main/java/dev/logal/logalbot/utils/TrackUtil.java b/src/main/java/dev/logal/logalbot/utils/TrackUtil.java index bdcdfb7..bcb0470 100644 --- a/src/main/java/dev/logal/logalbot/utils/TrackUtil.java +++ b/src/main/java/dev/logal/logalbot/utils/TrackUtil.java @@ -107,4 +107,12 @@ public final class TrackUtil { builder.setTitle("**" + tracks.size() + " Total Tracks - Page " + (page + 1) + "/" + pages + "**"); return builder.build(); } + + public static final boolean doesGreaterPageExist(final List tracks, int page) { + Checks.notNull(tracks, "Tracks"); + Checks.notNull(page, "Page"); + + final int pages = (int) Math.ceil(tracks.size() / 10d); + return (page < pages); + } } \ No newline at end of file