mirror of
https://github.com/Suiranoil/SkinRestorer.git
synced 2026-01-16 04:42:12 +00:00
implement mojang profile caching
This commit is contained in:
@@ -4,11 +4,13 @@ import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.properties.Property;
|
||||
import com.mojang.authlib.yggdrasil.response.MinecraftProfilePropertiesResponse;
|
||||
import com.mojang.util.UndashedUuid;
|
||||
import net.lionarius.skinrestorer.SkinRestorer;
|
||||
import net.lionarius.skinrestorer.skin.SkinVariant;
|
||||
import net.lionarius.skinrestorer.util.JsonUtils;
|
||||
import net.lionarius.skinrestorer.util.PlayerUtils;
|
||||
import net.lionarius.skinrestorer.util.Result;
|
||||
import net.lionarius.skinrestorer.util.WebUtils;
|
||||
import net.minecraft.server.players.GameProfileCache;
|
||||
import net.minecraft.util.StringUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -25,6 +27,9 @@ public final class MojangSkinProvider implements SkinProvider {
|
||||
private static final URI API_URI;
|
||||
private static final URI SESSION_SERVER_URI;
|
||||
|
||||
public static final String CACHE_FILENAME = "mojang_profile_cache.json";
|
||||
private static final GameProfileCache PROFILE_CACHE;
|
||||
|
||||
static {
|
||||
try {
|
||||
API_URI = new URI("https://api.mojang.com");
|
||||
@@ -32,6 +37,17 @@ public final class MojangSkinProvider implements SkinProvider {
|
||||
} catch (URISyntaxException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
|
||||
PROFILE_CACHE = new GameProfileCache((names, callback) -> {
|
||||
for (var name : names) {
|
||||
try {
|
||||
var profile = MojangSkinProvider.getProfile(name);
|
||||
callback.onProfileLookupSucceeded(profile);
|
||||
} catch (IOException e) {
|
||||
callback.onProfileLookupFailed(name, e);
|
||||
}
|
||||
}
|
||||
}, SkinRestorer.getConfigDir().resolve(CACHE_FILENAME).toFile());
|
||||
}
|
||||
|
||||
public static SkinProviderContext skinProviderContextFromProfile(GameProfile gameProfile) {
|
||||
@@ -54,9 +70,12 @@ public final class MojangSkinProvider implements SkinProvider {
|
||||
return Result.error(new IllegalArgumentException("invalid username"));
|
||||
|
||||
try {
|
||||
var profile = MojangSkinProvider.getProfile(username);
|
||||
var profileWithProperties = MojangSkinProvider.getProfileWithProperties(profile.getId());
|
||||
var textures = PlayerUtils.getPlayerSkin(profileWithProperties);
|
||||
var cachedProfile = MojangSkinProvider.PROFILE_CACHE.get(username);
|
||||
if (cachedProfile.isEmpty())
|
||||
throw new IllegalArgumentException("no profile found for " + username);
|
||||
|
||||
var profile = MojangSkinProvider.getProfileWithProperties(cachedProfile.get().getId());
|
||||
var textures = PlayerUtils.getPlayerSkin(profile);
|
||||
|
||||
return Result.ofNullable(textures);
|
||||
} catch (Exception e) {
|
||||
|
||||
@@ -3,6 +3,7 @@ package net.lionarius.skinrestorer.util;
|
||||
import net.lionarius.skinrestorer.SkinRestorer;
|
||||
import net.lionarius.skinrestorer.config.Config;
|
||||
import net.lionarius.skinrestorer.skin.SkinIO;
|
||||
import net.lionarius.skinrestorer.skin.provider.MojangSkinProvider;
|
||||
import net.lionarius.skinrestorer.translation.Translation;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
@@ -25,6 +26,7 @@ public final class FileUtils {
|
||||
return Files.isRegularFile(file)
|
||||
&& !name.startsWith(Translation.LEGACY_TRANSLATION_FILENAME)
|
||||
&& !name.startsWith(Config.CONFIG_FILENAME)
|
||||
&& !name.startsWith(MojangSkinProvider.CACHE_FILENAME)
|
||||
&& name.endsWith(SkinIO.FILE_EXTENSION);
|
||||
}).toList();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user