diff --git a/src/main/java/dev/imabad/mceventsuite/spigot/EventSpigot.java b/src/main/java/dev/imabad/mceventsuite/spigot/EventSpigot.java index e37ddf7..e11d130 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; @@ -156,6 +158,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..687d2e5 --- /dev/null +++ b/src/main/java/dev/imabad/mceventsuite/spigot/listeners/ChatListener.java @@ -0,0 +1,87 @@ +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.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import javax.naming.Name; +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); + private static final Component MUTED_MESSAGE = Component.text("You have been muted!").color(NamedTextColor.RED) + .append(Component.text("\nThink this was in error? Appeal to ").color(NamedTextColor.GRAY)) + .append(Component.text("support@cubedcon.com").color(NamedTextColor.BLUE)); + + + 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); + event.getPlayer().sendMessage(MUTED_MESSAGE); + 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())); + }); + } + } +} \ No newline at end of file