feat: use chat types from registry & some other refactors in ChatPlugin

past me didn't know that you don't have to define `bool` shit
This commit is contained in:
Chayapak 2025-03-24 10:37:18 +07:00
parent 15c8301f65
commit bfbed35c06
Signed by: ChomeNS
SSH key fingerprint: SHA256:0YoxhdyXsgbc0nfeB2N6FYE60mxMU7DS4uCUMaw2mvA
2 changed files with 85 additions and 55 deletions
build-number.txt
src/main/java/me/chayapak1/chomens_bot/plugins

View file

@ -1 +1 @@
2113
2125

View file

@ -5,24 +5,31 @@ import me.chayapak1.chomens_bot.chatParsers.CreayunChatParser;
import me.chayapak1.chomens_bot.chatParsers.KaboomChatParser;
import me.chayapak1.chomens_bot.chatParsers.MinecraftChatParser;
import me.chayapak1.chomens_bot.chatParsers.U203aChatParser;
import me.chayapak1.chomens_bot.data.player.PlayerEntry;
import me.chayapak1.chomens_bot.data.team.Team;
import me.chayapak1.chomens_bot.data.chat.ChatParser;
import me.chayapak1.chomens_bot.data.chat.PlayerMessage;
import me.chayapak1.chomens_bot.data.player.PlayerEntry;
import me.chayapak1.chomens_bot.data.team.Team;
import me.chayapak1.chomens_bot.util.ComponentUtilities;
import me.chayapak1.chomens_bot.util.IllegalCharactersUtilities;
import me.chayapak1.chomens_bot.util.UUIDUtilities;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TranslatableComponent;
import net.kyori.adventure.text.renderer.TranslatableComponentRenderer;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtType;
import org.geysermc.mcprotocollib.network.Session;
import org.geysermc.mcprotocollib.network.packet.Packet;
import org.geysermc.mcprotocollib.protocol.data.game.RegistryEntry;
import org.geysermc.mcprotocollib.protocol.packet.configuration.clientbound.ClientboundRegistryDataPacket;
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundDisguisedChatPacket;
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundPlayerChatPacket;
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket;
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.ServerboundChatCommandPacket;
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.ServerboundChatPacket;
import org.jetbrains.annotations.NotNull;
import java.time.Instant;
import java.util.*;
@ -32,14 +39,20 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChatPlugin extends Bot.Listener {
public final Pattern CHAT_SPLIT_PATTERN;
public static final Pattern COLOR_CODE_PATTERN = Pattern.compile("(&[a-f0-9rlonmk])", Pattern.MULTILINE);
public static final Pattern COLOR_CODE_END_PATTERN = Pattern.compile("^.*&[a-f0-9rlonmk]$", Pattern.MULTILINE);
private static final String CHAT_TYPE_REGISTRY_KEY = "minecraft:chat_type";
private static final ChatTypeComponentRenderer CHAT_TYPE_COMPONENT_RENDERER = new ChatTypeComponentRenderer();
private final Bot bot;
public final Pattern CHAT_SPLIT_PATTERN;
private final List<ChatParser> chatParsers;
public final List<Component> chatTypes = new ArrayList<>();
private final ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
public final int queueDelay;
@ -54,7 +67,7 @@ public class ChatPlugin extends Bot.Listener {
bot.addListener(this);
chatParsers = new ArrayList<>();
chatParsers = Collections.synchronizedList(new ArrayList<>());
chatParsers.add(new MinecraftChatParser(bot));
chatParsers.add(new KaboomChatParser(bot));
chatParsers.add(new U203aChatParser(bot));
@ -65,9 +78,10 @@ public class ChatPlugin extends Bot.Listener {
@Override
public void packetReceived (Session session, Packet packet) {
if (packet instanceof ClientboundSystemChatPacket) packetReceived((ClientboundSystemChatPacket) packet);
else if (packet instanceof ClientboundPlayerChatPacket) packetReceived((ClientboundPlayerChatPacket) packet);
else if (packet instanceof ClientboundDisguisedChatPacket) packetReceived((ClientboundDisguisedChatPacket) packet);
if (packet instanceof ClientboundSystemChatPacket t_packet) packetReceived(t_packet);
else if (packet instanceof ClientboundPlayerChatPacket t_packet) packetReceived(t_packet);
else if (packet instanceof ClientboundDisguisedChatPacket t_packet) packetReceived(t_packet);
else if (packet instanceof ClientboundRegistryDataPacket t_packet) packetReceived(t_packet);
}
public void packetReceived (ClientboundSystemChatPacket packet) {
@ -106,43 +120,60 @@ public class ChatPlugin extends Bot.Listener {
final String ansi = ComponentUtilities.stringifyAnsi(component);
for (Listener listener : listeners) {
final boolean bool1 = listener.systemMessageReceived(component, string, ansi);
if (!listener.systemMessageReceived(component, string, ansi)) break;
if (!bool1) break;
if (playerMessage != null && !listener.playerMessageReceived(playerMessage)) break;
}
}
if (playerMessage != null) {
final boolean bool2 = listener.playerMessageReceived(playerMessage);
private void packetReceived (ClientboundRegistryDataPacket packet) {
if (!packet.getRegistry().key().equals(Key.key(CHAT_TYPE_REGISTRY_KEY))) return;
if (!bool2) break;
}
for (RegistryEntry entry : packet.getEntries()) {
final NbtMap data = entry.getData();
if (data == null) continue;
final NbtMap chat = data.getCompound("chat");
if (chat == null) continue;
final String translation = chat.getString("translation_key");
final List<String> parameters = chat.getList("parameters", NbtType.STRING);
// styles?
final Component component = Component.translatable(
translation,
parameters
.stream()
.map(Component::text) // will be replaced later
.toList()
);
chatTypes.add(component);
}
}
private Component getComponentByChatType (int chatType, Component name, Component message) {
// maybe use the registry in the login packet? too lazy.,.,,.
return switch (chatType) {
case 0 -> Component.translatable("chat.type.text", name, message); // normal vanilla chat message
case 1 -> Component.translatable("chat.type.emote", name, message); // /me
case 2 -> Component.translatable("commands.message.display.incoming", name, message); // player that received /w message
case 3 -> Component.translatable("commands.message.display.outgoing", name, message); // player that sent /w message
case 4 -> Component.translatable("%s", name, message); // paper chat type thingy
case 5 -> Component.translatable("chat.type.announcement", name, message); // /say
case 6, 7 -> {
final Team botTeam = bot.team.findTeamByMember(bot.profile.getName());
final Component type = chatTypes.get(chatType);
if (type == null) return null;
if (botTeam == null) yield null;
final Component botTeamDisplayName = Component
final Team botTeam = bot.team.findTeamByMember(bot.profile.getName());
final Component botTeamDisplayName = botTeam == null ?
Component.empty() :
Component
.translatable("chat.square_brackets")
.arguments(botTeam.displayName)
.style(botTeam.colorToStyle());
yield chatType == 6 ?
Component.translatable("chat.type.team.text", botTeamDisplayName, name, message) : // player that received /teammsg message (type 6)
Component.translatable("chat.type.team.sent", botTeamDisplayName, name, message); // player that sent /teammsg message (type 7)
}
default -> null;
};
return CHAT_TYPE_COMPONENT_RENDERER.render(
type,
new ChatTypeContext(
botTeamDisplayName,
name,
message
)
);
}
public void packetReceived (ClientboundPlayerChatPacket packet) {
@ -161,9 +192,7 @@ public class ChatPlugin extends Bot.Listener {
final Component unsignedContent = packet.getUnsignedContent();
for (Listener listener : listeners) {
final boolean bool = listener.playerMessageReceived(playerMessage);
if (!bool) break;
if (!listener.playerMessageReceived(playerMessage)) break;
final Component chatTypeComponent = getComponentByChatType(packet.getChatType().id(), playerMessage.displayName, playerMessage.contents);
@ -171,16 +200,12 @@ public class ChatPlugin extends Bot.Listener {
final String string = ComponentUtilities.stringify(chatTypeComponent);
final String ansi = ComponentUtilities.stringifyAnsi(chatTypeComponent);
final boolean _bool = listener.systemMessageReceived(chatTypeComponent, string, ansi);
if (!_bool) break;
if (!listener.systemMessageReceived(chatTypeComponent, string, ansi)) break;
} else {
final String string = ComponentUtilities.stringify(unsignedContent);
final String ansi = ComponentUtilities.stringifyAnsi(unsignedContent);
final boolean _bool = listener.systemMessageReceived(unsignedContent, string, ansi);
if (!_bool) break;
if (!listener.systemMessageReceived(unsignedContent, string, ansi)) break;
}
}
}
@ -203,9 +228,7 @@ public class ChatPlugin extends Bot.Listener {
final String ansi = ComponentUtilities.stringifyAnsi(chatTypeComponent);
for (Listener listener : listeners) {
final boolean bool = listener.systemMessageReceived(chatTypeComponent, string, ansi);
if (!bool) break;
if (!listener.systemMessageReceived(chatTypeComponent, string, ansi)) break;
}
for (ChatParser parser : chatParsers) {
@ -216,9 +239,7 @@ public class ChatPlugin extends Bot.Listener {
final PlayerMessage playerMessage = new PlayerMessage(parsed.sender, packet.getName(), parsed.contents);
for (Listener listener : listeners) {
final boolean bool = listener.playerMessageReceived(playerMessage);
if (!bool) break;
if (!listener.playerMessageReceived(playerMessage)) break;
}
}
} else {
@ -230,13 +251,8 @@ public class ChatPlugin extends Bot.Listener {
final String ansi = ComponentUtilities.stringifyAnsi(component);
for (Listener listener : listeners) {
final boolean bool1 = listener.playerMessageReceived(playerMessage);
if (!bool1) break;
final boolean bool2 = listener.systemMessageReceived(component, string, ansi);
if (!bool2) break;
if (!listener.playerMessageReceived(playerMessage)) break;
if (!listener.systemMessageReceived(component, string, ansi)) break;
}
}
} catch (Exception e) {
@ -371,4 +387,18 @@ public class ChatPlugin extends Bot.Listener {
default boolean playerMessageReceived (PlayerMessage message) { return true; }
default boolean systemMessageReceived (Component component, String string, String ansi) { return true; }
}
private record ChatTypeContext (Component target, Component sender, Component content) {}
private static class ChatTypeComponentRenderer extends TranslatableComponentRenderer<ChatTypeContext> {
@Override
protected @NotNull Component renderText (@NotNull TextComponent component, @NotNull ChatTypeContext context) {
return switch (component.content()) {
case "target" -> context.target();
case "sender" -> context.sender();
case "content" -> context.content();
default -> component;
};
}
}
}