From 690aeadf67f3af821a7ea567a8aabd2a5cc7eb84 Mon Sep 17 00:00:00 2001
From: aro <pantoine.rochas@gmail.com>
Date: Thu, 19 Jan 2023 20:08:10 +0100
Subject: [PATCH] feat: do not cache skin reset

---
 .../net/artelnatif/nicko/disguise/AppearanceManager.java  | 8 ++++++--
 .../main/java/net/artelnatif/nicko/impl/Internals.java    | 2 +-
 .../main/java/net/artelnatif/nicko/mojang/MojangAPI.java  | 4 ++++
 .../src/main/java/net/artelnatif/nicko/impl/v1_17_R1.java | 8 +++++---
 .../src/main/java/net/artelnatif/nicko/impl/v1_18_R1.java | 8 +++++---
 .../src/main/java/net/artelnatif/nicko/impl/v1_18_R2.java | 8 +++++---
 .../src/main/java/net/artelnatif/nicko/impl/v1_19_R1.java | 8 +++++---
 7 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java b/nicko-core/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java
index 3150341..b6c5670 100644
--- a/nicko-core/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java
+++ b/nicko-core/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java
@@ -69,13 +69,17 @@ public class AppearanceManager {
         final String defaultName = instance.getDataStore().getStoredName(player);
         this.profile.setName(defaultName);
         this.profile.setSkin(defaultName);
-        final ActionResult actionResult = updatePlayer(true);
+        final ActionResult actionResult = resetPlayer();
         this.profile.setSkin(null);
         this.profile.setName(null);
         return actionResult;
     }
 
+    public ActionResult resetPlayer() {
+        return NickoBukkit.getInstance().getInternals().updateProfile(player, profile, true, true);
+    }
+
     public ActionResult updatePlayer(boolean skinChange) {
-        return NickoBukkit.getInstance().getInternals().updateProfile(player, profile, skinChange);
+        return NickoBukkit.getInstance().getInternals().updateProfile(player, profile, skinChange, false);
     }
 }
diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/impl/Internals.java b/nicko-core/src/main/java/net/artelnatif/nicko/impl/Internals.java
index a4e31ef..da503a9 100644
--- a/nicko-core/src/main/java/net/artelnatif/nicko/impl/Internals.java
+++ b/nicko-core/src/main/java/net/artelnatif/nicko/impl/Internals.java
@@ -9,5 +9,5 @@ public interface Internals {
 
     void updateOthers(Player player);
 
-    ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange);
+    ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange, boolean reset);
 }
diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/mojang/MojangAPI.java b/nicko-core/src/main/java/net/artelnatif/nicko/mojang/MojangAPI.java
index 3e70068..5f8744f 100644
--- a/nicko-core/src/main/java/net/artelnatif/nicko/mojang/MojangAPI.java
+++ b/nicko-core/src/main/java/net/artelnatif/nicko/mojang/MojangAPI.java
@@ -46,6 +46,10 @@ public class MojangAPI {
         return cache.get(uuid);
     }
 
