Skip to content

Commit a2b3d33

Browse files
committed
add message format handler and message attachment filter
1 parent fd5403c commit a2b3d33

File tree

12 files changed

+226
-137
lines changed

12 files changed

+226
-137
lines changed

src/main/java/net/discordjug/javabot/data/config/GuildConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
import java.lang.reflect.Field;
1919
import java.nio.file.Files;
2020
import java.nio.file.Path;
21+
import java.util.HashSet;
22+
import java.util.List;
2123
import java.util.Optional;
24+
import java.util.Set;
2225

2326
/**
2427
* A collection of guild-specific configuration items, each of which represents
@@ -37,6 +40,7 @@ public class GuildConfig {
3740
private StarboardConfig starboardConfig;
3841
private MessageCacheConfig messageCacheConfig;
3942
private ServerLockConfig serverLockConfig;
43+
private List<String> blacklistedMessageExtensions;
4044

4145
/**
4246
* Constructor that initializes all Config classes.
@@ -54,6 +58,7 @@ public GuildConfig(Guild guild, Path file) {
5458
this.starboardConfig = new StarboardConfig();
5559
this.messageCacheConfig = new MessageCacheConfig();
5660
this.serverLockConfig = new ServerLockConfig();
61+
this.blacklistedMessageExtensions = List.of("jar", "exe", "zip");
5762
this.setGuild(guild);
5863
}
5964

src/main/java/net/discordjug/javabot/listener/HugListener.java

Lines changed: 0 additions & 120 deletions
This file was deleted.

src/main/java/net/discordjug/javabot/listener/MessageLinkListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) {
4949
List.of(ActionRow.of(
5050
Button.link(m.getJumpUrl(), "Jump to Message"),
5151
Button.secondary(InteractionUtils.createDeleteInteractionId(event.getAuthor().getIdLong(), m.getAuthor().getIdLong()), "\uD83D\uDDD1️"))),
52-
null));
52+
null, null));
5353
}, e -> ExceptionLogger.capture(e, getClass().getSimpleName())));
5454
}
5555
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package net.discordjug.javabot.listener.handler;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import net.discordjug.javabot.data.config.BotConfig;
5+
import net.discordjug.javabot.data.config.GuildConfig;
6+
import net.dv8tion.jda.api.EmbedBuilder;
7+
import net.dv8tion.jda.api.entities.Message;
8+
import net.dv8tion.jda.api.entities.MessageEmbed;
9+
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
10+
import org.springframework.stereotype.Component;
11+
12+
import java.util.List;
13+
14+
@Component
15+
@RequiredArgsConstructor
16+
public class BlacklistedMessageAttachmentFilter implements MessageFormatFilter {
17+
18+
private final BotConfig botConfig;
19+
20+
@Override
21+
public boolean processMessage(MessageReceivedEvent event, StringBuilder builder, List<Message.Attachment> attachments, List<MessageEmbed> embeds) {
22+
GuildConfig guildConfig = botConfig.get(event.getGuild());
23+
List<String> blacklistedMessageExtensions = guildConfig.getBlacklistedMessageExtensions();
24+
boolean removed = attachments.removeIf(attachment -> blacklistedMessageExtensions.contains(attachment.getFileExtension()));
25+
if (removed) {
26+
MessageEmbed attachmentRemovedInfo = new EmbedBuilder()
27+
.setDescription("Disallowed attachments have been removed from this message.")
28+
.build();
29+
embeds.add(attachmentRemovedInfo);
30+
return true;
31+
} else {
32+
return false;
33+
}
34+
}
35+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package net.discordjug.javabot.listener.handler;
2+
3+
import net.dv8tion.jda.api.entities.Message;
4+
import net.dv8tion.jda.api.entities.MessageEmbed;
5+
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
6+
import org.springframework.stereotype.Component;
7+
8+
import java.util.List;
9+
import java.util.Objects;
10+
import java.util.regex.Matcher;
11+
import java.util.regex.Pattern;
12+
13+
@Component
14+
public class HugFilter implements MessageFormatFilter {
15+
16+
private static final Pattern FUCKER = Pattern.compile(
17+
"(fuck)(ing|er|ed|k+)?",
18+
Pattern.CASE_INSENSITIVE
19+
);
20+
21+
@Override
22+
public boolean processMessage(MessageReceivedEvent event, StringBuilder builder, List<Message.Attachment> attachments, List<MessageEmbed> embeds) {
23+
replaceFucks(builder);
24+
return true;
25+
}
26+
27+
public static void replaceFucks(StringBuilder sb) {
28+
Matcher matcher = FUCKER.matcher(sb);
29+
int offset = 0;
30+
31+
while (matcher.find()) {
32+
String theFuck = matcher.group(1);
33+
String suffix = Objects.requireNonNullElse(matcher.group(2), "");
34+
35+
String processedSuffix = switch (suffix.toLowerCase()) {
36+
case "er", "ed", "ing" -> copyCase(suffix, 0, 'g') + suffix;
37+
case "" -> "";
38+
default -> copyCase(suffix, "g".repeat(suffix.length()));
39+
};
40+
41+
String replacement = processHug(theFuck) + processedSuffix;
42+
43+
int start = matcher.start() + offset;
44+
int end = matcher.end() + offset;
45+
46+
sb.replace(start, end, replacement);
47+
48+
offset += replacement.length() - (end - start);
49+
}
50+
}
51+
52+
private static String processHug(String originalText) {
53+
// FucK -> HuG, FuCk -> Hug, etc.
54+
return String.valueOf(copyCase(originalText, 0, 'h')) +
55+
copyCase(originalText, 1, 'u') +
56+
copyCase(originalText, 3, 'g');
57+
}
58+
59+
private static String copyCase(String source, String toChange) {
60+
if (source.length() != toChange.length()) {
61+
throw new IllegalArgumentException("lengths differ");
62+
}
63+
StringBuilder sb = new StringBuilder();
64+
for (int i = 0; i < source.length(); i++) {
65+
sb.append(copyCase(source, i, toChange.charAt(i)));
66+
}
67+
return sb.toString();
68+
}
69+
70+
private static char copyCase(String original, int index, char newChar) {
71+
return Character.isUpperCase(original.charAt(index)) ? Character.toUpperCase(newChar) : Character.toLowerCase(newChar);
72+
}
73+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.discordjug.javabot.listener.handler;
2+
3+
import net.dv8tion.jda.api.entities.Message;
4+
import net.dv8tion.jda.api.entities.MessageEmbed;
5+
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
6+
7+
import java.util.List;
8+
9+
public interface MessageFormatFilter {
10+
boolean processMessage(MessageReceivedEvent event, StringBuilder builder, List<Message.Attachment> attachments, List<MessageEmbed> embeds);
11+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package net.discordjug.javabot.listener.handler;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import net.discordjug.javabot.data.config.BotConfig;
5+
import net.discordjug.javabot.util.ExceptionLogger;
6+
import net.discordjug.javabot.util.WebhookUtil;
7+
import net.dv8tion.jda.api.entities.Message;
8+
import net.dv8tion.jda.api.entities.MessageEmbed;
9+
import net.dv8tion.jda.api.entities.channel.ChannelType;
10+
import net.dv8tion.jda.api.entities.channel.attribute.IWebhookContainer;
11+
import net.dv8tion.jda.api.entities.channel.middleman.StandardGuildChannel;
12+
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
13+
import net.dv8tion.jda.api.hooks.ListenerAdapter;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
19+
@RequiredArgsConstructor
20+
public class MessageFormatHandler extends ListenerAdapter {
21+
22+
private final List<MessageFormatFilter> filters;
23+
24+
@Override
25+
public void onMessageReceived(@NotNull MessageReceivedEvent event) {
26+
if (event.getAuthor().isBot() || event.getAuthor().isSystem()) return;
27+
Message message = event.getMessage();
28+
StringBuilder builder = new StringBuilder();
29+
builder.append(message.getContentRaw());
30+
List<Message.Attachment> attachments = new ArrayList<>(message.getAttachments());
31+
List<MessageEmbed> embeds = new ArrayList<>();
32+
33+
boolean handled = false;
34+
35+
for (MessageFormatFilter filter : filters) {
36+
boolean processed = filter.processMessage(event, builder, attachments, embeds);
37+
if (processed) {
38+
handled = true;
39+
}
40+
}
41+
42+
if (handled) {
43+
IWebhookContainer webhookContainer = null;
44+
long threadId = 0;
45+
if (event.isFromType(ChannelType.TEXT)) {
46+
webhookContainer = event.getChannel().asTextChannel();
47+
}
48+
if (event.isFromThread()) {
49+
StandardGuildChannel parentChannel = event.getChannel()
50+
.asThreadChannel()
51+
.getParentChannel()
52+
.asStandardGuildChannel();
53+
threadId = event.getChannel().getIdLong();
54+
webhookContainer = (IWebhookContainer) parentChannel;
55+
}
56+
if (webhookContainer == null) {
57+
return;
58+
}
59+
replaceMessage(event, webhookContainer, builder.toString(), threadId, attachments, embeds);
60+
}
61+
}
62+
63+
private static void replaceMessage(@NotNull MessageReceivedEvent event, IWebhookContainer webhookContainer,
64+
String messageContentRaw, long threadId, List<Message.Attachment> attachments,
65+
List<MessageEmbed> embeds) {
66+
WebhookUtil.ensureWebhookExists(
67+
webhookContainer,
68+
wh -> WebhookUtil.replaceMemberMessage(
69+
wh,
70+
event.getMessage(),
71+
messageContentRaw,
72+
threadId,
73+
attachments,
74+
embeds
75+
),
76+
e -> ExceptionLogger.capture(
77+
e,
78+
"Error creating webhook for BlacklistedMessageAttachmentListener"
79+
)
80+
);
81+
}
82+
}

src/main/java/net/discordjug/javabot/systems/help/AutoCodeFormatter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.springframework.stereotype.Component;
2020

2121
import javax.annotation.Nonnull;
22+
import java.util.List;
2223
import java.util.Objects;
2324

2425
/**
@@ -154,7 +155,8 @@ private void replaceUnformattedCode(String msg, int codeStartIndex, int codeEndI
154155
event.getMessage(),
155156
messageContent,
156157
event.getChannel().getIdLong(),
157-
autoformatInfo.build()
158+
null,
159+
List.of(autoformatInfo.build())
158160
),
159161
e -> ExceptionLogger.capture(
160162
e,

src/main/java/net/discordjug/javabot/systems/moderation/report/ReportManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ private void handleMessageReport(ModalInteractionEvent event, String messageId)
236236
reportChannel.sendMessageEmbeds(embed.build()).queue(m -> createReportThread(m, target.getAuthor().getIdLong(), config.getModerationConfig(), thread->{
237237
sendReportResponse(event.getHook(), target.getAuthor(), embed, thread);
238238
WebhookUtil.ensureWebhookExists(thread.getParentChannel().asStandardGuildMessageChannel(), wh->{
239-
WebhookUtil.mirrorMessageToWebhook(wh, target, target.getContentRaw(), thread.getIdLong(), null, null);
239+
WebhookUtil.mirrorMessageToWebhook(wh, target, target.getContentRaw(), thread.getIdLong(), null, null, null);
240240
});
241241
}));
242242
}, failure -> {

0 commit comments

Comments
 (0)