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:
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")))
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user