1
0
mirror of https://github.com/Suiranoil/SkinRestorer.git synced 2026-01-16 04:42:12 +00:00

make skin providers dynamic

This commit is contained in:
2024-06-28 16:28:37 +03:00
parent 9ddfa334ea
commit badc8c3494
5 changed files with 60 additions and 9 deletions

View File

@@ -6,6 +6,9 @@ import it.unimi.dsi.fastutil.Pair;
import net.lionarius.skinrestorer.skin.SkinIO;
import net.lionarius.skinrestorer.skin.SkinResult;
import net.lionarius.skinrestorer.skin.SkinStorage;
import net.lionarius.skinrestorer.skin.provider.MineskinSkinProvider;
import net.lionarius.skinrestorer.skin.provider.MojangSkinProvider;
import net.lionarius.skinrestorer.skin.provider.SkinProvider;
import net.lionarius.skinrestorer.util.PlayerUtils;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity;
@@ -13,9 +16,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.file.Path;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
@@ -24,6 +25,7 @@ public final class SkinRestorer {
public static final String MOD_ID = "skinrestorer";
public static final Logger LOGGER = LoggerFactory.getLogger("SkinRestorer");
private static Map<String, SkinProvider> providers = new HashMap<>();
private static SkinStorage skinStorage;
private static Path configDir;
@@ -35,9 +37,20 @@ public final class SkinRestorer {
return configDir;
}
public static Iterable<Map.Entry<String, SkinProvider>> getProviders() {
return providers.entrySet();
}
public static Optional<SkinProvider> getProvider(String name) {
return Optional.ofNullable(providers.get(name));
}
public static void onInitialize(Path rootConfigDir) {
SkinRestorer.configDir = rootConfigDir.resolve(MOD_ID);
SkinRestorer.skinStorage = new SkinStorage(new SkinIO(SkinRestorer.configDir));
SkinRestorer.providers.put("mojang", new MojangSkinProvider());
SkinRestorer.providers.put("web", new MineskinSkinProvider());
}
public static CompletableFuture<Pair<Collection<ServerPlayerEntity>, Collection<GameProfile>>> setSkinAsync(MinecraftServer server, Collection<GameProfile> targets, Supplier<SkinResult> skinSupplier) {

View File

@@ -1,9 +1,9 @@
package net.lionarius.skinrestorer.mixin;
import com.mojang.authlib.GameProfile;
import net.lionarius.skinrestorer.skin.provider.MojangSkinProvider;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.skin.SkinResult;
import net.lionarius.skinrestorer.skin.SkinVariant;
import net.minecraft.server.network.ServerLoginNetworkHandler;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
@@ -33,7 +33,9 @@ public abstract class ServerLoginNetworkHandlerMixin {
SkinRestorer.LOGGER.debug("Fetching {}'s skin", profile.getName());
if (!SkinRestorer.getSkinStorage().hasSavedSkin(profile.getId())) { // when player joins for the first time fetch Mojang skin by his username
SkinResult result = MojangSkinProvider.getSkin(profile.getName());
SkinResult result = SkinRestorer.getProvider("mojang").map(
provider -> provider.getSkin(profile.getName(), SkinVariant.CLASSIC)
).orElse(SkinResult.empty());
if (!result.isError())
SkinRestorer.getSkinStorage().setSkin(profile.getId(), result.getSkin());

View File

@@ -11,13 +11,24 @@ import net.lionarius.skinrestorer.util.WebUtils;
import java.io.IOException;
import java.net.URL;
public class MineskinSkinProvider {
public class MineskinSkinProvider implements SkinProvider {
private static final String API = "https://api.mineskin.org/generate/url";
private static final String USER_AGENT = "SkinRestorer";
private static final String TYPE = "application/json";
public static SkinResult getSkin(String url, SkinVariant variant) {
@Override
public String getArgumentName() {
return "url";
}
@Override
public boolean hasVariantSupport() {
return true;
}
@Override
public SkinResult getSkin(String url, SkinVariant variant) {
try {
String input = ("{\"variant\":\"%s\",\"name\":\"%s\",\"visibility\":%d,\"url\":\"%s\"}")
.formatted(variant.toString(), "none", 1, url);

View File

@@ -3,6 +3,7 @@ package net.lionarius.skinrestorer.skin.provider;
import com.google.gson.JsonObject;
import com.mojang.authlib.properties.Property;
import net.lionarius.skinrestorer.skin.SkinResult;
import net.lionarius.skinrestorer.skin.SkinVariant;
import net.lionarius.skinrestorer.util.JsonUtils;
import net.lionarius.skinrestorer.util.PlayerUtils;
import net.lionarius.skinrestorer.util.WebUtils;
@@ -11,12 +12,23 @@ import java.io.IOException;
import java.net.URL;
import java.util.UUID;
public class MojangSkinProvider {
public class MojangSkinProvider implements SkinProvider {
private static final String API = "https://api.mojang.com/users/profiles/minecraft/";
private static final String SESSION_SERVER = "https://sessionserver.mojang.com/session/minecraft/profile/";
public static SkinResult getSkin(String name) {
@Override
public String getArgumentName() {
return "skin_name";
}
@Override
public boolean hasVariantSupport() {
return false;
}
@Override
public SkinResult getSkin(String name, SkinVariant variant) {
try {
UUID uuid = getUUID(name);
JsonObject texture = JsonUtils.parseJson(WebUtils.GETRequest(new URL(SESSION_SERVER + uuid + "?unsigned=false")))

View File

@@ -0,0 +1,13 @@
package net.lionarius.skinrestorer.skin.provider;
import net.lionarius.skinrestorer.skin.SkinResult;
import net.lionarius.skinrestorer.skin.SkinVariant;
public interface SkinProvider {
String getArgumentName();
boolean hasVariantSupport();
SkinResult getSkin(String argument, SkinVariant variant);
}