package xyz.etztech.qol.listeners; import org.bukkit.ChatColor; 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 org.bukkit.advancement.Advancement; import org.bukkit.Namespacedkey; import xyz.etztech.qol.QoL; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class AsyncPlayerChatListener implements Listener { private final List discordSyntax = Arrays.asList( Pattern.compile("__([^_]+)__"), // 0: __underline__ Pattern.compile("_([^_]+)_"), // 1: _italic_ Pattern.compile("\\*\\*([^*]+)\\*\\*"), // 2: **bold** Pattern.compile("\\*([^*]+)\\*"), // 3: *italic* Pattern.compile("~~([^~]+)~~") // 4: ~~strikethrough~~ ); private QoL plugin; public AsyncPlayerChatListener(QoL plugin) { this.plugin = plugin; plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler(priority=EventPriority.HIGH, ignoreCancelled=true) public void onChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); if (QoL.hasSM(player)) { event.getRecipients().clear(); event.getRecipients().add(player); } if (QoL.getTimeout() && !player.hasPermission("qol.timeout.bypass")) { event.getRecipients().clear(); } // Discord syntax for font emphasis if (player.hasPermission("qol.discord")) { String chat = event.getMessage(); boolean escape = false; //Checking if player has been awarded the chat advancement, if not, message is searched for triggers Advancement adv = Bukkit.getAdvancement(new Namespacedkey("canopy", "chat_advancement")); if (!player.getAdvancementProgress(adv).isDone()) { List advancementTriggerList = plugin.getConfig().getStringList("chat-advancement-triggers"); if (advancementTriggerList.stream().anyMatch(t -> chat.toLowerCase().contains(t.toLowerCase()))) { player.getAdvancementProgress(adv).awardCriteria("win"); } } // Escape if (chat.startsWith("\\")) { escape = true; event.setMessage(chat.substring(1)); // Escape the escape, this monster wants to start their message with a backslash if (chat.startsWith("\\\\")) { escape = false; } } if (!escape) { Pattern syntax; Matcher matcher; for (int i = 0; i < discordSyntax.size(); i++) { syntax = discordSyntax.get(i); matcher = syntax.matcher(chat); switch (i) { case 0: chat = matcher.replaceAll("&n$1&r"); break; case 1: case 3: chat = matcher.replaceAll("&o$1&r"); break; case 2: chat = matcher.replaceAll("&l$1&r"); break; case 4: chat = matcher.replaceAll("&m$1&r"); break; default: break; } } event.setMessage(ChatColor.translateAlternateColorCodes('&', chat)); } } } }