From ce2aee857dc6d500b9639fea72a0b8eb8ba4ce29 Mon Sep 17 00:00:00 2001 From: Xujiayao Date: Sun, 22 Mar 2026 16:51:41 +0800 Subject: [PATCH] Sum --- .../server/discord/DiscordEventHandler.java | 1 + .../DiscordMessageParser.java | 4 +- .../message/MinecraftMessageParser.java | 9 ++++ .../resources/config/config_single_server.yml | 4 +- .../resources/config/config_standalone.yml | 4 +- .../config/custom_messages/en_us.yml | 43 +++++++++++++------ .../config/custom_messages/zh_cn.yml | 43 +++++++++++++------ core/src/main/resources/lang/en_us.yml | 6 +-- .../events/MinecraftEventHandler.java | 33 +++++++------- .../minecraft/events/MinecraftEvents.java | 10 +++-- .../minecraft/mixins/MixinTellRawCommand.java | 27 +++++++----- 11 files changed, 119 insertions(+), 65 deletions(-) rename core/src/main/java/com/xujiayao/discord_mc_chat/server/{discord => message}/DiscordMessageParser.java (99%) create mode 100644 core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordEventHandler.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordEventHandler.java index 36b8b566..6b5f6c34 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordEventHandler.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordEventHandler.java @@ -5,6 +5,7 @@ import com.xujiayao.discord_mc_chat.commands.impl.StatsCommand; import com.xujiayao.discord_mc_chat.network.NetworkManager; import com.xujiayao.discord_mc_chat.network.packets.events.DiscordEventPacket; import com.xujiayao.discord_mc_chat.network.packets.events.TextSegment; +import com.xujiayao.discord_mc_chat.server.message.DiscordMessageParser; import com.xujiayao.discord_mc_chat.utils.LogFileUtils; import com.xujiayao.discord_mc_chat.utils.config.ConfigManager; import com.xujiayao.discord_mc_chat.utils.i18n.I18nManager; diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordMessageParser.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/DiscordMessageParser.java similarity index 99% rename from core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordMessageParser.java rename to core/src/main/java/com/xujiayao/discord_mc_chat/server/message/DiscordMessageParser.java index f7b4cd40..5c033371 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordMessageParser.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/DiscordMessageParser.java @@ -1,4 +1,4 @@ -package com.xujiayao.discord_mc_chat.server.discord; +package com.xujiayao.discord_mc_chat.server.message; import com.fasterxml.jackson.databind.JsonNode; import com.xujiayao.discord_mc_chat.network.packets.events.TextSegment; @@ -1631,7 +1631,7 @@ public class DiscordMessageParser { * @param member The Discord member (may be null). * @return The hex color string (e.g. "#FF0000"), or "white" if no role color. */ - static String getRoleColorHex(Member member) { + public static String getRoleColorHex(Member member) { if (member == null) { return "white"; } diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java new file mode 100644 index 00000000..96f650cf --- /dev/null +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java @@ -0,0 +1,9 @@ +package com.xujiayao.discord_mc_chat.server.message; + +/** + * TODO + * + * @author Xujiayao + */ +public class MinecraftMessageParser { +} diff --git a/core/src/main/resources/config/config_single_server.yml b/core/src/main/resources/config/config_single_server.yml index f21dbc93..c4bfa4aa 100644 --- a/core/src/main/resources/config/config_single_server.yml +++ b/core/src/main/resources/config/config_single_server.yml @@ -87,11 +87,11 @@ message_parsing: mentions: true hyperlinks: true timestamps: true - # Once enabled, ci.cancel() [PlayerChat, SourceSay, SourceTellRaw, SourceMsg, SourceMe] + # Once enabled, ci.cancel() [PlayerChat, SourceSay, SourceMsg, SourceMe] # to prevent the original message from being processed by Minecraft, and instead broadcast # the parsed message back (including the sender's own client). # --- - # So, enabling this = enabling [player.chat, source.say, source.tell_raw, source.msg, source.me] + # So, enabling this = enabling [player.chat, source.say, source.msg, source.me] # for the source DMCC client. overwrite_minecraft_source_messages: false diff --git a/core/src/main/resources/config/config_standalone.yml b/core/src/main/resources/config/config_standalone.yml index 67f2ef0b..9ae9b611 100644 --- a/core/src/main/resources/config/config_standalone.yml +++ b/core/src/main/resources/config/config_standalone.yml @@ -121,11 +121,11 @@ message_parsing: mentions: true hyperlinks: true timestamps: true - # Once enabled, ci.cancel() [PlayerChat, SourceSay, SourceTellRaw, SourceMsg, SourceMe] + # Once enabled, ci.cancel() [PlayerChat, SourceSay, SourceMsg, SourceMe] # to prevent the original message from being processed by Minecraft, and instead broadcast # the parsed message back (including the sender's own client). # --- - # So, enabling this = enabling [player.chat, source.say, source.tell_raw, source.msg, source.me] + # So, enabling this = enabling [player.chat, source.say, source.msg, source.me] # for the source DMCC client. overwrite_minecraft_source_messages: false diff --git a/core/src/main/resources/config/custom_messages/en_us.yml b/core/src/main/resources/config/custom_messages/en_us.yml index 6d01115c..68b3037f 100644 --- a/core/src/main/resources/config/custom_messages/en_us.yml +++ b/core/src/main/resources/config/custom_messages/en_us.yml @@ -34,18 +34,37 @@ xxxxx_to_minecraft: # for both discord_to_minecraft and minecraft_to_minecraft bold: false color: "gray" -single_server_overwrite: - user_message: - - text: "<{effective_name}> " - bold: false - color: "{role_color}" - - text: "{message}" - bold: false - color: "gray" - system_message: - - text: "{message}" - bold: false - color: "gray" +overwrite: + standalone: + user_message: + - text: "[{server}] " + bold: true + color: "{server_color}" + - text: "<{display_name}> " + bold: false + color: "{role_color}" + - text: "{message}" + bold: false + color: "white" + system_message: + - text: "[{server}] " + bold: true + color: "{server_color}" + - text: "{message}" + bold: false + color: "white" + single_server: + user_message: + - text: "<{display_name}> " + bold: false + color: "{role_color}" + - text: "{message}" + bold: false + color: "white" + system_message: + - text: "{message}" + bold: false + color: "white" discord_to_minecraft: mentioned: "{effective_name} mentioned you!" diff --git a/core/src/main/resources/config/custom_messages/zh_cn.yml b/core/src/main/resources/config/custom_messages/zh_cn.yml index 3edcf6ea..32e8ad55 100644 --- a/core/src/main/resources/config/custom_messages/zh_cn.yml +++ b/core/src/main/resources/config/custom_messages/zh_cn.yml @@ -34,18 +34,37 @@ xxxxx_to_minecraft: # for both discord_to_minecraft and minecraft_to_minecraft bold: false color: "gray" -single_server_overwrite: - user_message: - - text: "<{effective_name}> " - bold: false - color: "{role_color}" - - text: "{message}" - bold: false - color: "gray" - system_message: - - text: "{message}" - bold: false - color: "gray" +overwrite: + standalone: + user_message: + - text: "[{server}] " + bold: true + color: "{server_color}" + - text: "<{display_name}> " + bold: false + color: "{role_color}" + - text: "{message}" + bold: false + color: "white" + system_message: + - text: "[{server}] " + bold: true + color: "{server_color}" + - text: "{message}" + bold: false + color: "white" + single_server: + user_message: + - text: "<{display_name}> " + bold: false + color: "{role_color}" + - text: "{message}" + bold: false + color: "white" + system_message: + - text: "{message}" + bold: false + color: "white" discord_to_minecraft: mentioned: "{effective_name} 提及了你!" diff --git a/core/src/main/resources/lang/en_us.yml b/core/src/main/resources/lang/en_us.yml index 03008627..ed6af263 100644 --- a/core/src/main/resources/lang/en_us.yml +++ b/core/src/main/resources/lang/en_us.yml @@ -33,9 +33,9 @@ commands: dmcc_not_supported: "Executing DMCC commands through \"console\" command is not supported. Please use \"execute\" command." server_not_ready: "Minecraft Server is not ready yet." no_response: | - No response received from DMCC Client. - - This can be normal for certain Minecraft commands. If you expected a response, please check the Minecraft server log by executing "{}" command. + No response received from DMCC Client. + + This can be normal for certain Minecraft commands. If you expected a response, please check the Minecraft server log by executing "{}" command. help: description: "Show a list of available commands" diff --git a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java index b31652c1..37c1d619 100644 --- a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java +++ b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java @@ -153,7 +153,7 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.PlayerJoin.class, event -> { Map placeholders = Map.of( - "user_name", event.serverPlayer().getName().getString(), + "player_name", event.serverPlayer().getName().getString(), "display_name", event.serverPlayer().getDisplayName().getString() ); NetworkManager.sendPacketToServer(new MinecraftEventPacket(MinecraftEventPacket.MessageType.PLAYER_JOIN, placeholders)); @@ -166,7 +166,7 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.PlayerQuit.class, event -> { Map placeholders = Map.of( - "user_name", event.serverPlayer().getName().getString(), + "player_name", event.serverPlayer().getName().getString(), "display_name", event.serverPlayer().getDisplayName().getString() ); NetworkManager.sendPacketToServer(new MinecraftEventPacket(MinecraftEventPacket.MessageType.PLAYER_QUIT, placeholders)); @@ -174,7 +174,7 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.PlayerDie.class, event -> { Map placeholders = Map.of( - "user_name", event.serverPlayer().getName().getString(), + "player_name", event.serverPlayer().getName().getString(), "display_name", event.serverPlayer().getDisplayName().getString(), "death_message", TranslationManager.get(event.serverPlayer().getCombatTracker().getDeathMessage()) ); @@ -195,7 +195,7 @@ public class MinecraftEventHandler { Map placeholders = Map.of( "type", type, - "user_name", event.serverPlayer().getName().getString(), + "player_name", event.serverPlayer().getName().getString(), "display_name", event.serverPlayer().getDisplayName().getString(), "title", TranslationManager.get(displayInfo.getTitle()), "description", TranslationManager.get(displayInfo.getDescription()) @@ -207,7 +207,7 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.PlayerChangeGameMode.class, event -> { Map placeholders = Map.of( - "user_name", event.serverPlayer().getName().getString(), + "player_name", event.serverPlayer().getName().getString(), "display_name", event.serverPlayer().getDisplayName().getString(), "mode", TranslationManager.get(event.gameType().getLongDisplayName()) ); @@ -216,7 +216,8 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.PlayerChat.class, event -> { Map placeholders = Map.of( - "user_name", event.serverPlayer().getName().getString(), + "player_uuid", event.serverPlayer().getStringUUID(), + "player_name", event.serverPlayer().getName().getString(), "display_name", event.serverPlayer().getDisplayName().getString(), "message", TranslationManager.get(event.playerChatMessage().decoratedContent()) ); @@ -225,7 +226,8 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.PlayerCommand.class, event -> { Map placeholders = Map.of( - "user_name", event.serverPlayer().getName().getString(), + "player_uuid", event.serverPlayer().getStringUUID(), + "player_name", event.serverPlayer().getName().getString(), "display_name", event.serverPlayer().getDisplayName().getString(), "command", "/" + event.command() ); @@ -234,7 +236,8 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.SourceSay.class, event -> { Map placeholders = Map.of( - "user_name", event.commandContext().getSource().getTextName(), + "player_uuid", event.commandContext().getSource().getEntity() instanceof ServerPlayer player ? player.getStringUUID() : "", + "player_name", event.commandContext().getSource().getTextName(), "display_name", event.commandContext().getSource().getDisplayName().getString(), "message", TranslationManager.get(event.playerChatMessage().decoratedContent()) ); @@ -242,19 +245,13 @@ public class MinecraftEventHandler { }); EventManager.register(MinecraftEvents.SourceTellRaw.class, event -> { - String input = event.commandContext().getInput(); - String rawMessage = input.substring("tellraw @a ".length()); - Map placeholders = Map.of( - "user_name", event.commandContext().getSource().getTextName(), - "display_name", event.commandContext().getSource().getDisplayName().getString(), - "message", rawMessage - ); - NetworkManager.sendPacketToServer(new MinecraftEventPacket(MinecraftEventPacket.MessageType.SOURCE_TELL_RAW, placeholders)); + // TODO Rewrite }); EventManager.register(MinecraftEvents.SourceMsg.class, event -> { Map placeholders = Map.of( - "user_name", event.commandContext().getSource().getTextName(), + "player_uuid", event.commandContext().getSource().getEntity() instanceof ServerPlayer player ? player.getStringUUID() : "", + "player_name", event.commandContext().getSource().getTextName(), "display_name", event.commandContext().getSource().getDisplayName().getString(), "message", TranslationManager.get(event.playerChatMessage().decoratedContent()) ); @@ -263,7 +260,7 @@ public class MinecraftEventHandler { EventManager.register(MinecraftEvents.SourceMe.class, event -> { Map placeholders = Map.of( - "user_name", event.commandContext().getSource().getTextName(), + "player_name", event.commandContext().getSource().getTextName(), "display_name", event.commandContext().getSource().getDisplayName().getString(), "action", TranslationManager.get(event.playerChatMessage().decoratedContent()) ); diff --git a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java index 0f801711..c688897f 100644 --- a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java +++ b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java @@ -6,6 +6,7 @@ import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementProgress; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.Connection; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.PlayerChatMessage; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -116,7 +117,8 @@ public class MinecraftEvents { * Posted when the /tellraw command is used. */ public record SourceTellRaw( - CommandContext commandContext + CommandContext commandContext, + Component component ) { } @@ -124,9 +126,9 @@ public class MinecraftEvents { * Posted when the /msg, /tell, /w command is used. */ public record SourceMsg( - CommandContext commandContext, - PlayerChatMessage playerChatMessage - ) { + CommandContext commandContext, + PlayerChatMessage playerChatMessage + ) { } /** diff --git a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinTellRawCommand.java b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinTellRawCommand.java index 9b35da6b..ba307ec5 100644 --- a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinTellRawCommand.java +++ b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinTellRawCommand.java @@ -1,17 +1,22 @@ package com.xujiayao.discord_mc_chat.minecraft.mixins; import com.mojang.brigadier.context.CommandContext; -import com.xujiayao.discord_mc_chat.Constants; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.xujiayao.discord_mc_chat.minecraft.events.MinecraftEvents; import com.xujiayao.discord_mc_chat.utils.events.EventManager; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.ComponentArgument; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.chat.Component; import net.minecraft.server.commands.TellRawCommand; +import net.minecraft.server.level.ServerPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Optional; import java.util.regex.Pattern; /** @@ -23,17 +28,19 @@ public class MixinTellRawCommand { @Unique private static final Pattern TELLRAW_PATTERN = Pattern.compile("^tellraw @a .*"); - @Inject(method = "lambda$register$0", at = @At("HEAD"), cancellable = true) - private static void lambda$register$0(CommandContext commandContext, CallbackInfoReturnable cir) { + @Inject(method = "lambda$register$0", at = @At("HEAD")) + private static void lambda$register$0(CommandContext commandContext, CallbackInfoReturnable cir) throws CommandSyntaxException { if (TELLRAW_PATTERN.matcher(commandContext.getInput()).matches()) { - // SourceTellRaw Event - EventManager.post(new MinecraftEvents.SourceTellRaw( - commandContext - )); + Optional optional = EntityArgument.getPlayers(commandContext, "targets").stream().findFirst(); + if (optional.isPresent()) { + ServerPlayer player = optional.get(); + Component component = ComponentArgument.getResolvedComponent(commandContext, "message", player); - if (Constants.OVERWRITE_MINECRAFT_SOURCE_MESSAGES.get()) { - cir.setReturnValue(1); - cir.cancel(); + // SourceTellRaw Event + EventManager.post(new MinecraftEvents.SourceTellRaw( + commandContext, + component + )); } } }