diff --git a/src/main/java/xyz/atnrch/nicko/gui/CacheDetailedGUI.java b/src/main/java/xyz/atnrch/nicko/gui/CacheDetailedGUI.java index f021e7c..8d5935a 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/CacheDetailedGUI.java +++ b/src/main/java/xyz/atnrch/nicko/gui/CacheDetailedGUI.java @@ -26,7 +26,7 @@ public class CacheDetailedGUI { private final Gui gui; public CacheDetailedGUI(Player player) { - final ConcurrentMap> skins = NickoBukkit.getInstance().getMojangAPI().getCache().asMap(); + final ConcurrentMap> skins = NickoBukkit.getInstance().getMojangAPI().getSkinCache().asMap(); final List loadedSkins = skins.entrySet().stream() .filter(entry -> entry.getValue().isPresent()) .map(Map.Entry::getKey) diff --git a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheStatisticsItem.java b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheStatisticsItem.java index 0b3a6d1..3471302 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheStatisticsItem.java +++ b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheStatisticsItem.java @@ -14,7 +14,7 @@ public class CacheStatisticsItem extends SuppliedItem { public CacheStatisticsItem() { super(() -> { final ItemBuilder builder = new ItemBuilder(Material.BOOK); - final LoadingCache> cache = NickoBukkit.getInstance().getMojangAPI().getCache(); + final LoadingCache> cache = NickoBukkit.getInstance().getMojangAPI().getSkinCache(); final CacheStats stats = cache.stats(); builder.setDisplayName("§fStatistics"); builder.addLoreLines( diff --git a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateCacheItem.java b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateCacheItem.java index 20ea606..9cd81df 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateCacheItem.java +++ b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateCacheItem.java @@ -17,9 +17,7 @@ public class InvalidateCacheItem extends SuppliedItem { builder.addLoreLines( "§c§oNOT RECOMMENDED", "§7Invalidates every skin entry present in the cache.", - "§7Does not reset player disguises.", - "§7Could be useful if a skin has been updated", - "§7recently and the cache is now outdated."); + "§7Does not reset player disguises."); return builder; }, (click) -> { final ClickType clickType = click.getClickType(); @@ -29,7 +27,7 @@ public class InvalidateCacheItem extends SuppliedItem { final Player player = click.getPlayer(); final I18N i18n = new I18N(player); player.sendMessage(i18n.translate(I18NDict.Event.Admin.Cache.INVALIDATE_ALL)); - NickoBukkit.getInstance().getMojangAPI().getCache().invalidateAll(); + NickoBukkit.getInstance().getMojangAPI().getSkinCache().invalidateAll(); return true; } return false; diff --git a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateEntryItem.java b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateEntryItem.java index 71ba35b..c3f0a5d 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateEntryItem.java +++ b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/InvalidateEntryItem.java @@ -11,7 +11,9 @@ public class InvalidateEntryItem extends SuppliedItem { super(() -> { final ItemBuilder builder = new ItemBuilder(Material.PAPER); builder.setDisplayName("§fInvalidate specific entry"); - builder.addLoreLines("§7Select a specific skin to invalidate."); + builder.addLoreLines("§7Select a specific skin to invalidate.", + "§7Useful if a skin has been updated", + "§7recently and the cache no longer up-to-date."); return builder; }, (click) -> { final ClickType clickType = click.getClickType(); diff --git a/src/main/java/xyz/atnrch/nicko/mojang/MojangAPI.java b/src/main/java/xyz/atnrch/nicko/mojang/MojangAPI.java index 1a90cab..2abf04f 100644 --- a/src/main/java/xyz/atnrch/nicko/mojang/MojangAPI.java +++ b/src/main/java/xyz/atnrch/nicko/mojang/MojangAPI.java @@ -25,31 +25,47 @@ public class MojangAPI { public static final String URL_SKIN = "https://sessionserver.mojang.com/session/minecraft/profile/{uuid}?unsigned=false"; private final Logger logger = Logger.getLogger("MojangAPI"); - private final HashMap uuidToName = new HashMap<>(); - private final CacheLoader> loader = new CacheLoader>() { + private final CacheLoader> skinLoader = new CacheLoader>() { @Nonnull public Optional load(@Nonnull String uuid) throws Exception { return getSkinFromMojang(uuid); } }; - private final LoadingCache> cache = CacheBuilder + private final LoadingCache> skinCache = CacheBuilder .newBuilder() .recordStats() .expireAfterWrite(24, TimeUnit.HOURS) - .build(loader); + .build(skinLoader); + + private final CacheLoader> uuidLoader = new CacheLoader>() { + @Nonnull + public Optional load(@Nonnull String name) throws Exception { + return getUUIDFromMojang(name); + } + }; + + private final LoadingCache> uuidCache = CacheBuilder + .newBuilder() + .expireAfterWrite(2, TimeUnit.DAYS) + .build(uuidLoader); public Optional getSkin(String uuid) throws IOException, ExecutionException { - return cache.get(uuid); + return skinCache.get(uuid); } public Optional getSkinWithoutCaching(String uuid) throws IOException { return getSkinFromMojang(uuid); } - public Optional getUUID(String name) throws IOException { + public Optional getUUID(String name) throws IOException, ExecutionException { + return uuidCache.get(name); + } + + private Optional getUUIDFromMojang(String name) throws IOException { + // TODO (Ineanto, 7/6/23): store uuid final String parametrizedUrl = URL_NAME.replace("{name}", name); final JsonObject object = getRequestToUrl(parametrizedUrl); if (hasNoError(object)) { @@ -62,7 +78,7 @@ public class MojangAPI { } public void eraseFromCache(String uuid) { - cache.invalidate(uuid); + skinCache.invalidate(uuid); uuidToName.remove(uuid); } @@ -125,7 +141,7 @@ public class MojangAPI { return object.get("error") == null; } - public LoadingCache> getCache() { - return cache; + public LoadingCache> getSkinCache() { + return skinCache; } } diff --git a/src/main/java/xyz/atnrch/nicko/storage/PlayerDataStore.java b/src/main/java/xyz/atnrch/nicko/storage/PlayerDataStore.java index b4ed89d..d94eb0b 100644 --- a/src/main/java/xyz/atnrch/nicko/storage/PlayerDataStore.java +++ b/src/main/java/xyz/atnrch/nicko/storage/PlayerDataStore.java @@ -15,6 +15,7 @@ import xyz.atnrch.nicko.storage.sql.SQLStorage; import java.io.IOException; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.ExecutionException; public class PlayerDataStore { private final Storage storage; @@ -57,7 +58,7 @@ public class PlayerDataStore { return getData(uuid); } return Optional.empty(); - } catch (IOException e) { + } catch (IOException | ExecutionException e) { return Optional.empty(); } }