Skip to content

Commit be95947

Browse files
committed
this code sucks, but anvil filter is done
1 parent 0549f86 commit be95947

12 files changed

Lines changed: 386 additions & 80 deletions

File tree

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Module-ChatFilter
2+
3+
This is a module for the [Plex](https://github.com/plexusorg/Plex) plugin designed to create a chat filtering system for Plex, since Plex does not natively have a chat filtering system.
4+
5+
A lot of this is taken from [KoolChatFilter](https://github.com/KoolFreedom/KoolChatFilter) but since it's our code it doesn't really matter.
6+
7+
## Compiling
8+
9+
You need Gradle to build.
10+
11+
## Contributing/Support
12+
13+
This code kind of sucks, so if you want to contribute to this module, please join our Discord which you can find on the main organization page.
14+
15+
If you need help with this module, join the Discord.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package dev.plex;
2+
3+
import dev.plex.cache.DataUtils;
4+
import dev.plex.command.ObliterateCommand;
5+
import dev.plex.config.ModuleConfig;
6+
import dev.plex.listener.FilterListener;
7+
import dev.plex.module.PlexModule;
8+
import dev.plex.player.PlexPlayer;
9+
import dev.plex.punishment.Punishment;
10+
import dev.plex.punishment.PunishmentType;
11+
import dev.plex.util.PlexLog;
12+
import dev.plex.utilities.ViolationSource;
13+
import lombok.Getter;
14+
import net.kyori.adventure.text.format.NamedTextColor;
15+
import org.bukkit.Bukkit;
16+
import org.bukkit.entity.Player;
17+
import net.kyori.adventure.text.Component;
18+
19+
public class ChatFilterModule extends PlexModule
20+
{
21+
@Getter
22+
private static ChatFilterModule module;
23+
24+
@Getter
25+
private ModuleConfig config;
26+
27+
@Override
28+
public void load()
29+
{
30+
module = this;
31+
config = new ModuleConfig(this, "chatfilter/config.yml", "config.yml");
32+
config.load();
33+
}
34+
35+
@Override
36+
public void enable()
37+
{
38+
registerCommand(new ObliterateCommand());
39+
registerListener(new FilterListener());
40+
41+
addDefaultMessage("castingOblivion", "<red>{0} is casting oblivion over {1}", "0 - The command sender", "1 - The target");
42+
addDefaultMessage("playerEviscerated", "<red>{1} will be completely eviscerated", "1 - The target");
43+
addDefaultMessage("playerEradicated", "<red>{1} has been eradicated from existence!", "1 - The target");
44+
addDefaultMessage("obliterateReason", "You've met with a terrible fate, haven't you?");
45+
addDefaultMessage("targetPermBanned", "<red>{0} - Permanently banning {1}", "0 - The command sender", "1 - The target");
46+
addDefaultMessage("filterTriggered", "<red>{0} - {1} filter has been triggered by {2}",
47+
"0 - The server's console (this needs to be here)", "1- The filter source that was triggered", "2 - Who triggered it");
48+
}
49+
50+
@Override
51+
public void disable()
52+
{
53+
// Unregistering listeners / commands is handled by Plex
54+
}
55+
56+
public static void punishPlayer(PlexPlayer plexPlayer, ViolationSource source)
57+
{
58+
Player player = DataUtils.getPlayer(plexPlayer.getUuid()).getPlayer();
59+
60+
Punishment punishment = new Punishment(plexPlayer.getUuid(), Bukkit.getPlayerUniqueId(player.getName()));
61+
punishment.setType(PunishmentType.BAN);
62+
punishment.setPunishedUsername(plexPlayer.getName());
63+
punishment.setEndDate(null);
64+
punishment.setCustomTime(false);
65+
punishment.setActive(true);
66+
punishment.setReason("Hate Speech (" + source + ")");
67+
punishment.setIp(plexPlayer.getIps().getLast());
68+
Plex.get().getPunishmentManager().punish(plexPlayer, punishment);
69+
}
70+
71+
public static void logFilteredMessage(Component message)
72+
{
73+
for (Player player : Bukkit.getOnlinePlayers())
74+
{
75+
if (!player.hasPermission("kfc.admin")) continue;
76+
77+
player.sendMessage(Component.newline()
78+
.append(Component.text("[", NamedTextColor.DARK_GRAY))
79+
.append(Component.text("Chat Filter", NamedTextColor.RED))
80+
.append(Component.text("] ", NamedTextColor.DARK_GRAY))
81+
.append(message)
82+
.appendNewline());
83+
}
84+
PlexLog.log(message);
85+
}
86+
}

src/main/java/dev/plex/ExampleModule.java

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

src/main/java/dev/plex/command/ExampleCommand.java

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package dev.plex.command;
2+
3+
import dev.plex.cache.DataUtils;
4+
import dev.plex.command.annotation.CommandParameters;
5+
import dev.plex.command.annotation.CommandPermissions;
6+
import java.util.Arrays;
7+
import java.util.Collections;
8+
import java.util.List;
9+
10+
import dev.plex.command.exception.PlayerNotFoundException;
11+
import dev.plex.player.PlexPlayer;
12+
import dev.plex.punishment.Punishment;
13+
import dev.plex.punishment.PunishmentType;
14+
import dev.plex.util.PlexUtils;
15+
import dev.plex.utilities.FilterUtils;
16+
import net.kyori.adventure.text.Component;
17+
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
18+
import org.bukkit.Bukkit;
19+
import org.bukkit.GameMode;
20+
import org.bukkit.command.CommandSender;
21+
import org.bukkit.entity.Player;
22+
import org.jetbrains.annotations.NotNull;
23+
import org.jetbrains.annotations.Nullable;
24+
25+
@CommandParameters(name = "obliterate", description = "Unleash divine punishment upon someone", usage = "/<command> <player> [reason]")
26+
@CommandPermissions(permission = "plex.chatfilter.obliterate")
27+
public class ObliterateCommand extends PlexCommand
28+
{
29+
@Override
30+
protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] strings)
31+
{
32+
if (strings.length == 0)
33+
{
34+
return usage();
35+
}
36+
37+
PlexPlayer plexPlayer = DataUtils.getPlayer(strings[0]);
38+
if (plexPlayer == null)
39+
{
40+
throw new PlayerNotFoundException();
41+
}
42+
43+
Player target = getNonNullPlayer(plexPlayer.getName());
44+
45+
for (int i = 0; i < 30; i++)
46+
{
47+
target.getWorld().strikeLightningEffect(target.getLocation());
48+
}
49+
50+
target.setFireTicks(200);
51+
target.setGameMode(GameMode.ADVENTURE);
52+
53+
PlexUtils.broadcast(PlexUtils.messageComponent("castingOblivion", commandSender, target));
54+
55+
Bukkit.getScheduler().runTaskLater(plugin, () -> PlexUtils.broadcast(messageComponent("playerEviscerated", target)), 2);
56+
57+
Bukkit.getScheduler().runTaskLater(plugin, () -> {
58+
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "lp user " + target + " clear");
59+
if (target.isOp()) target.setOp(false);
60+
if (target.isWhitelisted()) target.setWhitelisted(false);
61+
}, 2);
62+
63+
Bukkit.getScheduler().runTaskLater(plugin, () -> target.setHealth(0), 10);
64+
65+
Bukkit.getScheduler().runTaskLater(plugin, () -> PlexUtils.broadcast(messageComponent("playerEradicated", target)), 30);
66+
67+
FilterUtils.crashPlayer(target);
68+
69+
Punishment punishment = new Punishment(plexPlayer.getUuid(), getUUID(commandSender));
70+
punishment.setType(PunishmentType.BAN);
71+
punishment.setPunishedUsername(plexPlayer.getName());
72+
punishment.setEndDate(null);
73+
punishment.setCustomTime(false);
74+
punishment.setActive(true);
75+
punishment.setReason(messageString("obliterateReason"));
76+
punishment.setIp(player != null ? player.getAddress().getAddress().getHostAddress().trim() : plexPlayer.getIps().getLast());
77+
78+
Bukkit.getScheduler().runTaskLater(plugin, () ->
79+
plugin.getPunishmentManager().punish(plexPlayer, punishment), 38);
80+
Bukkit.getScheduler().runTaskLater(plugin, () ->
81+
PlexUtils.broadcast(messageComponent("targetPermBanned")), 38);
82+
return null;
83+
}
84+
85+
@Override
86+
public @NotNull List<String> smartTabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException
87+
{
88+
if (silentCheckPermission(sender, this.getPermission()))
89+
{
90+
if (args.length == 1)
91+
{
92+
return Arrays.asList("option1", "option2", "option3");
93+
}
94+
95+
if (args.length == 2)
96+
{
97+
return Arrays.asList("option3", "option4");
98+
}
99+
return Collections.emptyList();
100+
}
101+
return Collections.emptyList();
102+
}
103+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package dev.plex.filter;
2+
3+
import dev.plex.ChatFilterModule;
4+
import dev.plex.util.PlexLog;
5+
6+
import java.text.Normalizer;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
import java.util.regex.Pattern;
10+
11+
public final class FilterEngine
12+
{
13+
private static final Map<String, Pattern> RULES = new HashMap<>();
14+
15+
private FilterEngine() {}
16+
17+
public static void reload()
18+
{
19+
RULES.clear();
20+
21+
for (String rule :ChatFilterModule.getModule().getConfig().getStringList("blocked-terms"))
22+
{
23+
String clean = sanitize(rule);
24+
String regex = "\\b" + Pattern.quote(clean) + "\\b";
25+
RULES.put(rule, Pattern.compile(regex));
26+
}
27+
PlexLog.log("Filter engine reloaded.");
28+
}
29+
30+
public static FilterResult check(String input)
31+
{
32+
String message = sanitize(input);
33+
34+
for (Map.Entry<String, Pattern> entry : RULES.entrySet())
35+
{
36+
if (entry.getValue().matcher(message).find())
37+
{
38+
return new FilterResult(true, entry.getKey());
39+
}
40+
}
41+
return FilterResult.noMatch();
42+
}
43+
44+
private static String sanitize(String input)
45+
{
46+
String normalized = Normalizer.normalize(input, Normalizer.Form.NFD).replaceAll("\\p{M}", "");
47+
48+
normalized = normalized.replaceAll("[\\u200B-\\u200D\\uFEFF]", "");
49+
50+
normalized = normalized.toLowerCase();
51+
normalized = normalized.replaceAll("[^a-z ]", " ");
52+
normalized = normalized.replaceAll("\\s+", " ").trim();
53+
54+
return normalized;
55+
}
56+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package dev.plex.filter;
2+
3+
import org.jetbrains.annotations.Nullable;
4+
5+
public record FilterResult(boolean matched, @Nullable String matchedRule)
6+
{
7+
public static FilterResult noMatch()
8+
{
9+
return new FilterResult(false, null);
10+
}
11+
}

src/main/java/dev/plex/listener/ExampleListener.java

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

0 commit comments

Comments
 (0)