0

Added reactions for switching pages in the queue.

This commit is contained in:
Logan Fick
2019-05-26 16:05:20 -04:00
parent 8dbe7f126f
commit 9bf5571faf
9 changed files with 117 additions and 40 deletions

View File

@@ -22,6 +22,7 @@ import com.vdurmont.emoji.Emoji;
import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiManager;
import dev.logal.logalbot.tasks.MessageDeleteTask; import dev.logal.logalbot.tasks.MessageDeleteTask;
import dev.logal.logalbot.tasks.ReactionCallbackExpireTask;
import dev.logal.logalbot.utils.ReactionCallbackManager; import dev.logal.logalbot.utils.ReactionCallbackManager;
import dev.logal.logalbot.utils.Scheduler; import dev.logal.logalbot.utils.Scheduler;
import net.dv8tion.jda.core.MessageBuilder; import net.dv8tion.jda.core.MessageBuilder;
@@ -38,8 +39,8 @@ public final class CommandResponse {
private MessageEmbed responseEmbed; private MessageEmbed responseEmbed;
private User callbacksTarget; private User callbacksTarget;
private long deletionDelay = 0; private long deletionDelay, expireDelay = 0;
private TimeUnit deletionDelayUnit; private TimeUnit deletionDelayUnit, expireDelayUnit;
public CommandResponse(final String emoji, final String response) { public CommandResponse(final String emoji, final String response) {
this.emoji = EmojiManager.getForAlias(emoji); this.emoji = EmojiManager.getForAlias(emoji);
@@ -57,8 +58,8 @@ public final class CommandResponse {
return this; return this;
} }
public final CommandResponse addReactionCallback(final Emoji emoji, final ReactionCallback callback) { public final CommandResponse addReactionCallback(final String emoji, final ReactionCallback callback) {
this.callbacks.put(emoji, callback); this.callbacks.put(EmojiManager.getForAlias(emoji), callback);
return this; return this;
} }
@@ -67,6 +68,12 @@ public final class CommandResponse {
return this; 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) { public final void sendResponse(final TextChannel channel) {
final MessageBuilder builder = new MessageBuilder(); final MessageBuilder builder = new MessageBuilder();
builder.setContent(this.emoji.getUnicode() + " " + this.response); builder.setContent(this.emoji.getUnicode() + " " + this.response);
@@ -81,12 +88,16 @@ public final class CommandResponse {
private final void handleResponseCreation(final Message message) { private final void handleResponseCreation(final Message message) {
if ((this.deletionDelay != 0) && (this.deletionDelayUnit != null)) { if ((this.deletionDelay != 0) && (this.deletionDelayUnit != null)) {
Scheduler.schedule(new MessageDeleteTask(message), this.deletionDelay, this.deletionDelayUnit); 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<Emoji, ReactionCallback> callback : callbacks.entrySet()) { for (final Map.Entry<Emoji, ReactionCallback> callback : callbacks.entrySet()) {
ReactionCallbackManager.registerCallback(message, callback.getKey(), callback.getValue()); 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);
} }
} }
} }

View File

@@ -15,7 +15,8 @@ package dev.logal.logalbot.commands;
// limitations under the License. // limitations under the License.
import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Message;
public interface ReactionCallback { public interface ReactionCallback {
void run(final Member reactor, final long messageID); void run(final Member reactor, final Message message);
} }

View File

@@ -14,11 +14,16 @@ package dev.logal.logalbot.commands.audio;
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import dev.logal.logalbot.commands.Command; import dev.logal.logalbot.commands.Command;
import dev.logal.logalbot.commands.CommandResponse; import dev.logal.logalbot.commands.CommandResponse;
import dev.logal.logalbot.utils.AudioUtil; 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 dev.logal.logalbot.utils.TrackUtil;
import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Member;
@@ -48,8 +53,24 @@ public final class Queue implements Command {
} }
} }
response.attachEmbed( final List<AudioTrack> queue = AudioUtil.getTrackScheduler(guild).getQueue();
TrackUtil.generatePaginatedTrackListInfoEmbed(AudioUtil.getTrackScheduler(guild).getQueue(), page)); 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; return response;
} }
} }

View File

