From bf495edd420ee8c7940d9d546a6b56667612833b Mon Sep 17 00:00:00 2001 From: Xujiayao Date: Thu, 25 Jul 2024 17:46:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=89=80=E6=9C=89=E4=BD=BF?= =?UTF-8?q?=E7=94=A8GameProfile=E4=B8=AD=E7=9A=84textures=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=AE=9E=E6=97=B6=E7=9A=AE=E8=82=A4=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E7=BB=84=20/=20=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #222 Fixes #228 --- .../com/xujiayao/discord_mc_chat/Config.java | 4 +-- .../minecraft/MinecraftEventListener.java | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/xujiayao/discord_mc_chat/Config.java b/src/main/java/com/xujiayao/discord_mc_chat/Config.java index 871ebcec..3e8b1a0b 100644 --- a/src/main/java/com/xujiayao/discord_mc_chat/Config.java +++ b/src/main/java/com/xujiayao/discord_mc_chat/Config.java @@ -34,9 +34,7 @@ public static class Generic { public String consoleLogChannelId = ""; public String updateNotificationChannelId = ""; - public boolean useUuidInsteadOfName = true; - - public String avatarApi = "https://mc-heads.net/avatar/%player%.png"; + public String avatarApi = "https://mc-heads.net/avatar/{player_uuid}.png"; public boolean broadcastPlayerCommandExecution = true; public boolean broadcastSlashCommandExecution = true; diff --git a/src/main/java/com/xujiayao/discord_mc_chat/minecraft/MinecraftEventListener.java b/src/main/java/com/xujiayao/discord_mc_chat/minecraft/MinecraftEventListener.java index b6e51268..25460ead 100644 --- a/src/main/java/com/xujiayao/discord_mc_chat/minecraft/MinecraftEventListener.java +++ b/src/main/java/com/xujiayao/discord_mc_chat/minecraft/MinecraftEventListener.java @@ -18,6 +18,7 @@ //$$ import net.minecraft.network.chat.TextComponent; //#endif import net.minecraft.network.chat.contents.TranslatableContents; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.GameRules; import okhttp3.MediaType; import okhttp3.Request; @@ -27,7 +28,10 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.List; +import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; import java.util.concurrent.ExecutorService; @@ -152,7 +156,7 @@ public static void init() { } if (CONFIG.generic.broadcastChatMessages) { - sendDiscordMessage(contentToDiscord, Objects.requireNonNull(player.getDisplayName()).getString(), CONFIG.generic.avatarApi.replace("%player%", (CONFIG.generic.useUuidInsteadOfName ? player.getUUID().toString() : player.getDisplayName().getString()))); + sendDiscordMessage(contentToDiscord, Objects.requireNonNull(player.getDisplayName()).getString(), getAvatarUrl(player)); if (CONFIG.multiServer.enable) { MULTI_SERVER.sendMessage(false, true, false, Objects.requireNonNull(player.getDisplayName()).getString(), CONFIG.generic.formatChatMessages ? contentToMinecraft : message); } @@ -196,7 +200,7 @@ public static void init() { //$$ SERVER.sendMessage(message); //#endif - sendDiscordMessage(MarkdownSanitizer.escape(command), Objects.requireNonNull(player.getDisplayName()).getString(), CONFIG.generic.avatarApi.replace("%player%", (CONFIG.generic.useUuidInsteadOfName ? player.getUUID().toString() : player.getDisplayName().getString()))); + sendDiscordMessage(MarkdownSanitizer.escape(command), Objects.requireNonNull(player.getDisplayName()).getString(), getAvatarUrl(player)); if (CONFIG.multiServer.enable) { MULTI_SERVER.sendMessage(false, true, false, player.getDisplayName().getString(), MarkdownSanitizer.escape(command)); } @@ -330,4 +334,30 @@ private static void sendDiscordMessage(String content, String username, String a executor.shutdown(); } } + + // {player_name} conflicts with nickname-changing mods + // TODO Move to Placeholder class + private static String getAvatarUrl(Player player) { + String hash = "null"; + if (CONFIG.generic.avatarApi.contains("{player_textures}")) { + try { + //#if MC > 12001 + String textures = player.getGameProfile().getProperties().get("textures").iterator().next().value(); + //#else + //$$ String textures = player.getGameProfile().getProperties().get("textures").iterator().next().getValue(); + //#endif + + JsonObject json = new Gson().fromJson(new String(Base64.getDecoder().decode(textures), StandardCharsets.UTF_8), JsonObject.class); + String url = json.getAsJsonObject("textures").getAsJsonObject("SKIN").get("url").getAsString(); + + hash = url.replace("http://textures.minecraft.net/texture/", ""); + } catch (NoSuchElementException ignored) { + } + } + + return CONFIG.generic.avatarApi + .replace("{player_uuid}", player.getUUID().toString()) + .replace("{player_name}", Objects.requireNonNull(player.getDisplayName()).getString()) + .replace("{player_textures}", hash); + } }