Added reactions for switching pages in the queue.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user