Skip to content

Commit 1cb7604

Browse files
committed
version final final(1)(1)(1)(1) final finally final done complete 100 percent
1 parent fd5403c commit 1cb7604

File tree

9 files changed

+269
-129
lines changed

9 files changed

+269
-129
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.lang.reflect.Field;
1919
import java.nio.file.Files;
2020
import java.nio.file.Path;
21+
import java.util.List;
2122
import java.util.Optional;
2223

2324
/**
@@ -37,6 +38,7 @@ public class GuildConfig {
3738
private StarboardConfig starboardConfig;
3839
private MessageCacheConfig messageCacheConfig;
3940
private ServerLockConfig serverLockConfig;
41+
private List<String> blacklistedMessageExtensions;
4042

4143
/**
4244
* Constructor that initializes all Config classes.
@@ -54,6 +56,7 @@ public GuildConfig(Guild guild, Path file) {
5456
this.starboardConfig = new StarboardConfig();
5557
this.messageCacheConfig = new MessageCacheConfig();
5658
this.serverLockConfig = new ServerLockConfig();
59+
this.blacklistedMessageExtensions = List.of("jar", "exe", "zip");
5760
this.setGuild(guild);
5861
}
5962

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

Lines changed: 0 additions & 120 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package net.discordjug.javabot.listener.filter;
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 MessageFilter {
17+
18+
private final BotConfig botConfig;
19+
20+
@Override
21+
public MessageModificationStatus processMessage(MessageContent content) {
22+
MessageReceivedEvent event = content.event();
23+
List<Message.Attachment> attachments = content.attachments();
24+
List<MessageEmbed> embeds = content.embeds();
25+
GuildConfig guildConfig = botConfig.get(event.getGuild());
26+
List<String> blacklistedMessageExtensions = guildConfig.getBlacklistedMessageExtensions();
27+
boolean removed = attachments.removeIf(attachment -> blacklistedMessageExtensions.contains(attachment.getFileExtension()));
28+
if (removed) {
29+
MessageEmbed attachmentRemovedInfo = new EmbedBuilder()
30+
.setDescription("Disallowed attachments have been removed from this message.")
31+
.build();
32+
embeds.add(attachmentRemovedInfo);
33+
return MessageModificationStatus.MODIFIED;
34+
} else {
35+
return MessageModificationStatus.NOT_MODIFIED;
36+
}
37+
}
38+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package net.discordjug.javabot.listener.filter;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Component;
5+
6+
import java.util.Objects;
7+
import java.util.regex.Pattern;
8+
9+
@Component
10+
@RequiredArgsConstructor
11+
public class HugFilter implements MessageFilter {
12+
13+
private static final Pattern FUCKER = Pattern.compile(
14+
"(fuck)(ing|er|ed|k+)?",
15+
Pattern.CASE_INSENSITIVE
16+
);
17+
18+
@Override
19+
public MessageModificationStatus processMessage(MessageContent content) {
20+
if (!content.event().getMessage().getMentions().getUsers().isEmpty()) {
21+
return MessageModificationStatus.NOT_MODIFIED;
22+
}
23+
String before = content.builder().toString();
24+
String processed = replaceFucks(content.builder().toString());
25+
if (!before.equals(processed)) {
26+
content.builder().setLength(0);
27+
content.builder().append(processed);
28+
return MessageModificationStatus.MODIFIED;
29+
} else {
30+
return MessageModificationStatus.NOT_MODIFIED;
31+
}
32+
}
33+
34+
private static String processHug(String originalText) {
35+
// FucK -> HuG, FuCk -> Hug
36+
return String.valueOf(copyCase(originalText, 0, 'h')) + copyCase(originalText, 1, 'u') +
37+
copyCase(originalText, 3, 'g');
38+
}
39+
40+
private static String replaceFucks(String str) {
41+
return FUCKER.matcher(str).replaceAll(matchResult -> {
42+
String theFuck = matchResult.group(1);
43+
String suffix = Objects.requireNonNullElse(matchResult.group(2), "");
44+
String processedSuffix = switch (suffix.toLowerCase()) {
45+
case "er", "ed", "ing" -> copyCase(suffix, 0, 'g') + suffix; // fucking, fucker, fucked
46+
case "" -> ""; // just fuck
47+
default -> copyCase(suffix, "g".repeat(suffix.length())); // fuckkkkk...
48+
};
49+
return processHug(theFuck) + processedSuffix;
50+
});
51+
}
52+
53+
private static String copyCase(String source, String toChange) {
54+
if (source.length() != toChange.length()) {
55+
throw new IllegalArgumentException("lengths differ");
56+
}
57+
StringBuilder sb = new StringBuilder();
58+
for (int i = 0; i < source.length(); i++) {
59+
sb.append(copyCase(source, i, toChange.charAt(i)));
60+
}
61+
return sb.toString();
62+
}
63+
64+
private static char copyCase(String original, int index, char newChar) {
65+
if (Character.isUpperCase(original.charAt(index))) {
66+
return Character.toUpperCase(newChar);
67+
} else {
68+
return newChar;
69+
}
70+
}
71+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package net.discordjug.javabot.listener.filter;
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 record MessageContent(MessageReceivedEvent event,
10+
StringBuilder builder,
11+
List<Message.Attachment> attachments,
12+
List<MessageEmbed> embeds) {
13+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.discordjug.javabot.listener.filter;
2+
3+
public interface MessageFilter {
4+
5+
MessageModificationStatus processMessage(MessageContent content);
6+
7+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package net.discordjug.javabot.listener.filter;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import net.discordjug.javabot.data.config.BotConfig;
5+
import net.discordjug.javabot.systems.moderation.AutoMod;
6+
import net.discordjug.javabot.util.ExceptionLogger;
7+
import net.discordjug.javabot.util.WebhookUtil;
8+
import net.dv8tion.jda.api.entities.Message;
9+
import net.dv8tion.jda.api.entities.MessageEmbed;
10+
import net.dv8tion.jda.api.entities.channel.ChannelType;
11+
import net.dv8tion.jda.api.entities.channel.attribute.IWebhookContainer;
12+
import net.dv8tion.jda.api.entities.channel.middleman.StandardGuildChannel;
13+
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
14+
import net.dv8tion.jda.api.hooks.ListenerAdapter;
15+
import org.jetbrains.annotations.NotNull;
16+
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
20+
@RequiredArgsConstructor
21+
public class MessageFilterHandler extends ListenerAdapter {
22+
23+
private final List<MessageFilter> filters;
24+
private final AutoMod autoMod;
25+
private final BotConfig botConfig;
26+
27+
@Override
28+
public void onMessageReceived(@NotNull MessageReceivedEvent event) {
29+
if (!shouldRunFilters(event)) {
30+
return;
31+
}
32+
Message message = event.getMessage();
33+
StringBuilder builder = new StringBuilder(message.getContentRaw());
34+
List<Message.Attachment> attachments = new ArrayList<>(message.getAttachments());
35+
List<MessageEmbed> embeds = new ArrayList<>();
36+
37+
boolean handled = false;
38+
39+
MessageContent content = new MessageContent(event, builder, attachments, embeds);
40+
41+
for (MessageFilter filter : filters) {
42+
MessageModificationStatus status = filter.processMessage(content);
43+
switch (status) {
44+
case MODIFIED -> handled = true;
45+
case STOP_PROCESSING -> {
46+
return;
47+
}
48+
}
49+
}
50+
51+
if (handled) {
52+
IWebhookContainer webhookContainer = null;
53+
long threadId = 0;
54+
if (event.isFromType(ChannelType.TEXT)) {
55+
webhookContainer = event.getChannel().asTextChannel();
56+
}
57+
if (event.isFromThread()) {
58+
StandardGuildChannel parentChannel = event.getChannel()
59+
.asThreadChannel()
60+
.getParentChannel()
61+
.asStandardGuildChannel();
62+
threadId = event.getChannel().getIdLong();
63+
webhookContainer = (IWebhookContainer) parentChannel;
64+
}
65+
if (webhookContainer == null) {
66+
return;
67+
}
68+
replaceMessage(event, webhookContainer, threadId, content);
69+
}
70+
}
71+
72+
private boolean shouldRunFilters(@NotNull MessageReceivedEvent event) {
73+
if (event.isWebhookMessage()) {
74+
return false;
75+
}
76+
if (!event.isFromGuild()) {
77+
return false;
78+
}
79+
if (event.getAuthor().isBot() || event.getAuthor().isSystem()) {
80+
return false;
81+
}
82+
if (autoMod.hasSuspiciousLink(event.getMessage()) ||
83+
autoMod.hasAdvertisingLink(event.getMessage())) {
84+
return false;
85+
}
86+
if (event.getChannel().getIdLong() == botConfig.get(event.getGuild())
87+
.getModerationConfig()
88+
.getSuggestionChannelId()) {
89+
return false;
90+
}
91+
return true;
92+
}
93+
94+
private void replaceMessage(@NotNull MessageReceivedEvent event, IWebhookContainer webhookContainer,
95+
long threadId, MessageContent content) {
96+
WebhookUtil.ensureWebhookExists(
97+
webhookContainer,
98+
wh -> WebhookUtil.replaceMemberMessage(
99+
wh,
100+
event.getMessage(),
101+
content.builder().toString(),
102+
threadId,
103+
content.attachments(),
104+
content.embeds()
105+
),
106+
e -> ExceptionLogger.capture(
107+
e,
108+
this.getClass().getSimpleName()
109+
)
110+
);
111+
}
112+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.discordjug.javabot.listener.filter;
2+
3+
public enum MessageModificationStatus {
4+
MODIFIED,
5+
NOT_MODIFIED,
6+
STOP_PROCESSING
7+
}

0 commit comments

Comments
 (0)