diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java index 958bb40..636609b 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java @@ -5,21 +5,24 @@ import com.alttd.chat.config.Config; import com.alttd.chat.handler.ChatHandler; import com.alttd.chat.managers.ChatUserManager; import com.alttd.chat.managers.RegexManager; +import com.alttd.chat.objects.ChatFilter; import com.alttd.chat.objects.ChatUser; import com.alttd.chat.objects.ModifiableString; import com.alttd.chat.objects.Toggleable; import com.alttd.chat.util.ALogger; import com.alttd.chat.util.GalaxyUtility; import com.alttd.chat.util.Utility; +import io.papermc.paper.event.player.AsyncChatDecorateEvent; import io.papermc.paper.event.player.AsyncChatEvent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextReplacementConfig; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; @@ -28,6 +31,19 @@ import java.util.stream.Collectors; public class ChatListener implements Listener { + private final PlainTextComponentSerializer plainTextComponentSerializer = PlainTextComponentSerializer.plainText(); + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onChatDecorate(AsyncChatDecorateEvent event) { + + if (event.player() == null) return; + + Component formatComponent = Component.text("%message%"); + Component message = parseMessageContent(event.player(), plainTextComponentSerializer.serialize(event.originalMessage())); + + event.result(formatComponent.replaceText(TextReplacementConfig.builder().match("%message%").replacement(message).build())); + } + @EventHandler(ignoreCancelled = true) public void onPlayerChat(AsyncChatEvent event) { event.setCancelled(true); //Always cancel the event because we do not want to deal with Microsoft's stupid bans @@ -43,7 +59,6 @@ public class ChatListener implements Listener { } Player player = event.getPlayer(); -// ChatUser user = ChatUserManager.getChatUser(player.getUniqueId()); Set receivers = event.viewers().stream().filter(audience -> audience instanceof Player) .map(audience -> (Player) audience) @@ -61,40 +76,57 @@ public class ChatListener implements Listener { ""); return; // the message was blocked } - message = modifiableString.string(); - if(!player.hasPermission("chat.format")) { - message = Utility.stripTokens(message); - } else { - message = Utility.parseColors(message); - } - Component component = Utility.parseMiniMessage(Utility.formatText(message)); - component = component.replaceText( - TextReplacementConfig.builder() - .once() - .matchLiteral("[i]") - .replacement(ChatHandler.itemComponent(player.getInventory().getItemInMainHand())) - .build()); - - component = render(player, component); + input = render(player, input); for (Player receiver : receivers) { - receiver.sendMessage(component); + receiver.sendMessage(input); } - ALogger.info(PlainTextComponentSerializer.plainText().serialize(component)); + ALogger.info(PlainTextComponentSerializer.plainText().serialize(input)); } public @NotNull Component render(@NotNull Player player, @NotNull Component message) { ChatUser user = ChatUserManager.getChatUser(player.getUniqueId()); TagResolver placeholders = TagResolver.resolver( Placeholder.component("sender", user.getDisplayName()), -// Placeholder.component("sendername", player.name()), + Placeholder.parsed("sendername", player.getName()), Placeholder.component("prefix", user.getPrefix()), Placeholder.component("prefixall", user.getPrefixAll()), Placeholder.component("staffprefix", user.getStaffPrefix()), Placeholder.component("message", message) ); - return Utility.parseMiniMessage(Config.CHATFORMAT.replaceAll("", player.getName()), placeholders); + return Utility.parseMiniMessage(Config.CHATFORMAT, placeholders); + } + + private Component parseMessageContent(Player player, String rawMessage) { + TagResolver.Builder tagResolver = TagResolver.builder(); + + Utility.formattingPerms.forEach((perm, pair) -> { + if (player.hasPermission(perm)) { + tagResolver.resolver(pair.getX()); + } + }); + + MiniMessage miniMessage = MiniMessage.builder().tags(tagResolver.build()).build(); + Component component = miniMessage.deserialize(rawMessage); + for(ChatFilter chatFilter : RegexManager.getEmoteFilters()) { + component = component.replaceText( + TextReplacementConfig.builder() + .times(Config.EMOTELIMIT) + .match(chatFilter.getRegex()) + .replacement(chatFilter.getReplacement()).build()); + } + + component = component + .replaceText( + TextReplacementConfig.builder() + .once() + .matchLiteral("[i]") + .replacement(ChatHandler.itemComponent(player.getInventory().getItemInMainHand())) + .build()); + + return component; + } } \ No newline at end of file