diff --git a/CHANGELOG.md b/CHANGELOG.md index 96c68fb..1e19b0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.4.1] - 2025-07-09 +### Changed +- Log full exception and argument when unable to fetch/set skin +### Fixed +- Fixed mojang provider using offline uuids when unable to fetch actual uuid resulting in `no profile with uuid` error + ## [2.4.0] - 2025-07-05 ### Fixed - Added support for player heads diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index fce5a47..b1a2a73 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -1,2 +1,4 @@ -### Added -- Added support for player heads +### Changed +- Log full exception and argument when unable to fetch/set skin +### Fixed +- Fixed mojang provider using offline uuids when unable to fetch actual uuid resulting in `no profile with uuid` error diff --git a/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java b/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java index 334d5bd..ee5393d 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java +++ b/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java @@ -1,10 +1,12 @@ package net.lionarius.skinrestorer; +import com.google.common.base.Throwables; import com.mojang.authlib.GameProfile; import com.mojang.brigadier.CommandDispatcher; import net.lionarius.skinrestorer.command.SkinCommand; import net.lionarius.skinrestorer.config.Config; import net.lionarius.skinrestorer.config.provider.BuiltInProviderConfig; +import net.lionarius.skinrestorer.exception.TransparentException; import net.lionarius.skinrestorer.platform.Services; import net.lionarius.skinrestorer.skin.SkinIO; import net.lionarius.skinrestorer.skin.SkinStorage; @@ -147,7 +149,7 @@ public final class SkinRestorer { var skinResult = result.get(); if (skinResult.isError()) - return Result., String>error(skinResult.getErrorValue().getMessage()); + throw new TransparentException(Throwables.getRootCause(skinResult.getErrorValue())); var skinValue = SkinValue.fromProviderContextWithValue(context, skinResult.getSuccessValue().orElse(null)); @@ -156,7 +158,7 @@ public final class SkinRestorer { return Result., String>success(acceptedPlayers); }, server) .exceptionally(e -> { - SkinRestorer.LOGGER.error(e.toString()); + SkinRestorer.LOGGER.error("Failed to set skin '{}:{}'", context.name(), context.argument(), e); return Result.error(e.getMessage()); }); } diff --git a/common/src/main/java/net/lionarius/skinrestorer/exception/TransparentException.java b/common/src/main/java/net/lionarius/skinrestorer/exception/TransparentException.java new file mode 100644 index 0000000..1f439bf --- /dev/null +++ b/common/src/main/java/net/lionarius/skinrestorer/exception/TransparentException.java @@ -0,0 +1,19 @@ +package net.lionarius.skinrestorer.exception; + +import org.jetbrains.annotations.NotNull; + +public class TransparentException extends RuntimeException { + public TransparentException(@NotNull Throwable cause) { + super(cause); + } + + @Override + public String getMessage() { + return this.getCause().getMessage(); + } + + @Override + public String toString() { + return this.getLocalizedMessage(); + } +} diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java index a8c7119..39d88da 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java @@ -86,7 +86,7 @@ public abstract class ServerLoginPacketListenerImplMixin { var value = SkinValue.fromProviderContextWithValue(context, result.getSuccessValue().orElse(null)); SkinRestorer.getSkinStorage().setSkin(profile.getId(), value); } else { - SkinRestorer.LOGGER.warn("Failed to fetch skin: {}", result.getErrorValue().getMessage()); + SkinRestorer.LOGGER.warn("Failed to fetch skin '{}:{}'", context.name(), context.argument(), result.getErrorValue()); } } } diff --git a/common/src/main/java/net/lionarius/skinrestorer/skin/provider/MojangSkinProvider.java b/common/src/main/java/net/lionarius/skinrestorer/skin/provider/MojangSkinProvider.java index 5c75776..9b33f63 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/skin/provider/MojangSkinProvider.java +++ b/common/src/main/java/net/lionarius/skinrestorer/skin/provider/MojangSkinProvider.java @@ -9,6 +9,7 @@ import com.mojang.authlib.properties.Property; import com.mojang.authlib.yggdrasil.YggdrasilEnvironment; import com.mojang.authlib.yggdrasil.response.MinecraftProfilePropertiesResponse; import net.lionarius.skinrestorer.SkinRestorer; +import net.lionarius.skinrestorer.exception.TransparentException; import net.lionarius.skinrestorer.skin.SkinVariant; import net.lionarius.skinrestorer.util.*; import net.minecraft.server.players.GameProfileCache; @@ -51,7 +52,7 @@ public final class MojangSkinProvider implements SkinProvider { var profile = MojangSkinProvider.getProfile(name); callback.onProfileLookupSucceeded(profile); } catch (IOException e) { - callback.onProfileLookupFailed(new GameProfile(null, name), e); + throw new TransparentException(e); } } }, SkinRestorer.getConfigDir().resolve(PROFILE_CACHE_FILENAME).toFile()); diff --git a/gradle.properties b/gradle.properties index af6f5ab..351c121 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ minecraft_version_list=1.19.4 minecraft_version_range=[1.19.4,1.20) mod_id=skinrestorer mod_name=SkinRestorer -mod_version=2.4.0 +mod_version=2.4.1 mod_author=Lionarius mod_homepage=https://modrinth.com/mod/skinrestorer mod_sources=https://github.com/Suiranoil/SkinRestorer