From 79ebb7ae784692a6ed5c59087c2399ea04031b69 Mon Sep 17 00:00:00 2001 From: Ben Houghton Date: Sat, 1 Oct 2022 01:31:59 +0100 Subject: [PATCH] Move filter down to backend --- .../mceventsuite/spigot/EventSpigot.java | 4 + .../spigot/listeners/ChatListener.java | 80 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/dev/imabad/mceventsuite/spigot/listeners/ChatListener.java diff --git a/src/main/java/dev/imabad/mceventsuite/spigot/EventSpigot.java b/src/main/java/dev/imabad/mceventsuite/spigot/EventSpigot.java index f6af307..f74b95f 100644 --- a/src/main/java/dev/imabad/mceventsuite/spigot/EventSpigot.java +++ b/src/main/java/dev/imabad/mceventsuite/spigot/EventSpigot.java @@ -19,11 +19,13 @@ import dev.imabad.mceventsuite.core.modules.scavenger.ScavengerModule; import dev.imabad.mceventsuite.core.modules.servers.ServersModule; import dev.imabad.mceventsuite.core.modules.servers.objects.Server; +import dev.imabad.mceventsuite.core.util.BadWords; import dev.imabad.mceventsuite.spigot.commands.*; import dev.imabad.mceventsuite.spigot.impl.EventPermissible; import dev.imabad.mceventsuite.spigot.impl.EventPermission; import dev.imabad.mceventsuite.spigot.impl.SpigotActionExecutor; import dev.imabad.mceventsuite.spigot.listeners.BuildListener; +import dev.imabad.mceventsuite.spigot.listeners.ChatListener; import dev.imabad.mceventsuite.spigot.listeners.EventListener; import dev.imabad.mceventsuite.spigot.listeners.PlayerListener; import dev.imabad.mceventsuite.spigot.modules.bedrock.BedrockModule; @@ -157,6 +159,8 @@ public void onEnable() { }); getServer().getPluginManager().registerEvents(new PlayerListener(), this); getServer().getPluginManager().registerEvents(new BuildListener(), this); + getServer().getPluginManager().registerEvents(new ChatListener(), this); + BadWords.loadConfigs(); if(getServer().getPluginManager().isPluginEnabled("Vault")){ System.out.println("Vault is enabled, registering permission handler"); getServer().getServicesManager().register(Permission.class, new EventPermission(), this, ServicePriority.Highest); diff --git a/src/main/java/dev/imabad/mceventsuite/spigot/listeners/ChatListener.java b/src/main/java/dev/imabad/mceventsuite/spigot/listeners/ChatListener.java new file mode 100644 index 0000000..5c417b8 --- /dev/null +++ b/src/main/java/dev/imabad/mceventsuite/spigot/listeners/ChatListener.java @@ -0,0 +1,80 @@ +package dev.imabad.mceventsuite.spigot.listeners; + +import dev.imabad.mceventsuite.core.EventCore; +import dev.imabad.mceventsuite.core.modules.redis.RedisModule; +import dev.imabad.mceventsuite.core.util.BadWords; +import io.papermc.paper.event.player.AsyncChatEvent; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashMap; +import java.util.UUID; + +public class ChatListener implements Listener { + + private static final Component FILTERED_MESSAGE = Component.text("Your message was filtered").color(NamedTextColor.YELLOW); + private static final Component SPAM_MESSAGE = Component.text("Please don't spam!").color(NamedTextColor.YELLOW); + + static class LastMessage { + public String message; + public long time; + + public LastMessage(String message, long time) { + this.message = message; + this.time = time; + } + } + + private HashMap messages = new HashMap<>(); + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + messages.remove(event.getPlayer().getUniqueId()); + } + + @EventHandler + public void onPlayerChat(AsyncChatEvent event) { + Player sender = event.getPlayer(); + String messageAsString = LegacyComponentSerializer.legacyAmpersand().serialize(event.originalMessage()); + if (!messageAsString.startsWith("/")) { + if (EventCore.getInstance().getModuleRegistry().getModule(RedisModule.class).getMutedPlayersManager().isMuted(sender.getUniqueId().toString())) { + long expiry = EventCore.getInstance().getModuleRegistry().getModule(RedisModule.class).getMutedPlayersManager().getMuteExpiry(sender.getUniqueId().toString()); + if (expiry > System.currentTimeMillis()) { + event.setCancelled(true); + return; + } else { + EventCore.getInstance().getModuleRegistry().getModule(RedisModule.class).getMutedPlayersManager().removePlayer(sender.getUniqueId().toString()); + } + } + + EventCore.getInstance().getEventPlayerManager().getPlayer(sender.getUniqueId()).ifPresent(player -> { + // Check message for profanity. + if (BadWords.badWordsFound(messageAsString).size() > 0) { + sender.sendMessage(FILTERED_MESSAGE); + event.setCancelled(true); + return; + } + if (messages.containsKey(sender.getUniqueId()) && !player.hasPermission("eventsuite.staffchat")) { + LastMessage lastMessage = messages.get(sender.getUniqueId()); + long timeSince = System.currentTimeMillis() - lastMessage.time; + if (lastMessage.message.equalsIgnoreCase(messageAsString) && timeSince < 5000) { + sender.sendMessage(SPAM_MESSAGE); + event.setCancelled(true); + return; + } else if (timeSince < 2000) { + sender.sendMessage(SPAM_MESSAGE); + event.setCancelled(true); + return; + } + } + messages.put(player.getUUID(), new LastMessage(messageAsString, System.currentTimeMillis())); + }); + } + } +}