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 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<Emoji, ReactionCallback> 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);
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

@@ -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<AudioTrack> tracks, int page) {
Checks.notNull(tracks, "Tracks");
Checks.notNull(page, "Page");
final int pages = (int) Math.ceil(tracks.size() / 10d);
return (page < pages);
}
}