package com.zerohighdef.hush.listeners; import com.zerohighdef.hush.Hush; import com.zerohighdef.hush.WatchList; import org.apache.commons.lang.ObjectUtils; import org.bukkit.BanList; import org.bukkit.Bukkit; 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.AsyncPlayerChatEvent; import xyz.etztech.Javacord; import xyz.etztech.Webhook; import xyz.etztech.embed.Author; import xyz.etztech.embed.Embed; import java.time.OffsetDateTime; import java.util.List; import java.util.regex.Pattern; interface Action { void action(); } public class HushAsyncChatListener implements Listener { private final Hush plugin; public HushAsyncChatListener(Hush plugin) { this.plugin = plugin; plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = false) public boolean onChat(AsyncPlayerChatEvent event) { String chatMessage = event.getMessage(); Player sender = event.getPlayer(); for (WatchList list : plugin.getWatchLists()) { if (sender.hasPermission(list.getPermission())) { boolean phraseFound = checkPhraseList(list.getBanPatterns(), sender, chatMessage, (() -> { banPlayer(sender, list.getBanMessage()); })); if (phraseFound) { event.setCancelled(true); return true; } checkPhraseList(list.getMonitorPatterns(), sender, chatMessage, null); } } return true; } private void banPlayer(Player player, String banMessage) { Bukkit.getBanList(BanList.Type.NAME) .addBan(player.getName(), banMessage, null, null); Bukkit.getScheduler().runTask(plugin, new Runnable() { @Override public void run() { player.kickPlayer("You have been banned: " + banMessage); } }); } private boolean checkPhraseList(List patternList, Player player, String chatMessage, Action action) { for (Pattern pattern: patternList) { if (pattern.matcher(chatMessage).find()) { if (action != null) { action.action(); } String playerName = player.getName(); String webhook = plugin.getConfig().getString("webhook"); if (webhook != null) { String message = playerName + " said: " + "`" + Javacord.escapeFormat(chatMessage) + "`"; Embed embed = new Embed() .color(0xC70039) .description(message) .author(new Author(playerName, "", String.format("https://minotar.net/helm/%s/100.png", playerName), "")) .timestamp(OffsetDateTime.now()); this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { try { Javacord.sendWebhook(webhook, new Webhook("@here", embed)); } catch (Exception e) { this.plugin.log("Webhook failed to send"); } }); } return true; } } return false; } }