Skip to content

Commit 0c0fbad

Browse files
authored
Merge pull request #541 from danthe1st/suggestion-filter
use message filter for suggestions
2 parents d21836d + 5d13417 commit 0c0fbad

File tree

6 files changed

+53
-38
lines changed

6 files changed

+53
-38
lines changed

src/main/java/net/discordjug/javabot/listener/filter/BlacklistedMessageAttachmentFilter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,9 @@ public MessageModificationStatus processMessage(MessageContent content) {
3838
return MessageModificationStatus.NOT_MODIFIED;
3939
}
4040
}
41+
42+
@Override
43+
public int getOrder() {
44+
return -10;//should run earlier than normal because it is automod-related but other automod filters are more important
45+
}
4146
}

src/main/java/net/discordjug/javabot/listener/filter/MessageFilter.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package net.discordjug.javabot.listener.filter;
22

3+
import org.springframework.core.Ordered;
4+
35
/**
46
* This interface is implemented by all message filters.
57
*
68
* The {@link MessageContent} is processed by every class implementing {@link MessageFilter}
79
* unless one of the filters returns {@link MessageModificationStatus#STOP_PROCESSING} which stops further filters from executing.
810
*/
9-
public interface MessageFilter {
11+
public interface MessageFilter extends Ordered {
1012

1113
/**
1214
* When a message is received, it is processed by the registered filters.
@@ -20,4 +22,15 @@ public interface MessageFilter {
2022
*/
2123
MessageModificationStatus processMessage(MessageContent content);
2224

25+
/**
26+
* {@inheritDoc}
27+
*
28+
* <p>
29+
* By default, message filters have order 0. A higher order means they are executed afterwards while a lower order results in them being executed before.
30+
* </p>
31+
*/
32+
@Override
33+
default int getOrder() {
34+
return 0;
35+
}
2336
}

src/main/java/net/discordjug/javabot/listener/filter/MessageFilterHandler.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.discordjug.javabot.listener.filter;
22

33
import lombok.RequiredArgsConstructor;
4-
import net.discordjug.javabot.data.config.BotConfig;
54
import net.discordjug.javabot.systems.moderation.AutoMod;
65
import net.discordjug.javabot.util.ExceptionLogger;
76
import net.discordjug.javabot.util.WebhookUtil;
@@ -29,7 +28,6 @@ public class MessageFilterHandler extends ListenerAdapter {
2928

3029
private final List<MessageFilter> filters;
3130
private final AutoMod autoMod;
32-
private final BotConfig botConfig;
3331

3432
@Override
3533
public void onMessageReceived(@NotNull MessageReceivedEvent event) {
@@ -90,11 +88,6 @@ private boolean shouldRunFilters(@NotNull MessageReceivedEvent event) {
9088
autoMod.hasAdvertisingLink(event.getMessage())) {
9189
return false;
9290
}
93-
if (event.getChannel().getIdLong() == botConfig.get(event.getGuild())
94-
.getModerationConfig()
95-
.getSuggestionChannelId()) {
96-
return false;
97-
}
9891
return true;
9992
}
10093

src/main/java/net/discordjug/javabot/listener/filter/MessageRuleFilter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,9 @@ private String computeSHA(Attachment attachment) {
123123
return "";
124124
}
125125
}
126+
127+
@Override
128+
public int getOrder() {
129+
return -100;//automod should run early
130+
}
126131
}

src/main/java/net/discordjug/javabot/listener/SuggestionListener.java renamed to src/main/java/net/discordjug/javabot/listener/filter/SuggestionFilter.java

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,50 @@
1-
package net.discordjug.javabot.listener;
1+
package net.discordjug.javabot.listener.filter;
22

33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import net.discordjug.javabot.data.config.BotConfig;
66
import net.discordjug.javabot.data.config.SystemsConfig;
7-
import net.discordjug.javabot.systems.moderation.AutoMod;
87
import net.discordjug.javabot.util.MessageActionUtils;
98
import net.discordjug.javabot.util.Responses;
109
import net.dv8tion.jda.api.EmbedBuilder;
1110
import net.dv8tion.jda.api.entities.*;
1211
import net.dv8tion.jda.api.entities.channel.ChannelType;
1312
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
14-
import net.dv8tion.jda.api.hooks.ListenerAdapter;
1513
import net.dv8tion.jda.api.requests.RestAction;
1614

1715
import org.jetbrains.annotations.NotNull;
16+
import org.springframework.stereotype.Component;
1817

1918
import java.time.Instant;
2019