+    public Optional<MojangSkin> getSkinWithoutCaching(String uuid) throws IOException {
+        return getSkinFromMojang(uuid);
+    }
+
     public Optional<String> getUUID(String name) throws IOException {
         final String parametrizedUrl = URL_NAME.replace("{name}", name);
         final JsonObject object = getRequestToUrl(parametrizedUrl);
diff --git a/v1_17_R1/src/main/java/net/artelnatif/nicko/impl/v1_17_R1.java b/v1_17_R1/src/main/java/net/artelnatif/nicko/impl/v1_17_R1.java
index 651607c..176ffd9 100644
--- a/v1_17_R1/src/main/java/net/artelnatif/nicko/impl/v1_17_R1.java
+++ b/v1_17_R1/src/main/java/net/artelnatif/nicko/impl/v1_17_R1.java
@@ -7,6 +7,7 @@ import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.disguise.NickoProfile;
 import net.artelnatif.nicko.disguise.ActionResult;
 import net.artelnatif.nicko.i18n.I18NDict;
+import net.artelnatif.nicko.mojang.MojangAPI;
 import net.artelnatif.nicko.mojang.MojangSkin;
 import net.minecraft.network.chat.IChatBaseComponent;
 import net.minecraft.network.protocol.game.*;
@@ -82,7 +83,7 @@ public class v1_17_R1 implements Internals {
     }
 
     @Override
-    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange) {
+    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange, boolean reset) {
         final CraftPlayer craftPlayer = (CraftPlayer) player;
         final EntityPlayer entityPlayer = craftPlayer.getHandle();
         final boolean changeOnlyName = profile.getSkin() != null && !profile.getSkin().equalsIgnoreCase(player.getName());
@@ -95,9 +96,10 @@ public class v1_17_R1 implements Internals {
 
         if (skinChange || changeOnlyName) {
             try {
-                final Optional<String> uuid = NickoBukkit.getInstance().getMojangAPI().getUUID(profile.getSkin());
+                final MojangAPI mojang = NickoBukkit.getInstance().getMojangAPI();
+                final Optional<String> uuid = mojang.getUUID(profile.getSkin());
                 if (uuid.isPresent()) {
-                    skin = NickoBukkit.getInstance().getMojangAPI().getSkin(uuid.get());
+                    skin = (reset ? mojang.getSkinWithoutCaching(uuid.get()) : mojang.getSkin(uuid.get()));
                     if (skin.isPresent()) {
                         final PropertyMap properties = gameProfile.getProperties();
                         properties.put("textures", new Property("textures", skin.get().value(), skin.get().signature()));
diff --git a/v1_18_R1/src/main/java/net/artelnatif/nicko/impl/v1_18_R1.java b/v1_18_R1/src/main/java/net/artelnatif/nicko/impl/v1_18_R1.java
index 04c6546..a684336 100644
--- a/v1_18_R1/src/main/java/net/artelnatif/nicko/impl/v1_18_R1.java
+++ b/v1_18_R1/src/main/java/net/artelnatif/nicko/impl/v1_18_R1.java
@@ -7,6 +7,7 @@ import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.disguise.NickoProfile;
 import net.artelnatif.nicko.disguise.ActionResult;
 import net.artelnatif.nicko.i18n.I18NDict;
+import net.artelnatif.nicko.mojang.MojangAPI;
 import net.artelnatif.nicko.mojang.MojangSkin;
 import net.minecraft.network.chat.IChatBaseComponent;
 import net.minecraft.network.protocol.game.*;
@@ -84,7 +85,7 @@ public class v1_18_R1 implements Internals {
     }
 
     @Override
-    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange) {
+    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange, boolean reset) {
         final CraftPlayer craftPlayer = (CraftPlayer) player;
         final EntityPlayer entityPlayer = craftPlayer.getHandle();
         final boolean changeOnlyName = profile.getSkin() != null && !profile.getSkin().equalsIgnoreCase(player.getName());
@@ -97,9 +98,10 @@ public class v1_18_R1 implements Internals {
 
         if (skinChange || changeOnlyName) {
             try {
-                final Optional<String> uuid = NickoBukkit.getInstance().getMojangAPI().getUUID(profile.getSkin());
+                final MojangAPI mojang = NickoBukkit.getInstance().getMojangAPI();
+                final Optional<String> uuid = mojang.getUUID(profile.getSkin());
                 if (uuid.isPresent()) {
-                    skin = NickoBukkit.getInstance().getMojangAPI().getSkin(uuid.get());
+                    skin = (reset ? mojang.getSkinWithoutCaching(uuid.get()) : mojang.getSkin(uuid.get()));
                     if (skin.isPresent()) {
                         final PropertyMap properties = gameProfile.getProperties();
                         properties.put("textures", new Property("textures", skin.get().value(), skin.get().signature()));
diff --git a/v1_18_R2/src/main/java/net/artelnatif/nicko/impl/v1_18_R2.java b/v1_18_R2/src/main/java/net/artelnatif/nicko/impl/v1_18_R2.java
index 8889153..3765a1d 100644
--- a/v1_18_R2/src/main/java/net/artelnatif/nicko/impl/v1_18_R2.java
+++ b/v1_18_R2/src/main/java/net/artelnatif/nicko/impl/v1_18_R2.java
@@ -7,6 +7,7 @@ import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.disguise.NickoProfile;
 import net.artelnatif.nicko.disguise.ActionResult;
 import net.artelnatif.nicko.i18n.I18NDict;
+import net.artelnatif.nicko.mojang.MojangAPI;
 import net.artelnatif.nicko.mojang.MojangSkin;
 import net.minecraft.core.Holder;
 import net.minecraft.network.chat.IChatBaseComponent;
@@ -84,7 +85,7 @@ public class v1_18_R2 implements Internals {
     }
 
     @Override
-    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange) {
+    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange, boolean reset) {
         final CraftPlayer craftPlayer = (CraftPlayer) player;
         final EntityPlayer entityPlayer = craftPlayer.getHandle();
         final boolean changeOnlyName = profile.getSkin() != null && !profile.getSkin().equalsIgnoreCase(player.getName());
@@ -97,9 +98,10 @@ public class v1_18_R2 implements Internals {
 
         if (skinChange || changeOnlyName) {
             try {
-                final Optional<String> uuid = NickoBukkit.getInstance().getMojangAPI().getUUID(profile.getSkin());
+                final MojangAPI mojang = NickoBukkit.getInstance().getMojangAPI();
+                final Optional<String> uuid = mojang.getUUID(profile.getSkin());
                 if (uuid.isPresent()) {
-                    skin = NickoBukkit.getInstance().getMojangAPI().getSkin(uuid.get());
+                    skin = (reset ? mojang.getSkinWithoutCaching(uuid.get()) : mojang.getSkin(uuid.get()));
                     if (skin.isPresent()) {
                         final PropertyMap properties = gameProfile.getProperties();
                         properties.put("textures", new Property("textures", skin.get().value(), skin.get().signature()));
diff --git a/v1_19_R1/src/main/java/net/artelnatif/nicko/impl/v1_19_R1.java b/v1_19_R1/src/main/java/net/artelnatif/nicko/impl/v1_19_R1.java
index 8146e59..9397406 100644
--- a/v1_19_R1/src/main/java/net/artelnatif/nicko/impl/v1_19_R1.java
+++ b/v1_19_R1/src/main/java/net/artelnatif/nicko/impl/v1_19_R1.java
@@ -7,6 +7,7 @@ import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.disguise.NickoProfile;
 import net.artelnatif.nicko.disguise.ActionResult;
 import net.artelnatif.nicko.i18n.I18NDict;
+import net.artelnatif.nicko.mojang.MojangAPI;
 import net.artelnatif.nicko.mojang.MojangSkin;
 import net.minecraft.network.chat.IChatBaseComponent;
 import net.minecraft.network.protocol.game.*;
@@ -86,7 +87,7 @@ public class v1_19_R1 implements Internals {
     }
 
     @Override
-    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange) {
+    public ActionResult updateProfile(Player player, NickoProfile profile, boolean skinChange, boolean reset) {
         final CraftPlayer craftPlayer = (CraftPlayer) player;
         final EntityPlayer entityPlayer = craftPlayer.getHandle();
         final boolean changeOnlyName = profile.getSkin() != null && !profile.getSkin().equalsIgnoreCase(player.getName());
@@ -102,9 +103,10 @@ public class v1_19_R1 implements Internals {
 
         if (skinChange || changeOnlyName) {
             try {
-                final Optional<String> uuid = NickoBukkit.getInstance().getMojangAPI().getUUID(profile.getSkin());
+                final MojangAPI mojang = NickoBukkit.getInstance().getMojangAPI();
+                final Optional<String> uuid = mojang.getUUID(profile.getSkin());
                 if (uuid.isPresent()) {
-                    skin = NickoBukkit.getInstance().getMojangAPI().getSkin(uuid.get());
+                    skin = (reset ? mojang.getSkinWithoutCaching(uuid.get()) : mojang.getSkin(uuid.get()));
                     if (skin.isPresent()) {
                         final PropertyMap properties = gameProfile.getProperties();
                         properties.put("textures", new Property("textures", skin.get().value(), skin.get().signature()));