Module-Guilds/src/main/java/dev/plex/listener/ChatListener.java
2024-03-06 22:28:16 +11:00

81 lines
2.7 KiB
Java

package dev.plex.listener;
import dev.plex.Guilds;
import dev.plex.guild.GuildMember;
import dev.plex.util.minimessage.SafeMiniMessage;
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;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicReference;
public class ChatListener extends PlexListener
{
private GuildChatRenderer guildChatRenderer = null;
@EventHandler(priority = EventPriority.HIGHEST)
public void onAsyncChat(AsyncChatEvent event)
{
if (event.isCancelled())
{
return;
}
if (guildChatRenderer == null)
{
guildChatRenderer = new GuildChatRenderer(event.renderer());
}
event.renderer(guildChatRenderer);
final Player player = event.getPlayer();
GuildMember member = Guilds.get().getMemberData().getMember(player).orElseThrow();
member.getGuild().ifPresent(guild ->
{
if (member.isChat())
{
guild.chat(player, event.message());
event.setCancelled(true);
}
});
}
private record GuildChatRenderer(ChatRenderer renderer) implements ChatRenderer
{
@Override
public @NotNull Component render(@NotNull Player player, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience audience)
{
Component outcome = Component.empty();
GuildMember member = Guilds.get().getMemberData().getMember(player).orElseThrow();
AtomicReference<String> atomicPrefix = new AtomicReference<>(null);
member.getGuild().ifPresent(guild ->
{
if (guild.isPrefixEnabled())
{
String rankName = "";
if (guild.getRankByMember(member).isPresent())
{
rankName = guild.getRankByMember(member).get().getName();
}
atomicPrefix.set(guild.getPrefix().replace("%rank%", rankName).replace("%name%", guild.getDisplayName()));
}
});
if (atomicPrefix.get() != null && member.isPrefix())
{
outcome = outcome.append(SafeMiniMessage.mmDeserializeWithoutEvents(atomicPrefix.get())).append(Component.space());
}
outcome = outcome.append(renderer.render(player, sourceDisplayName, message, audience));
return outcome;
}
}
}