diff --git a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/DiscordIntegrationMod.java b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/DiscordIntegrationMod.java index f221d99..a090617 100644 --- a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/DiscordIntegrationMod.java +++ b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/DiscordIntegrationMod.java @@ -5,6 +5,7 @@ import de.erdbeerbaerlp.dcintegration.architectury.api.ArchitecturyDiscordEventHandler; import de.erdbeerbaerlp.dcintegration.architectury.command.McCommandDiscord; import de.erdbeerbaerlp.dcintegration.architectury.metrics.Metrics; +import de.erdbeerbaerlp.dcintegration.architectury.util.PlayerTextureUtils; import de.erdbeerbaerlp.dcintegration.architectury.util.SerializeComponentUtils; import de.erdbeerbaerlp.dcintegration.architectury.util.MessageUtilsImpl; import de.erdbeerbaerlp.dcintegration.architectury.util.ServerInterface; @@ -305,12 +306,13 @@ public static PlayerChatMessage handleChatMessage(PlayerChatMessage message, Ser text = MessageUtils.escapeMarkdown(text); if (!Localization.instance().discordChatMessage.isBlank()) if (Configuration.instance().embedMode.enabled && Configuration.instance().embedMode.chatMessages.asEmbed) { - final String avatarURL = INSTANCE.getSkinURL().replace("%uuid%", player.getUUID().toString()).replace("%uuid_dashless%", player.getUUID().toString().replace("-", "")).replace("%name%", player.getName().getString()).replace("%randomUUID%", UUID.randomUUID().toString()); + final String avatarURL = PlayerTextureUtils.getAvatarUrl(player); if (!Configuration.instance().embedMode.chatMessages.customJSON.isBlank()) { final EmbedBuilder b = Configuration.instance().embedMode.chatMessages.toEmbedJson(Configuration.instance().embedMode.chatMessages.customJSON .replace("%uuid%", player.getUUID().toString()) .replace("%uuid_dashless%", player.getUUID().toString().replace("-", "")) .replace("%name%", MessageUtilsImpl.formatPlayerName(player)) + .replace("%texture_hash%", PlayerTextureUtils.getPlayerTextureHash(player)) .replace("%randomUUID%", UUID.randomUUID().toString()) .replace("%avatarURL%", avatarURL) .replace("%msg%", text) diff --git a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/AdvancementMixin.java b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/AdvancementMixin.java index 19de758..9e04521 100644 --- a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/AdvancementMixin.java +++ b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/AdvancementMixin.java @@ -1,6 +1,7 @@ package de.erdbeerbaerlp.dcintegration.architectury.mixin; import de.erdbeerbaerlp.dcintegration.architectury.util.MessageUtilsImpl; +import de.erdbeerbaerlp.dcintegration.architectury.util.PlayerTextureUtils; import de.erdbeerbaerlp.dcintegration.common.DiscordIntegration; import de.erdbeerbaerlp.dcintegration.common.storage.Configuration; import de.erdbeerbaerlp.dcintegration.common.storage.Localization; @@ -42,12 +43,13 @@ public void advancement(AdvancementHolder advancementEntry, String criterionName if (!Localization.instance().advancementMessage.isBlank()) { if (Configuration.instance().embedMode.enabled && Configuration.instance().embedMode.advancementMessage.asEmbed) { - final String avatarURL = INSTANCE.getSkinURL().replace("%uuid%", player.getUUID().toString()).replace("%uuid_dashless%", player.getUUID().toString().replace("-", "")).replace("%name%", player.getName().getString()).replace("%randomUUID%", UUID.randomUUID().toString()); + final String avatarURL = PlayerTextureUtils.getAvatarUrl(player); if (!Configuration.instance().embedMode.advancementMessage.customJSON.isBlank()) { final EmbedBuilder b = Configuration.instance().embedMode.advancementMessage.toEmbedJson(Configuration.instance().embedMode.advancementMessage.customJSON .replace("%uuid%", player.getUUID().toString()) .replace("%uuid_dashless%", player.getUUID().toString().replace("-", "")) .replace("%name%", MessageUtilsImpl.formatPlayerName(player)) + .replace("%texture_hash%", PlayerTextureUtils.getPlayerTextureHash(player)) .replace("%randomUUID%", UUID.randomUUID().toString()) .replace("%avatarURL%", avatarURL) .replace("%advName%", ChatFormatting.stripFormatting(advancement.display().get().getTitle().getString())) diff --git a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/NetworkHandlerMixin.java b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/NetworkHandlerMixin.java index 331c5c5..a29c467 100644 --- a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/NetworkHandlerMixin.java +++ b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/NetworkHandlerMixin.java @@ -3,6 +3,7 @@ import de.erdbeerbaerlp.dcintegration.architectury.DiscordIntegrationMod; import de.erdbeerbaerlp.dcintegration.architectury.util.MessageUtilsImpl; +import de.erdbeerbaerlp.dcintegration.architectury.util.PlayerTextureUtils; import de.erdbeerbaerlp.dcintegration.common.DiscordIntegration; import de.erdbeerbaerlp.dcintegration.common.storage.Configuration; import de.erdbeerbaerlp.dcintegration.common.storage.Localization; @@ -43,7 +44,7 @@ private void onDisconnect(DisconnectionDetails disconnectionDetails, CallbackInf if (reason.equals(Component.translatable("disconnect.timeout"))) DiscordIntegrationMod.timeouts.add(this.player.getUUID()); INSTANCE.callEventC((a)->a.onPlayerLeave(player.getUUID())); - final String avatarURL = INSTANCE.getSkinURL().replace("%uuid%", player.getUUID().toString()).replace("%uuid_dashless%", player.getUUID().toString().replace("-", "")).replace("%name%", player.getName().getString()).replace("%randomUUID%", UUID.randomUUID().toString()); + final String avatarURL = PlayerTextureUtils.getAvatarUrl(player); if (DiscordIntegration.INSTANCE != null && !DiscordIntegrationMod.timeouts.contains(player.getUUID())) { if (!Localization.instance().playerLeave.isBlank()) { if (Configuration.instance().embedMode.enabled && Configuration.instance().embedMode.playerLeaveMessages.asEmbed) { @@ -52,6 +53,7 @@ private void onDisconnect(DisconnectionDetails disconnectionDetails, CallbackInf .replace("%uuid%", player.getUUID().toString()) .replace("%uuid_dashless%", player.getUUID().toString().replace("-", "")) .replace("%name%", MessageUtilsImpl.formatPlayerName(player)) + .replace("%texture_hash%", PlayerTextureUtils.getPlayerTextureHash(player)) .replace("%randomUUID%", UUID.randomUUID().toString()) .replace("%avatarURL%", avatarURL) .replace("%playerColor%", "" + TextColors.generateFromUUID(player.getUUID()).getRGB()) diff --git a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/PlayerManagerMixin.java b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/PlayerManagerMixin.java index 8a1f98c..3f69d84 100644 --- a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/PlayerManagerMixin.java +++ b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/PlayerManagerMixin.java @@ -3,6 +3,7 @@ import dcshadow.net.kyori.adventure.text.Component; import dcshadow.net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import de.erdbeerbaerlp.dcintegration.architectury.util.MessageUtilsImpl; +import de.erdbeerbaerlp.dcintegration.architectury.util.PlayerTextureUtils; import de.erdbeerbaerlp.dcintegration.architectury.util.SerializeComponentUtils; import de.erdbeerbaerlp.dcintegration.common.DiscordIntegration; import de.erdbeerbaerlp.dcintegration.common.WorkThread; @@ -77,12 +78,13 @@ private void onPlayerJoin(Connection connection, ServerPlayer p, CommonListenerC LinkManager.checkGlobalAPI(p.getUUID()); if (!Localization.instance().playerJoin.isBlank()) { if (Configuration.instance().embedMode.enabled && Configuration.instance().embedMode.playerJoinMessage.asEmbed) { - final String avatarURL = INSTANCE.getSkinURL().replace("%uuid%", p.getUUID().toString()).replace("%uuid_dashless%", p.getUUID().toString().replace("-", "")).replace("%name%", p.getName().getString()).replace("%randomUUID%", UUID.randomUUID().toString()); + final String avatarURL = PlayerTextureUtils.getAvatarUrl(p); if (!Configuration.instance().embedMode.playerJoinMessage.customJSON.isBlank()) { final EmbedBuilder b = Configuration.instance().embedMode.playerJoinMessage.toEmbedJson(Configuration.instance().embedMode.playerJoinMessage.customJSON .replace("%uuid%", p.getUUID().toString()) .replace("%uuid_dashless%", p.getUUID().toString().replace("-", "")) .replace("%name%", MessageUtilsImpl.formatPlayerName(p)) + .replace("%texture_hash%", PlayerTextureUtils.getPlayerTextureHash(p)) .replace("%randomUUID%", UUID.randomUUID().toString()) .replace("%avatarURL%", avatarURL) .replace("%playerColor%", "" + TextColors.generateFromUUID(p.getUUID()).getRGB()) diff --git a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/ServerPlayerMixin.java b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/ServerPlayerMixin.java index 8cfa4f9..b8ed907 100644 --- a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/ServerPlayerMixin.java +++ b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/mixin/ServerPlayerMixin.java @@ -1,6 +1,7 @@ package de.erdbeerbaerlp.dcintegration.architectury.mixin; import de.erdbeerbaerlp.dcintegration.architectury.util.MessageUtilsImpl; +import de.erdbeerbaerlp.dcintegration.architectury.util.PlayerTextureUtils; import de.erdbeerbaerlp.dcintegration.common.DiscordIntegration; import de.erdbeerbaerlp.dcintegration.common.storage.Configuration; import de.erdbeerbaerlp.dcintegration.common.storage.Localization; @@ -35,12 +36,13 @@ private void onPlayerDeath(DamageSource s, CallbackInfo info) { final MessageEmbed embed = MessageUtilsImpl.genItemStackEmbedIfAvailable(deathMessage, p.level()); if (!Localization.instance().playerDeath.isBlank()) if (Configuration.instance().embedMode.enabled && Configuration.instance().embedMode.deathMessage.asEmbed) { - final String avatarURL = INSTANCE.getSkinURL().replace("%uuid%", p.getUUID().toString()).replace("%uuid_dashless%", p.getUUID().toString().replace("-", "")).replace("%name%", p.getName().getString()).replace("%randomUUID%", UUID.randomUUID().toString()); + final String avatarURL = PlayerTextureUtils.getAvatarUrl(p); if(!Configuration.instance().embedMode.deathMessage.customJSON.isBlank()){ final EmbedBuilder b = Configuration.instance().embedMode.deathMessage.toEmbedJson(Configuration.instance().embedMode.deathMessage.customJSON .replace("%uuid%", p.getUUID().toString()) .replace("%uuid_dashless%", p.getUUID().toString().replace("-", "")) .replace("%name%", MessageUtilsImpl.formatPlayerName(p)) + .replace("%texture_hash%", PlayerTextureUtils.getPlayerTextureHash(p)) .replace("%randomUUID%", UUID.randomUUID().toString()) .replace("%avatarURL%", avatarURL) .replace("%deathMessage%", ChatFormatting.stripFormatting(deathMessage.getString()).replace(MessageUtilsImpl.formatPlayerName(p) + " ", "")) diff --git a/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/util/PlayerTextureUtils.java b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/util/PlayerTextureUtils.java new file mode 100644 index 0000000..2bfe319 --- /dev/null +++ b/common/src/main/java/de/erdbeerbaerlp/dcintegration/architectury/util/PlayerTextureUtils.java @@ -0,0 +1,35 @@ +package de.erdbeerbaerlp.dcintegration.architectury.util; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import net.minecraft.world.entity.player.Player; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.UUID; + +import static de.erdbeerbaerlp.dcintegration.common.DiscordIntegration.INSTANCE; + +public class PlayerTextureUtils { + static public String getPlayerTextureHash(Player player) { + try { + String textureData = player.getGameProfile().properties().get("textures").iterator().next().value(); + textureData = new String(Base64.getDecoder().decode(textureData), StandardCharsets.UTF_8); + String url = (new Gson()).fromJson(textureData, JsonObject.class).getAsJsonObject("textures").getAsJsonObject("SKIN").get("url").getAsString(); + // remove "http://textures.minecraft.net/texture/" but generically + return url.replaceAll(".*/", ""); + } + catch (Exception e) { + return "null"; + } + } + + static public String getAvatarUrl(Player player) { + return INSTANCE.getSkinURL() + .replace("%uuid%", player.getUUID().toString()) + .replace("%uuid_dashless%", player.getUUID().toString().replace("-", "")) + .replace("%name%", player.getName().getString()) + .replace("%texture_hash%", getPlayerTextureHash(player)) + .replace("%randomUUID%", UUID.randomUUID().toString()); + } +}