Skip to content

Commit fa66cff

Browse files
committed
Cache author username and avatar to avoid needing the user to be in the guild
1 parent 266354d commit fa66cff

File tree

2 files changed

+69
-71
lines changed

2 files changed

+69
-71
lines changed

src/core/java/com/mcmoddev/mmdbot/core/util/jda/caching/MessageData.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public interface MessageData {
3232
String getContent();
3333

3434
long getAuthorId();
35+
String getAuthorUsername();
36+
String getAuthorAvatar();
37+
3538
long getChannelId();
3639
List<String> getAttachments();
3740
@Nullable
@@ -48,6 +51,8 @@ static MessageData from(Message message) {
4851
.stream()
4952
.map(Message.Attachment::getUrl)
5053
.toList();
54+
final String authorName = message.getAuthor().getName();
55+
final String authorAvatar = message.getAuthor().getAvatarUrl();
5156
final InteractionData interactionData = message.getInteraction() == null ? null :
5257
new InteractionData() {
5358
final long authorId = message.getInteraction().getUser().getIdLong();
@@ -91,6 +96,16 @@ public List<String> getAttachments() {
9196
public @Nullable InteractionData getInteraction() {
9297
return interactionData;
9398
}
99+
100+
@Override
101+
public String getAuthorAvatar() {
102+
return authorAvatar;
103+
}
104+
105+
@Override
106+
public String getAuthorUsername() {
107+
return authorName;
108+
}
94109
};
95110
}
96111

src/listener/java/com/mcmoddev/mmdbot/thelistener/events/MessageEvents.java

Lines changed: 54 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,16 @@
2121
package com.mcmoddev.mmdbot.thelistener.events;
2222

2323
import com.mcmoddev.mmdbot.core.event.moderation.ScamLinkEvent;
24-
import com.mcmoddev.mmdbot.core.util.MessageUtilities;
2524
import com.mcmoddev.mmdbot.core.util.Utils;
2625
import com.mcmoddev.mmdbot.core.util.jda.caching.MessageData;
2726
import com.mcmoddev.mmdbot.thelistener.TheListener;
2827
import com.mcmoddev.mmdbot.thelistener.util.LoggingType;
2928
import io.github.matyrobbrt.eventdispatcher.SubscribeEvent;
3029
import net.dv8tion.jda.api.EmbedBuilder;
3130
import net.dv8tion.jda.api.entities.Message;
31+
import net.dv8tion.jda.api.entities.MessageChannel;
3232
import net.dv8tion.jda.api.entities.MessageEmbed;
33-
import net.dv8tion.jda.api.exceptions.ErrorHandler;
3433
import net.dv8tion.jda.api.hooks.ListenerAdapter;
35-
import net.dv8tion.jda.api.requests.ErrorResponse;
3634
import org.jetbrains.annotations.NotNull;
3735

3836
import java.awt.Color;
@@ -42,7 +40,6 @@ public final class MessageEvents extends ListenerAdapter {
4240

4341
public static final MessageEvents INSTANCE = new MessageEvents();
4442

45-
public static final ErrorHandler ERROR_HANDLER = new ErrorHandler().ignore(ErrorResponse.UNKNOWN_MEMBER);
4643
public static final java.awt.Color GRAY_CHATEAOU = new java.awt.Color(0x979C9F);
4744
public static final java.awt.Color VIVID_VIOLET = new java.awt.Color(0x71368A);
4845

@@ -53,83 +50,69 @@ public void onMessageDelete(final net.dv8tion.jda.api.events.message.MessageDele
5350
if (!event.isFromGuild() || (data.getContent().isBlank() && data.getAttachments().isEmpty())) return;
5451
final var loggingChannels = LoggingType.MESSAGE_EVENTS.getChannels(event.getGuild().getIdLong());
5552
if (loggingChannels.stream().anyMatch(v -> v.test(event.getChannel()))) return; // Don't log in event channels
56-
event.getGuild().retrieveMemberById(data.getAuthorId())
57-
.map(author -> {
58-
final var msgSplit = data.getContent().split(" ");
59-
if (msgSplit.length == 1) {
60-
final var matcher = Message.JUMP_URL_PATTERN.matcher(msgSplit[0]);
61-
if (matcher.find()) {
62-
return null;
63-
}
64-
}
65-
final var embedBuilder = new EmbedBuilder();
66-
embedBuilder.setColor(GRAY_CHATEAOU)
67-
.setDescription("""
53+
final var msgSplit = data.getContent().split(" ");
54+
if (msgSplit.length == 1) {
55+
final var matcher = Message.JUMP_URL_PATTERN.matcher(msgSplit[0]);
56+
if (matcher.find()) {
57+
return;
58+
}
59+
}
60+
final var embedBuilder = new EmbedBuilder();
61+
embedBuilder.setColor(GRAY_CHATEAOU)
62+
.setDescription("""
6863
**A message sent by <@%s> in <#%s> has been deleted!**
6964
%s"""
70-
.formatted(data.getAuthorId(), data.getChannelId(), Utils.truncate(data.getContent(), MessageEmbed.DESCRIPTION_MAX_LENGTH - 30)));
71-
embedBuilder.setAuthor(author.getEffectiveName(), null, author.getEffectiveAvatarUrl());
72-
embedBuilder.setTimestamp(Instant.now())
73-
.setFooter("Author: %s | Message ID: %s".formatted(data.getAuthorId(), data.getChannelId()), null);
74-
final var interaction = data.getInteraction();
75-
if (interaction != null) {
76-
embedBuilder.addField("Interaction Author: ", "<@%s> (%s)".formatted(interaction.getAuthorId(), interaction.getAuthorId()), true);
77-
}
78-
if (!data.getAttachments().isEmpty()) {
79-
embedBuilder.setImage(data.getAttachments().get(0));
80-
}
81-
return embedBuilder.build();
82-
})
83-
.queue(embed -> {
84-
if (embed == null) return;
85-
loggingChannels
86-
.forEach(id -> {
87-
final var ch = id.resolve(idL -> event.getJDA().getChannelById(net.dv8tion.jda.api.entities.MessageChannel.class, idL));
88-
if (ch != null) {
89-
ch.sendMessageEmbeds(embed).queue();
90-
}
91-
});
92-
}, ERROR_HANDLER);
65+
.formatted(data.getAuthorId(), data.getChannelId(), Utils.truncate(data.getContent(), MessageEmbed.DESCRIPTION_MAX_LENGTH - 30)));
66+
embedBuilder.setAuthor(data.getAuthorUsername(), null, data.getAuthorAvatar());
67+
embedBuilder.setTimestamp(Instant.now())
68+
.setFooter("Author: %s | Message ID: %s".formatted(data.getAuthorId(), data.getChannelId()), null);
69+
final var interaction = data.getInteraction();
70+
if (interaction != null) {
71+
embedBuilder.addField("Interaction Author: ", "<@%s> (%s)".formatted(interaction.getAuthorId(), interaction.getAuthorId()), true);
72+
}
73+
if (!data.getAttachments().isEmpty()) {
74+
embedBuilder.setImage(data.getAttachments().get(0));
75+
}
76+
final var embed = embedBuilder.build();
77+
loggingChannels.forEach(id -> {
78+
final var ch = id.resolve(idL -> event.getJDA().getChannelById(MessageChannel.class, idL));
79+
if (ch != null)
80+
ch.sendMessageEmbeds(embed).queue();
81+
});
9382
}
9483

9584
public void onMessageUpdate(final net.dv8tion.jda.api.events.message.MessageUpdateEvent event, MessageData data) {
9685
final var newMessage = event.getMessage();
9786
if (!event.isFromGuild() || (newMessage.getContentRaw().isBlank() && newMessage.getAttachments().isEmpty())) return;
9887
final var loggingChannels = LoggingType.MESSAGE_EVENTS.getChannels(event.getGuild().getIdLong());
9988
if (loggingChannels.stream().anyMatch(v -> v.test(event.getChannel()))) return; // Don't log in event channels
100-
event.getGuild().retrieveMemberById(data.getAuthorId())
101-
.map(author -> {
102-
if (newMessage.getContentRaw().equals(data.getContent())) {
103-
return null;
104-
}
105-
final var embedBuilder = new EmbedBuilder();
106-
embedBuilder.setColor(VIVID_VIOLET)
107-
.setDescription("**A message sent by <@%s> in <#%s> has been edited!** [Jump to message.](%s)"
108-
.formatted(author.getId(), event.getChannel().getId(), newMessage.getJumpUrl()));
109-
embedBuilder.setTimestamp(Instant.now());
110-
embedBuilder.addField("Before", data.getContent().isBlank() ? "*Blank*" : Utils.truncate(data.getContent(), MessageEmbed.VALUE_MAX_LENGTH), false)
111-
.addField("After", newMessage.getContentRaw().isBlank() ? "*Blank*" : Utils.truncate(newMessage.getContentRaw(), MessageEmbed.VALUE_MAX_LENGTH), false);
112-
embedBuilder.setAuthor(author.getEffectiveName(), null, author.getEffectiveAvatarUrl())
113-
.setFooter("Author ID: " + author.getId(), null);
114-
final var interaction = data.getInteraction();
115-
if (interaction != null) {
116-
embedBuilder.addField("Interaction Author: ", "<@%s> (%s)".formatted(interaction.getAuthorId(), interaction.getAuthorId()), true);
117-
}
118-
if (!data.getAttachments().isEmpty()) {
119-
embedBuilder.setImage(data.getAttachments().get(0));
89+
if (newMessage.getContentRaw().equals(data.getContent())) {
90+
return;
91+
}
92+
final var embedBuilder = new EmbedBuilder();
93+
embedBuilder.setColor(VIVID_VIOLET)
94+
.setDescription("**A message sent by <@%s> in <#%s> has been edited!** [Jump to message.](%s)"
95+
.formatted(data.getAuthorId(), event.getChannel().getId(), newMessage.getJumpUrl()));
96+
embedBuilder.setTimestamp(Instant.now());
97+
embedBuilder.addField("Before", data.getContent().isBlank() ? "*Blank*" : Utils.truncate(data.getContent(), MessageEmbed.VALUE_MAX_LENGTH), false)
98+
.addField("After", newMessage.getContentRaw().isBlank() ? "*Blank*" : Utils.truncate(newMessage.getContentRaw(), MessageEmbed.VALUE_MAX_LENGTH), false);
99+
embedBuilder.setAuthor(data.getAuthorUsername(), null, data.getAuthorAvatar())
100+
.setFooter("Author ID: " + data.getAuthorId(), null);
101+
final var interaction = data.getInteraction();
102+
if (interaction != null) {
103+
embedBuilder.addField("Interaction Author: ", "<@%s> (%s)".formatted(interaction.getAuthorId(), interaction.getAuthorId()), true);
104+
}
105+
if (!data.getAttachments().isEmpty()) {
106+
embedBuilder.setImage(data.getAttachments().get(0));
107+
}
108+
final var embed = embedBuilder.build();
109+
loggingChannels
110+
.forEach(id -> {
111+
final var ch = id.resolve(idL -> event.getJDA().getChannelById(net.dv8tion.jda.api.entities.MessageChannel.class, idL));
112+
if (ch != null) {
113+
ch.sendMessageEmbeds(embed).queue();
120114
}
121-
return embedBuilder.build();
122-
})
123-
.queue(embed -> {
124-
if (embed == null) return;
125-
loggingChannels
126-
.forEach(id -> {
127-
final var ch = id.resolve(idL -> event.getJDA().getChannelById(net.dv8tion.jda.api.entities.MessageChannel.class, idL));
128-
if (ch != null) {
129-
ch.sendMessageEmbeds(embed).queue();
130-
}
131-
});
132-
}, ERROR_HANDLER);
115+
});
133116
}
134117

135118
@Override

0 commit comments

Comments
 (0)