2120
/**
22-
* Listens for {@link MessageReceivedEvent}s in the
23-
* {@link net.discordjug.javabot.data.config.guild.ModerationConfig#getSuggestionChannel()} channel.
21+
* When a message is created in the {@link net.discordjug.javabot.data.config.guild.ModerationConfig#getSuggestionChannel()} channel, it is decorated as a suggestion.
2422
*/
23+
@Component
2524
@Slf4j
2625
@RequiredArgsConstructor
27-
public class SuggestionListener extends ListenerAdapter {
28-
private final AutoMod autoMod;
26+
public class SuggestionFilter implements MessageFilter {
2927
private final BotConfig botConfig;
30-
28+
3129
@Override
32-
public void onMessageReceived(@NotNull MessageReceivedEvent event) {
33-
if (!canCreateSuggestion(event)) return;
34-
if (autoMod.hasSuspiciousLink(event.getMessage()) || autoMod.hasAdvertisingLink(event.getMessage())) {
35-
event.getMessage().delete().queue();
36-
return;
37-
}
38-
MessageEmbed embed = buildSuggestionEmbed(event.getMessage());
39-
MessageActionUtils.addAttachmentsAndSend(event.getMessage(), event.getChannel().sendMessageEmbeds(embed)).thenAccept(message -> {
30+
public MessageModificationStatus processMessage(MessageContent content) {
31+
if (!canCreateSuggestion(content.event())) return MessageModificationStatus.NOT_MODIFIED;
32+
MessageEmbed embed = buildSuggestionEmbed(content.messageText().toString(), content.event().getMember());
33+
MessageActionUtils.addAttachmentsAndSend(content.attachments(), content.event().getChannel().sendMessageEmbeds(embed))
34+
.thenAccept(message -> {
4035
addReactions(message).queue();
41-
event.getMessage().delete().queue();
42-
message.createThreadChannel(String.format("%s — Suggestion", event.getAuthor().getName()))
43-
.flatMap(thread -> thread.addThreadMember(event.getAuthor()))
36+
content.event().getMessage().delete().queue();
37+
message.createThreadChannel(String.format("%s — Suggestion", content.event().getAuthor().getName()))
38+
.flatMap(thread -> thread.addThreadMember(content.event().getAuthor()))
4439
.queue();
4540
}
4641
).exceptionally(e -> {
4742
log.error("Could not send Submission Embed", e);
4843
return null;
4944
});
45+
return MessageModificationStatus.STOP_PROCESSING;
5046
}
51-
47+
5248
/**
5349
* Decides whether the message author is eligible to create new suggestions.
5450
*
@@ -76,19 +72,21 @@ private RestAction<?> addReactions(Message message) {
7672
);
7773
}
7874

79-
80-
81-
private MessageEmbed buildSuggestionEmbed(Message message) {
82-
Member member = message.getMember();
75+
private MessageEmbed buildSuggestionEmbed(String messageContent, Member member) {
8376
// Note: member will never be null in practice. This is to satisfy code analysis tools.
8477
if (member == null) throw new IllegalStateException("Member was null when building suggestion embed.");
8578
return new EmbedBuilder()
8679
.setTitle("Suggestion")
8780
.setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl())
8881
.setColor(Responses.Type.DEFAULT.getColor())
8982
.setTimestamp(Instant.now())
90-
.setDescription(message.getContentRaw())
91-
.setFooter(message.getAuthor().getId())
83+
.setDescription(messageContent)
84+
.setFooter(member.getId())
9285
.build();
9386
}
87+
88+
@Override
89+
public int getOrder() {
90+
return LOWEST_PRECEDENCE;
91+
}
9492
}

src/main/java/net/discordjug/javabot/util/MessageActionUtils.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.dv8tion.jda.api.components.actionrow.ActionRow;
1818
import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent;
1919
import net.dv8tion.jda.api.entities.Message;
20+
import net.dv8tion.jda.api.entities.Message.Attachment;
2021
import net.dv8tion.jda.api.entities.MessageEmbed;
2122

2223
/**
@@ -61,15 +62,15 @@ public static List<MessageTopLevelComponent> disableActionRows(List<MessageTopLe
6162
}
6263

6364
/**
64-
* Adds all Attachments from the initial message to the new message action and sends the message.
65+
* Adds attachments to a new message action and sends the message.
6566
*
66-
* @param message The initial {@link Message} object.
67+
* @param attachments The attachments to add.
6768
* @param action The new {@link net.dv8tion.jda.api.requests.restaction.MessageCreateAction}.
6869
* @return A {@link CompletableFuture} with the message that is being sent.
6970
*/
70-
public static CompletableFuture<Message> addAttachmentsAndSend(Message message, MessageCreateAction action) {
71+
public static CompletableFuture<Message> addAttachmentsAndSend(List<Attachment> attachments, MessageCreateAction action) {
7172
List<CompletableFuture<?>> attachmentFutures = new ArrayList<>();
72-
for (Message.Attachment attachment : message.getAttachments()) {
73+
for (Message.Attachment attachment : attachments) {
7374
attachmentFutures.add(
7475
attachment.getProxy().download()
7576
.thenApply(is -> action.addFiles(FileUpload.fromData(is, attachment.getFileName())))

0 commit comments

Comments
 (0)