1
0
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:
2024-08-29 00:26:04 +03:00
parent 6611077b93
commit b850086ad8
2 changed files with 24 additions and 3 deletions

View File

@@ -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) {

View File

@@ -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();