/
Command.java
108 lines (90 loc) · 3.34 KB
/
Command.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.almightyalpaca.discord.jdabutler.commands;
import com.almightyalpaca.discord.jdabutler.util.FixedSizeCache;
import gnu.trove.set.TLongSet;
import gnu.trove.set.hash.TLongHashSet;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import java.util.function.Consumer;
public abstract class Command
{
private static final FixedSizeCache<Long, TLongSet> MESSAGE_LINK_MAP = new FixedSizeCache<>(20);
static void removeResponses(TextChannel channel, long messageId, ReactionListenerRegistry reactionRegistry)
{
TLongSet responses = MESSAGE_LINK_MAP.get(messageId);
if(responses != null)
{
//if the responses had a reaction listener attached, clear it (cancel() is NOP if the id is not registered)
responses.forEach(msgId ->
{
reactionRegistry.cancel(msgId);
return true;
});
channel.purgeMessagesById(responses.toArray());
}
}
public static void linkMessage(long commandId, long responseId)
{
TLongSet set;
if(!MESSAGE_LINK_MAP.contains(commandId))
{
set = new TLongHashSet(2);
MESSAGE_LINK_MAP.add(commandId, set);
}
else
{
set = MESSAGE_LINK_MAP.get(commandId);
}
set.add(responseId);
}
public abstract void dispatch(User sender, TextChannel channel, Message message, String content, GuildMessageReceivedEvent event);
public String[] getAliases()
{
return new String[0];
}
public abstract String getHelp();
public abstract String getName();
protected void sendFailed(final Message message)
{
message.addReaction("❌").queue();
}
protected void sendSuccess(final Message message)
{
message.addReaction("✅").queue();
}
protected void reply(GuildMessageReceivedEvent event, String message)
{
reply(event, message, null);
}
protected void reply(GuildMessageReceivedEvent event, String message, Consumer<Message> successConsumer)
{
reply(event, new MessageBuilder(message).build(), successConsumer);
}
protected void reply(GuildMessageReceivedEvent event, MessageEmbed embed)
{
reply(event, embed, null);
}
protected void reply(GuildMessageReceivedEvent event, MessageEmbed embed, Consumer<Message> successConsumer)
{
reply(event, new MessageBuilder(embed).build(), successConsumer);
}
protected void reply(GuildMessageReceivedEvent event, Message message)
{
reply(event, message, null);
}
protected void reply(GuildMessageReceivedEvent event, Message message, Consumer<Message> successConsumer)
{
event.getChannel().sendMessage(message).queue(linkReply(event, successConsumer));
}
protected Consumer<Message> linkReply(GuildMessageReceivedEvent event, Consumer<Message> successConsumer) {
return msg ->
{
linkMessage(event.getMessageIdLong(), msg.getIdLong());
if (successConsumer != null)
successConsumer.accept(msg);
};
}
}