From 399636e1ae1dd186ddb485251dae8e0b954215db Mon Sep 17 00:00:00 2001 From: lionarius Date: Tue, 2 Jul 2024 01:24:40 +0300 Subject: [PATCH] add ely.by provider --- .../lionarius/skinrestorer/SkinRestorer.java | 1 + .../skin/provider/ElyBySkinProvider.java | 71 +++++++++++++++++++ .../skin/provider/MojangSkinProvider.java | 25 +------ .../skin/provider/SkinProvider.java | 1 + .../skinrestorer/util/PlayerUtils.java | 22 ++++++ 5 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 common/src/main/java/net/lionarius/skinrestorer/skin/provider/ElyBySkinProvider.java diff --git a/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java b/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java index afd8ce7..7ea2342 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java +++ b/common/src/main/java/net/lionarius/skinrestorer/SkinRestorer.java @@ -59,6 +59,7 @@ public final class SkinRestorer { SkinRestorer.providersRegistry.register(EmptySkinProvider.PROVIDER_NAME, SkinProvider.EMPTY, false); SkinRestorer.providersRegistry.register(MojangSkinProvider.PROVIDER_NAME, SkinProvider.MOJANG); + SkinRestorer.providersRegistry.register(ElyBySkinProvider.PROVIDER_NAME, SkinProvider.ELY_BY); SkinRestorer.providersRegistry.register(MineskinSkinProvider.PROVIDER_NAME, SkinProvider.MINESKIN); } diff --git a/common/src/main/java/net/lionarius/skinrestorer/skin/provider/ElyBySkinProvider.java b/common/src/main/java/net/lionarius/skinrestorer/skin/provider/ElyBySkinProvider.java new file mode 100644 index 0000000..430b4d7 --- /dev/null +++ b/common/src/main/java/net/lionarius/skinrestorer/skin/provider/ElyBySkinProvider.java @@ -0,0 +1,71 @@ +package net.lionarius.skinrestorer.skin.provider; + +import com.google.gson.JsonObject; +import com.mojang.authlib.properties.Property; +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 java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpRequest; +import java.util.Optional; + +public final class ElyBySkinProvider implements SkinProvider { + public static final String PROVIDER_NAME = "ely.by"; + + private static final URI API_URI; + + static { + try { + API_URI = new URI("http://skinsystem.ely.by/"); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e); + } + } + + @Override + public String getArgumentName() { + return "username"; + } + + @Override + public boolean hasVariantSupport() { + return false; + } + + @Override + public Result, Exception> getSkin(String username, SkinVariant variant) { + try { + var profile = ElyBySkinProvider.getElyByProfile(username); + + var properties = profile.getAsJsonArray("properties"); + var textures = PlayerUtils.findTexturesProperty(properties); + + return Result.ofNullable(textures); + } catch (Exception e) { + return Result.error(e); + } + } + + private static JsonObject getElyByProfile(String username) throws IOException { + var request = HttpRequest.newBuilder() + .uri(ElyBySkinProvider.API_URI + .resolve("textures/signed/") + .resolve(username + "?unsigned=false") + ) + .GET() + .build(); + + var response = WebUtils.executeRequest(request); + WebUtils.throwOnClientErrors(response); + + if (response.statusCode() != 200) + throw new IllegalArgumentException("no profile with name " + username); + + return JsonUtils.parseJson(response.body()); + } +} 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 d8b7328..57805cc 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 @@ -1,11 +1,11 @@ package net.lionarius.skinrestorer.skin.provider; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; 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; @@ -52,7 +52,7 @@ public final class MojangSkinProvider implements SkinProvider { var profile = MojangSkinProvider.getMojangProfile(uuid); var properties = profile.getAsJsonArray("properties"); - var textures = MojangSkinProvider.findTexturesProperty(properties); + var textures = PlayerUtils.findTexturesProperty(properties); return Result.ofNullable(textures); } catch (Exception e) { @@ -60,27 +60,6 @@ public final class MojangSkinProvider implements SkinProvider { } } - private static Property findTexturesProperty(JsonArray properties) { - Property textures = null; - for (var property : properties) { - var propertyObject = property.getAsJsonObject(); - if (propertyObject == null) - continue; - - try { - textures = JsonUtils.fromJson(propertyObject, Property.class); - break; - } catch (Exception e) { - // ignored - } - } - - if (textures == null) - throw new IllegalStateException("no textures in profile"); - - return textures; - } - private static String getUuid(final String name) throws IOException { var request = HttpRequest.newBuilder() .uri(MojangSkinProvider.API_URI diff --git a/common/src/main/java/net/lionarius/skinrestorer/skin/provider/SkinProvider.java b/common/src/main/java/net/lionarius/skinrestorer/skin/provider/SkinProvider.java index 10d017d..70dfef3 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/skin/provider/SkinProvider.java +++ b/common/src/main/java/net/lionarius/skinrestorer/skin/provider/SkinProvider.java @@ -9,6 +9,7 @@ import java.util.Optional; public interface SkinProvider { EmptySkinProvider EMPTY = new EmptySkinProvider(); MojangSkinProvider MOJANG = new MojangSkinProvider(); + ElyBySkinProvider ELY_BY = new ElyBySkinProvider(); MineskinSkinProvider MINESKIN = new MineskinSkinProvider(); String getArgumentName(); diff --git a/common/src/main/java/net/lionarius/skinrestorer/util/PlayerUtils.java b/common/src/main/java/net/lionarius/skinrestorer/util/PlayerUtils.java index e80c891..3dadcdf 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/util/PlayerUtils.java +++ b/common/src/main/java/net/lionarius/skinrestorer/util/PlayerUtils.java @@ -1,5 +1,6 @@ package net.lionarius.skinrestorer.util; +import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; @@ -120,4 +121,25 @@ public final class PlayerUtils { return xJson.equals(yJson); } + + public static Property findTexturesProperty(JsonArray properties) { + Property textures = null; + for (var property : properties) { + var propertyObject = property.getAsJsonObject(); + if (propertyObject == null) + continue; + + try { + textures = JsonUtils.fromJson(propertyObject, Property.class); + break; + } catch (Exception e) { + // ignored + } + } + + if (textures == null) + throw new IllegalStateException("no textures in profile"); + + return textures; + } }