|
3 | 3 | import lombok.extern.slf4j.Slf4j; |
4 | 4 | import net.dv8tion.jda.api.EmbedBuilder; |
5 | 5 | import net.dv8tion.jda.api.entities.*; |
6 | | -import net.dv8tion.jda.api.events.message.MessageDeleteEvent; |
7 | | -import net.dv8tion.jda.api.events.message.MessageReceivedEvent; |
8 | | -import net.dv8tion.jda.api.events.message.MessageUpdateEvent; |
9 | | -import net.dv8tion.jda.api.hooks.ListenerAdapter; |
10 | 6 | import net.dv8tion.jda.api.interactions.components.buttons.Button; |
11 | 7 | import net.dv8tion.jda.api.requests.restaction.MessageAction; |
12 | 8 | import net.javadiscord.javabot.Bot; |
|
17 | 13 | import net.javadiscord.javabot.systems.commands.IdCalculatorCommand; |
18 | 14 | import net.javadiscord.javabot.util.GuildUtils; |
19 | 15 | import net.javadiscord.javabot.util.TimeUtils; |
20 | | -import org.jetbrains.annotations.NotNull; |
21 | 16 |
|
22 | 17 | import java.io.ByteArrayInputStream; |
23 | 18 | import java.io.InputStream; |
|
29 | 24 | import java.time.format.DateTimeFormatter; |
30 | 25 | import java.util.ArrayList; |
31 | 26 | import java.util.List; |
32 | | -import java.util.Optional; |
33 | 27 |
|
34 | 28 | /** |
35 | 29 | * Listens for Incoming Messages and stores them in the Message Cache. |
36 | 30 | */ |
37 | 31 | @Slf4j |
38 | | -public class MessageCache extends ListenerAdapter { |
39 | | - List<CachedMessage> cache = new ArrayList<>(); |
| 32 | +public class MessageCache { |
| 33 | + /** |
| 34 | + * A memory-cache (list) of sent Messages, wrapped to a {@link CachedMessage} object. |
| 35 | + */ |
| 36 | + public List<CachedMessage> cache = new ArrayList<>(); |
40 | 37 | /** |
41 | 38 | * Amount of messages since the last synchronization. |
42 | 39 | * <p> |
@@ -68,85 +65,60 @@ public void synchronize() { |
68 | 65 | }); |
69 | 66 | } |
70 | 67 |
|
71 | | - @Override |
72 | | - public void onMessageReceived(@NotNull MessageReceivedEvent event) { |
73 | | - if (this.ignoreMessageCache(event.getMessage())) return; |
74 | | - MessageCacheConfig config = Bot.config.get(event.getGuild()).getMessageCache(); |
| 68 | + /** |
| 69 | + * Caches a single {@link Message} object. |
| 70 | + * |
| 71 | + * @param message The message to cache. |
| 72 | + */ |
| 73 | + public void cache(Message message) { |
| 74 | + MessageCacheConfig config = Bot.config.get(message.getGuild()).getMessageCache(); |
75 | 75 | if (cache.size() + 1 > config.getMaxCachedMessages()) { |
76 | 76 | cache.remove(0); |
77 | 77 | } |
78 | 78 | if (messageCount >= config.getMessageSynchronizationInterval()) { |
79 | 79 | synchronize(); |
80 | 80 | } |
81 | 81 | messageCount++; |
82 | | - cache.add(CachedMessage.of(event.getMessage())); |
| 82 | + cache.add(CachedMessage.of(message)); |
83 | 83 | } |
84 | 84 |
|
85 | | - @Override |
86 | | - public void onMessageUpdate(@NotNull MessageUpdateEvent event) { |
87 | | - if (this.ignoreMessageCache(event.getMessage())) return; |
88 | | - Optional<CachedMessage> optional = cache.stream().filter(m -> m.getMessageId() == event.getMessageIdLong()).findFirst(); |
89 | | - CachedMessage before; |
90 | | - if (optional.isPresent()) { |
91 | | - before = optional.get(); |
92 | | - cache.set(cache.indexOf(before), CachedMessage.of(event.getMessage())); |
93 | | - } else { |
94 | | - before = new CachedMessage(); |
95 | | - before.setMessageId(event.getMessageIdLong()); |
96 | | - before.setMessageContent("[unknown content]"); |
97 | | - cache.add(CachedMessage.of(event.getMessage())); |
98 | | - } |
99 | | - if (event.getMessage().getContentRaw().trim().equals(before.getMessageContent())) return; |
100 | | - MessageAction action = GuildUtils.getCacheLogChannel(event.getGuild()) |
101 | | - .sendMessageEmbeds(this.buildMessageEditEmbed(event.getGuild(), event.getAuthor(), event.getChannel(), before, event.getMessage())) |
102 | | - .setActionRow(Button.link(event.getMessage().getJumpUrl(), "Jump to Message")); |
103 | | - if (before.getMessageContent().length() > MessageEmbed.VALUE_MAX_LENGTH || event.getMessage().getContentRaw().length() > MessageEmbed.VALUE_MAX_LENGTH) { |
104 | | - action.addFile(this.buildEditedMessageFile(event.getAuthor(), before, event.getMessage()), before.getMessageId() + ".txt"); |
| 85 | + /** |
| 86 | + * Sends the updated message's content to the {@link MessageCacheConfig#getMessageCacheLogChannel()}. |
| 87 | + * |
| 88 | + * @param updated The new {@link Message}. |
| 89 | + * @param before The {@link CachedMessage}. |
| 90 | + */ |
| 91 | + public void sendUpdatedMessageToLog(Message updated, CachedMessage before) { |
| 92 | + if (updated.getContentRaw().trim().equals(before.getMessageContent())) return; |
| 93 | + MessageAction action = GuildUtils.getCacheLogChannel(updated.getGuild()) |
| 94 | + .sendMessageEmbeds(this.buildMessageEditEmbed(updated.getGuild(), updated.getAuthor(), updated.getChannel(), before, updated)) |
| 95 | + .setActionRow(Button.link(updated.getJumpUrl(), "Jump to Message")); |
| 96 | + if (before.getMessageContent().length() > MessageEmbed.VALUE_MAX_LENGTH || updated.getContentRaw().length() > MessageEmbed.VALUE_MAX_LENGTH) { |
| 97 | + action.addFile(this.buildEditedMessageFile(updated.getAuthor(), before, updated), before.getMessageId() + ".txt"); |
105 | 98 | } |
106 | 99 | action.queue(); |
107 | 100 | } |
108 | 101 |
|
109 | | - @Override |
110 | | - public void onMessageDelete(@NotNull MessageDeleteEvent event) { |
111 | | - Optional<CachedMessage> optional = cache.stream().filter(m -> m.getMessageId() == event.getMessageIdLong()).findFirst(); |
112 | | - if (optional.isPresent()) { |
113 | | - CachedMessage message = optional.get(); |
114 | | - event.getJDA().retrieveUserById(message.getAuthorId()).queue(author -> { |
115 | | - MessageAction action = GuildUtils.getCacheLogChannel(event.getGuild()) |
116 | | - .sendMessageEmbeds(this.buildMessageDeleteEmbed(event.getGuild(), author, event.getChannel(), message)); |
117 | | - if (message.getMessageContent().length() > MessageEmbed.VALUE_MAX_LENGTH) { |
118 | | - action.addFile(this.buildDeletedMessageFile(author, message), message.getMessageId() + ".txt"); |
119 | | - } |
120 | | - action.queue(); |
121 | | - }); |
122 | | - cache.remove(message); |
123 | | - } else { |
124 | | - GuildUtils.getCacheLogChannel(event.getGuild()).sendMessageEmbeds(buildMessageNotCachedEmbed(event.getGuild(), event.getChannel(), event.getMessageIdLong())).queue(); |
125 | | - } |
126 | | - } |
127 | | - |
128 | 102 | /** |
129 | | - * Checks whether the given message should be ignored by the cache. |
| 103 | + * Sends the deleted message's content to the {@link MessageCacheConfig#getMessageCacheLogChannel()}. |
130 | 104 | * |
131 | | - * This is done with the following criteria: |
132 | | - * <ol> |
133 | | - * <li>Message author is a bot</li> |
134 | | - * <li>Message author is a system account</li> |
135 | | - * <li>Message author is part of the excluded users</li> |
136 | | - * <li>Channel is excluded from the cache</li> |
137 | | - * </ol> |
138 | | - * |
139 | | - * @param message The message to check |
140 | | - * @return true if any of the criteria above apply |
| 105 | + * @param guild The message's {@link Guild}. |
| 106 | + * @param channel The message's {@link MessageChannel}. |
| 107 | + * @param message The {@link CachedMessage}. |
141 | 108 | */ |
142 | | - private boolean ignoreMessageCache(Message message) { |
143 | | - MessageCacheConfig config = Bot.config.get(message.getGuild()).getMessageCache(); |
144 | | - return message.getAuthor().isBot() || message.getAuthor().isSystem() || |
145 | | - config.getExcludedUsers().contains(message.getAuthor().getIdLong()) || |
146 | | - config.getExcludedChannels().contains(message.getChannel().getIdLong()); |
| 109 | + public void sendDeletedMessageToLog(Guild guild, MessageChannel channel, CachedMessage message) { |
| 110 | + guild.getJDA().retrieveUserById(message.getAuthorId()).queue(author -> { |
| 111 | + MessageAction action = GuildUtils.getCacheLogChannel(guild) |
| 112 | + .sendMessageEmbeds(this.buildMessageDeleteEmbed(guild, author, channel, message)); |
| 113 | + if (message.getMessageContent().length() > MessageEmbed.VALUE_MAX_LENGTH) { |
| 114 | + action.addFile(this.buildDeletedMessageFile(author, message), message.getMessageId() + ".txt"); |
| 115 | + } |
| 116 | + action.queue(); |
| 117 | + }); |
| 118 | + cache.remove(message); |
147 | 119 | } |
148 | 120 |
|
149 | | - private EmbedBuilder buildMessageCacheEmbed(MessageChannel channel, CachedMessage before){ |
| 121 | + private EmbedBuilder buildMessageCacheEmbed(MessageChannel channel, CachedMessage before) { |
150 | 122 | long epoch = IdCalculatorCommand.getTimestampFromId(before.getMessageId()) / 1000; |
151 | 123 | return new EmbedBuilder() |
152 | 124 | .addField("Channel", channel.getAsMention(), true) |
@@ -182,7 +154,15 @@ private MessageEmbed buildMessageDeleteEmbed(Guild guild, User author, MessageCh |
182 | 154 | .build(); |
183 | 155 | } |
184 | 156 |
|
185 | | - private MessageEmbed buildMessageNotCachedEmbed(Guild guild, MessageChannel channel, long messageId) { |
| 157 | + /** |
| 158 | + * Builds a {@link MessageEmbed} object that is used for messages, that were deleted but not cached. |
| 159 | + * |
| 160 | + * @param guild The message's guild. |
| 161 | + * @param channel The message's channel. |
| 162 | + * @param messageId The message's id. |
| 163 | + * @return The fully-built {@link MessageEmbed} object. |
| 164 | + */ |
| 165 | + public MessageEmbed buildMessageNotCachedEmbed(Guild guild, MessageChannel channel, long messageId) { |
186 | 166 | CachedMessage message = new CachedMessage(); |
187 | 167 | message.setMessageId(messageId); |
188 | 168 | return buildMessageCacheEmbed(channel, message) |
|
0 commit comments