@@ -21,7 +21,6 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import dev.logal.logalbot.audio.TrackScheduler; import dev.logal.logalbot.audio.TrackScheduler;
import dev.logal.logalbot.commands.Command; import dev.logal.logalbot.commands.Command;
import dev.logal.logalbot.commands.CommandResponse; import dev.logal.logalbot.commands.CommandResponse;
import dev.logal.logalbot.commands.ReactionCallback;
import dev.logal.logalbot.utils.AudioUtil; import dev.logal.logalbot.utils.AudioUtil;
import dev.logal.logalbot.utils.CommandManager; import dev.logal.logalbot.utils.CommandManager;
import dev.logal.logalbot.utils.ReactionCallbackManager; 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.Permission;
import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member; 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.TextChannel;
public final class Remove implements Command { public final class Remove implements Command {
@@ -69,17 +67,10 @@ public final class Remove implements Command {
break; break;
} }
response.addReactionCallback(StringUtil.intToKeycapEmoji(trackNumber), new ReactionCallback() { response.addReactionCallback(StringUtil.intToKeycapEmoji(trackNumber).getAliases().get(0),
@Override (reactor, message) -> {
public final void run(final Member reactor, final long messageID) { ReactionCallbackManager.unregisterMessage(message, true);
ReactionCallbackManager.unregisterMessage(messageID);
channel.getMessageById(messageID).queue(this::deleteMessage);
CommandManager.executeCommand(("remove " + trackNumber).split(" "), reactor, channel); CommandManager.executeCommand(("remove " + trackNumber).split(" "), reactor, channel);
}
private void deleteMessage(final Message message) {
message.delete().queue();
}
}); });
} }

View File

@@ -25,7 +25,7 @@ public final class GuildMessageReactionAdd extends ListenerAdapter {
Checks.notNull(event, "Event"); Checks.notNull(event, "Event");
if (!event.getUser().equals(event.getJDA().getSelfUser())) { if (!event.getUser().equals(event.getJDA().getSelfUser())) {
ReactionCallbackManager.executeCallback(event.getMessageIdLong(), event.getMember(), ReactionCallbackManager.executeCallback(event.getMessageIdLong(), event.getChannel(), event.getMember(),
event.getReactionEmote().getName()); event.getReactionEmote().getName());
} }
} }

View File

@@ -29,7 +29,7 @@ public final class MessageDeleteTask implements Runnable {
@Override @Override
public final void run() { public final void run() {
ReactionCallbackManager.unregisterMessage(messageToDelete.getIdLong()); ReactionCallbackManager.unregisterMessage(messageToDelete, true);
messageToDelete.delete().queue(); messageToDelete.delete().queue();
} }
} }

View File

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

View File

@@ -22,6 +22,7 @@ import com.vdurmont.emoji.EmojiManager;
import dev.logal.logalbot.commands.ReactionCallback; import dev.logal.logalbot.commands.ReactionCallback;
import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Message; 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.entities.User;
import net.dv8tion.jda.core.utils.Checks; import net.dv8tion.jda.core.utils.Checks;
@@ -44,27 +45,36 @@ public final class ReactionCallbackManager {
} }
callbackDictionary.get(message.getIdLong()).put(emoji, callback); 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(user, "User");
Checks.notNull(message, "Messsage"); Checks.notNull(message, "Messsage");
targetDictionary.put(message.getIdLong(), user.getIdLong()); targetDictionary.put(message.getIdLong(), user.getIdLong());
} }
public static final void unregisterMessage(final long messageID) { public static final void unregisterMessage(final Message message, final boolean delete) {
Checks.notNull(messageID, "Message ID"); Checks.notNull(message, "Message");
callbackDictionary.remove(messageID); callbackDictionary.remove(message.getIdLong());
targetDictionary.remove(messageID); 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(messageID, "Message ID");
Checks.notNull(reactor, "Reactor"); Checks.notNull(reactor, "Reactor");
Checks.notEmpty(emoji, "Emoji"); Checks.notEmpty(emoji, "Emoji");
channel.getMessageById(messageID).queue((message) -> {
if (callbackDictionary.containsKey(messageID)) { if (callbackDictionary.containsKey(messageID)) {
if (targetDictionary.containsKey(messageID) if (targetDictionary.containsKey(messageID)
&& !targetDictionary.get(messageID).equals(reactor.getUser().getIdLong())) { && !targetDictionary.get(messageID).equals(reactor.getUser().getIdLong())) {
@@ -73,8 +83,9 @@ public final class ReactionCallbackManager {
final Emoji parsedEmoji = EmojiManager.getByUnicode(emoji); final Emoji parsedEmoji = EmojiManager.getByUnicode(emoji);
if (callbackDictionary.get(messageID).containsKey(parsedEmoji)) { if (callbackDictionary.get(messageID).containsKey(parsedEmoji)) {
callbackDictionary.get(messageID).get(parsedEmoji).run(reactor, messageID); callbackDictionary.get(messageID).get(parsedEmoji).run(reactor, message);
} }
} }
});
} }
} }

View File

@@ -107,4 +107,12 @@ public final class TrackUtil {
builder.setTitle("**" + tracks.size() + " Total Tracks - Page " + (page + 1) + "/" + pages + "**"); builder.setTitle("**" + tracks.size() + " Total Tracks - Page " + (page + 1) + "/" + pages + "**");
return builder.build(); return builder.build();
} }
public static final boolean doesGreaterPageExist(final List<AudioTrack> tracks, int page) {
Checks.notNull(tracks, "Tracks");
Checks.notNull(page, "Page");
final int pages = (int) Math.ceil(tracks.size() / 10d);
return (page < pages);
}
} }