Plex/server/src/main/java/dev/plex/listener/impl/ChatListener.java

114 lines
4.8 KiB
Java
Raw Normal View History

2021-01-03 07:21:15 +00:00
package dev.plex.listener.impl;
2023-08-30 03:41:15 +00:00
import dev.plex.hook.VaultHook;
2021-01-03 07:21:15 +00:00
import dev.plex.listener.PlexListener;
import dev.plex.listener.annotation.Toggleable;
import dev.plex.meta.PlayerMeta;
2021-01-03 07:21:15 +00:00
import dev.plex.player.PlexPlayer;
import dev.plex.util.PlexUtils;
import dev.plex.util.minimessage.SafeMiniMessage;
2022-08-03 00:03:04 +00:00
import dev.plex.util.redis.MessageUtil;
import io.papermc.paper.chat.ChatRenderer;
import io.papermc.paper.event.player.AsyncChatEvent;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
2023-08-30 03:41:15 +00:00
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TextReplacementConfig;
import net.kyori.adventure.text.event.ClickEvent;
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;
2023-08-28 11:35:32 +00:00
import org.bukkit.event.EventPriority;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.regex.Pattern;
@Toggleable("chat.enabled")
public class ChatListener extends PlexListener
{
2022-08-03 00:03:04 +00:00
public static final TextReplacementConfig URL_REPLACEMENT_CONFIG = TextReplacementConfig
2022-05-20 20:44:25 +00:00
.builder()
.match("(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]")
.replacement((matchResult, builder) -> Component.empty()
.content(matchResult.group())
.clickEvent(ClickEvent.openUrl(
matchResult.group()
))).build();
public static BiConsumer<AsyncChatEvent, PlexPlayer> PRE_RENDERER = ChatListener::defaultChatProcessing;
2022-08-02 12:08:52 +00:00
private final PlexChatRenderer renderer = new PlexChatRenderer();
2022-05-10 05:08:45 +00:00
2023-08-28 11:35:32 +00:00
@EventHandler(priority = EventPriority.LOWEST)
public void onChat(AsyncChatEvent event)
{
2022-08-02 12:08:52 +00:00
PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(event.getPlayer().getUniqueId());
if (plexPlayer.isStaffChat())
{
2023-08-30 03:41:15 +00:00
String prefix = PlexUtils.mmSerialize(VaultHook.getPrefix(event.getPlayer())); // Don't use PlexPlayer#getPrefix because that returns their custom set prefix and not their group's
MessageUtil.sendStaffChat(event.getPlayer(), event.message(), PlexUtils.adminChat(event.getPlayer().getName(), prefix, SafeMiniMessage.mmSerialize(event.message())).toArray(UUID[]::new));
plugin.getServer().getConsoleSender().sendMessage(PlexUtils.messageComponent("adminChatFormat", event.getPlayer().getName(), prefix, SafeMiniMessage.mmSerialize(event.message().replaceText(URL_REPLACEMENT_CONFIG))));
2022-08-03 00:03:04 +00:00
event.setCancelled(true);
return;
}
Component prefix = PlayerMeta.getPrefix(plexPlayer);
2022-05-10 05:08:45 +00:00
2023-08-25 04:24:14 +00:00
if (prefix != null && !prefix.equals(Component.empty()) && !prefix.equals(Component.space()))
2022-02-26 06:24:11 +00:00
{
2022-08-02 12:08:52 +00:00
renderer.hasPrefix = true;
renderer.prefix = prefix;
2022-05-06 04:27:32 +00:00
}
2022-08-02 12:08:52 +00:00
else
{
renderer.hasPrefix = false;
renderer.prefix = null;
}
PRE_RENDERER.accept(event, plexPlayer);
2022-08-02 12:08:52 +00:00
event.renderer(renderer);
}
public static class PlexChatRenderer implements ChatRenderer
{
public boolean hasPrefix;
public Component prefix;
public Supplier<Component> before = null;
@Override
public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer)
{
Component component = Component.empty();
if (before != null)
{
component = component.append(before.get());
}
if (hasPrefix)
{
component = component.append(prefix).append(Component.space());
}
2022-05-20 20:44:25 +00:00
return component
.append(Component.empty())
.append(
source.name().equals(sourceDisplayName) ?
SafeMiniMessage.mmDeserialize(plugin.config.getString("chat.name-color") + SafeMiniMessage.mmSerialize(sourceDisplayName))
: SafeMiniMessage.mmDeserialize(plugin.config.getString("chat.name-color")).append(sourceDisplayName)
)
2022-05-20 20:44:25 +00:00
.append(Component.space())
.append(Component.text("»").color(NamedTextColor.GRAY))
.append(Component.space())
.append(message)
2022-05-20 20:44:25 +00:00
.replaceText(URL_REPLACEMENT_CONFIG);
2021-06-20 08:02:07 +00:00
}
}
private static void defaultChatProcessing(AsyncChatEvent event, PlexPlayer plexPlayer)
{
String text = PlexUtils.getTextFromComponent(event.message());
event.message(PlexUtils.stringToComponent(text));
}
}