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 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user