From 6e1d089cc77422b5e9e2d25b4005c316c6503bdf Mon Sep 17 00:00:00 2001 From: D3v1s0m <49519439+D3v1s0m@users.noreply.github.com> Date: Sat, 22 Jul 2023 22:11:05 +0530 Subject: [PATCH] Added skin variant option when using url --- .../znpcsplus/api/skin/SkinDescriptorFactory.java | 5 ++--- .../java/lol/pyr/znpcsplus/commands/SkinCommand.java | 10 +++++++++- .../znpcsplus/skin/SkinDescriptorFactoryImpl.java | 12 ++++++++---- .../pyr/znpcsplus/skin/cache/MojangSkinCache.java | 4 ++-- .../skin/descriptor/PrefetchedDescriptor.java | 4 ++-- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java b/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java index bc6954a..086aa0c 100644 --- a/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java +++ b/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java @@ -1,6 +1,5 @@ package lol.pyr.znpcsplus.api.skin; -import java.net.MalformedURLException; import java.net.URL; public interface SkinDescriptorFactory { @@ -8,6 +7,6 @@ public interface SkinDescriptorFactory { SkinDescriptor createRefreshingDescriptor(String playerName); SkinDescriptor createStaticDescriptor(String playerName); SkinDescriptor createStaticDescriptor(String texture, String signature); - SkinDescriptor createUrlDescriptor(String url) throws MalformedURLException; - SkinDescriptor createUrlDescriptor(URL url); + SkinDescriptor createUrlDescriptor(String url, String variant); + SkinDescriptor createUrlDescriptor(URL url, String variant); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java index 69a81e7..dc9832f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java @@ -68,11 +68,16 @@ public class SkinCommand implements CommandHandler { context.halt(Component.text("The NPC's skin will now be resolved per-player from \"" + name + "\"")); } else if (type.equalsIgnoreCase("url")) { context.ensureArgsNotEmpty(); + String variant = context.popString().toLowerCase(); + if (!variant.equalsIgnoreCase("slim") && !variant.equalsIgnoreCase("classic")) { + context.send(Component.text("Invalid skin variant! Please use one of the following: slim, classic", NamedTextColor.RED)); + return; + } String urlString = context.dumpAllArgs(); try { URL url = new URL(urlString); context.send(Component.text("Fetching skin from url \"" + urlString + "\"...", NamedTextColor.GREEN)); - PrefetchedDescriptor.fromUrl(skinCache, url).thenAccept(skin -> { + PrefetchedDescriptor.fromUrl(skinCache, url , variant).thenAccept(skin -> { if (skin.getSkin() == null) { context.send(Component.text("Failed to fetch skin, are you sure the url is valid?", NamedTextColor.RED)); return; @@ -94,6 +99,9 @@ public class SkinCommand implements CommandHandler { if (context.argSize() == 1) return context.suggestCollection(npcRegistry.getModifiableIds()); if (context.argSize() == 2) return context.suggestLiteral("mirror", "static", "dynamic", "url"); if (context.matchSuggestion("*", "static")) return context.suggestPlayers(); + if (context.argSize() == 3 && context.matchSuggestion("*", "url")) { + return context.suggestLiteral("slim", "classic"); + } return Collections.emptyList(); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java index 8fc2b73..b6656ed 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java @@ -40,12 +40,16 @@ public class SkinDescriptorFactoryImpl implements SkinDescriptorFactory { } @Override - public SkinDescriptor createUrlDescriptor(String url) throws MalformedURLException { - return createUrlDescriptor(new URL(url)); + public SkinDescriptor createUrlDescriptor(String url, String variant) { + try { + return createUrlDescriptor(new URL(url), variant); + } catch (MalformedURLException e) { + return null; + } } @Override - public SkinDescriptor createUrlDescriptor(URL url) { - return PrefetchedDescriptor.fromUrl(skinCache, url).join(); + public SkinDescriptor createUrlDescriptor(URL url, String variant) { + return PrefetchedDescriptor.fromUrl(skinCache, url, variant).join(); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java index 31a3b6a..70bf62f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java @@ -67,7 +67,7 @@ public class MojangSkinCache { }); } - public CompletableFuture fetchByUrl(URL url) { + public CompletableFuture fetchByUrl(URL url, String variant) { return CompletableFuture.supplyAsync(() -> { URL apiUrl = parseUrl("https://api.mineskin.org/generate/url"); @@ -80,7 +80,7 @@ public class MojangSkinCache { connection.setDoOutput(true); OutputStream outStream = connection.getOutputStream(); DataOutputStream out = new DataOutputStream(outStream); - out.writeBytes("{\"variant\":\"classic\",\"url\":\"" + url.toString() + "\"}"); // TODO: configurable variant (slim, classic) default: classic + out.writeBytes("{\"variant\":\"" + variant + "\",\"url\":\"" + url.toString() + "\"}"); // TODO: configurable variant (slim, classic) default: classic out.flush(); out.close(); outStream.close(); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/PrefetchedDescriptor.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/PrefetchedDescriptor.java index f6cc66a..3e177dd 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/PrefetchedDescriptor.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/PrefetchedDescriptor.java @@ -21,8 +21,8 @@ public class PrefetchedDescriptor implements BaseSkinDescriptor, SkinDescriptor return CompletableFuture.supplyAsync(() -> new PrefetchedDescriptor(cache.fetchByName(name).join())); } - public static CompletableFuture fromUrl(MojangSkinCache cache, URL url) { - return CompletableFuture.supplyAsync(() -> new PrefetchedDescriptor(cache.fetchByUrl(url).join())); + public static CompletableFuture fromUrl(MojangSkinCache cache, URL url, String variant) { + return CompletableFuture.supplyAsync(() -> new PrefetchedDescriptor(cache.fetchByUrl(url, variant).join())); } @Override