diff --git a/pom.xml b/pom.xml index 67072a0..468a730 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ io.papermc.paper paper-api - 1.20.1-R0.1-SNAPSHOT + 1.20.2-R0.1-SNAPSHOT provided @@ -63,13 +63,13 @@ me.clip placeholderapi - 2.11.2 + 2.11.4 provided xyz.xenondevs.invui invui - 1.20 + 1.23 pom @@ -80,7 +80,7 @@ com.github.seeseemelk MockBukkit-v1.20 - 3.31.0 + 3.47.0 test diff --git a/src/main/java/xyz/atnrch/nicko/appearance/AppearanceManager.java b/src/main/java/xyz/atnrch/nicko/appearance/AppearanceManager.java index 8977e14..91172b3 100644 --- a/src/main/java/xyz/atnrch/nicko/appearance/AppearanceManager.java +++ b/src/main/java/xyz/atnrch/nicko/appearance/AppearanceManager.java @@ -84,9 +84,8 @@ public class AppearanceManager { private ActionResult updateGameProfileSkin(WrappedGameProfile gameProfile, boolean skinChange, boolean reset) { final NickoProfile profile = getNickoProfile(); - final boolean changeOnlyName = profile.getSkin() != null && profile.getSkin().equals(player.getName()); - if (skinChange || !changeOnlyName) { + if (skinChange) { Optional skin; try { final MojangAPI mojangAPI = NickoBukkit.getInstance().getMojangAPI(); diff --git a/src/main/java/xyz/atnrch/nicko/gui/InvalidateSkinGUI.java b/src/main/java/xyz/atnrch/nicko/gui/InvalidateSkinGUI.java index 768ffc5..f79842a 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/InvalidateSkinGUI.java +++ b/src/main/java/xyz/atnrch/nicko/gui/InvalidateSkinGUI.java @@ -37,7 +37,7 @@ public class InvalidateSkinGUI { .collect(Collectors.toList()); final List items = loadedSkins.stream() - .map(CacheEntryItem::new) + .map(uuid -> new CacheEntryItem(i18n, uuid)) .collect(Collectors.toList()); final CacheManagementGUI parent = new CacheManagementGUI(player); diff --git a/src/main/java/xyz/atnrch/nicko/gui/items/admin/ManageCacheItem.java b/src/main/java/xyz/atnrch/nicko/gui/items/admin/ManageCacheItem.java index a63a7f0..a2cbf4a 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/items/admin/ManageCacheItem.java +++ b/src/main/java/xyz/atnrch/nicko/gui/items/admin/ManageCacheItem.java @@ -5,6 +5,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; import org.jetbrains.annotations.NotNull; +import xyz.atnrch.nicko.NickoBukkit; import xyz.atnrch.nicko.gui.CacheManagementGUI; import xyz.atnrch.nicko.i18n.I18N; import xyz.atnrch.nicko.i18n.I18NDict; @@ -13,6 +14,9 @@ import xyz.xenondevs.invui.item.builder.ItemBuilder; import xyz.xenondevs.invui.item.builder.SkullBuilder; import xyz.xenondevs.invui.item.impl.AsyncItem; import xyz.xenondevs.invui.item.impl.SuppliedItem; +import xyz.xenondevs.invui.util.MojangApiUtils; + +import java.io.IOException; public class ManageCacheItem extends AsyncItem { public ManageCacheItem(I18N i18n) { @@ -24,11 +28,20 @@ public class ManageCacheItem extends AsyncItem { return builder; }, (click -> true)).getItemProvider(), () -> { - final SkullBuilder builder = new SkullBuilder("Notch"); - final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.Admin.MANAGE_CACHE); - builder.setDisplayName(translation.getName()); - translation.getLore().forEach(builder::addLoreLines); - return builder; + try { + final SkullBuilder builder = new SkullBuilder("Notch"); + final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.Admin.MANAGE_CACHE); + builder.setDisplayName(translation.getName()); + translation.getLore().forEach(builder::addLoreLines); + return builder; + } catch (MojangApiUtils.MojangApiException | IOException e) { + final ItemBuilder builder = new ItemBuilder(Material.TNT); + final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.ERROR); + builder.setDisplayName(translation.getName()); + translation.getLore().forEach(builder::addLoreLines); + NickoBukkit.getInstance().getLogger().warning("Unable to get Head texture for Notch! (GUI/ManageCache)"); + return builder; + } }); } diff --git a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheEntryItem.java b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheEntryItem.java index 37f8bc3..000a218 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheEntryItem.java +++ b/src/main/java/xyz/atnrch/nicko/gui/items/admin/cache/CacheEntryItem.java @@ -11,11 +11,14 @@ import xyz.atnrch.nicko.gui.InvalidateSkinGUI; import xyz.atnrch.nicko.gui.items.common.choice.ChoiceCallback; import xyz.atnrch.nicko.i18n.I18N; import xyz.atnrch.nicko.i18n.I18NDict; +import xyz.atnrch.nicko.i18n.ItemTranslation; import xyz.atnrch.nicko.mojang.MojangAPI; import xyz.xenondevs.invui.item.builder.ItemBuilder; import xyz.xenondevs.invui.item.builder.SkullBuilder; import xyz.xenondevs.invui.item.impl.AsyncItem; +import xyz.xenondevs.invui.util.MojangApiUtils; +import java.io.IOException; import java.util.UUID; public class CacheEntryItem extends AsyncItem { @@ -23,14 +26,23 @@ public class CacheEntryItem extends AsyncItem { private final String uuid; private final MojangAPI mojangAPI = NickoBukkit.getInstance().getMojangAPI(); - public CacheEntryItem(String uuid) { + public CacheEntryItem(I18N i18n, String uuid) { super(new ItemBuilder(Material.PAINTING).setDisplayName("§7§oLoading..."), () -> { final String dashedUuid = uuid.replaceAll("(.{8})(.{4})(.{4})(.{4})(.+)", "$1-$2-$3-$4-$5"); final UUID uuidObject = UUID.fromString(dashedUuid); - final SkullBuilder skull = new SkullBuilder(uuidObject); - skull.setDisplayName("§6" + NickoBukkit.getInstance().getMojangAPI().getUUIDName(uuid)); - skull.addLoreLines("§7Click to invalidate skin"); - return skull; + try { + final SkullBuilder skull = new SkullBuilder(uuidObject); + skull.setDisplayName("§6" + NickoBukkit.getInstance().getMojangAPI().getUUIDName(uuid)); + skull.addLoreLines("§7Click to invalidate skin"); + return skull; + } catch (MojangApiUtils.MojangApiException | IOException e) { + final ItemBuilder builder = new ItemBuilder(Material.TNT); + final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.ERROR); + builder.setDisplayName(translation.getName()); + translation.getLore().forEach(builder::addLoreLines); + NickoBukkit.getInstance().getLogger().warning("Unable to get Head texture for Notch! (GUI/ManageCache)"); + return builder; + } }); this.uuid = uuid; this.name = mojangAPI.getUUIDName(uuid); diff --git a/src/main/java/xyz/atnrch/nicko/gui/items/admin/check/PlayerInformationItem.java b/src/main/java/xyz/atnrch/nicko/gui/items/admin/check/PlayerInformationItem.java index 76578e4..5506edd 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/items/admin/check/PlayerInformationItem.java +++ b/src/main/java/xyz/atnrch/nicko/gui/items/admin/check/PlayerInformationItem.java @@ -13,7 +13,9 @@ import xyz.xenondevs.invui.item.builder.ItemBuilder; import xyz.xenondevs.invui.item.builder.SkullBuilder; import xyz.xenondevs.invui.item.impl.AsyncItem; import xyz.xenondevs.invui.item.impl.SuppliedItem; +import xyz.xenondevs.invui.util.MojangApiUtils; +import java.io.IOException; import java.util.Optional; import java.util.UUID; @@ -27,26 +29,35 @@ public class PlayerInformationItem extends AsyncItem { return builder; }, (click -> true)).getItemProvider(), () -> { final Player player = Bukkit.getPlayer(uuid); - final SkullBuilder skull = new SkullBuilder(uuid); - final PlayerDataStore dataStore = NickoBukkit.getInstance().getDataStore(); - final Optional optionalProfile = dataStore.getData(uuid); + try { + final SkullBuilder skull = new SkullBuilder(uuid); + final PlayerDataStore dataStore = NickoBukkit.getInstance().getDataStore(); + final Optional optionalProfile = dataStore.getData(uuid); + if (optionalProfile.isPresent()) { + final NickoProfile profile = optionalProfile.get(); + final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.Admin.CHECK, player.getName(), (profile.hasData() ? "§a✔" : "§c❌"), profile.getName(), profile.getSkin()); + skull.setDisplayName("§6" + translation.getName()); + translation.getLore().forEach(skull::addLoreLines); + } else { + // Default item name in case the profile is not found + skull.setDisplayName("§6§lYou should not see this!"); + skull.addLoreLines( + "§cPlease file a bug report", + "§cat https://ineanto.xyz/git/ineanto/nicko!" + ); + } - if (optionalProfile.isPresent()) { - final NickoProfile profile = optionalProfile.get(); - final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.Admin.CHECK, player.getName(), (profile.hasData() ? "§a✔" : "§c❌"), profile.getName(), profile.getSkin()); - skull.setDisplayName("§6" + translation.getName()); - translation.getLore().forEach(skull::addLoreLines); - } else { - // Default item name in case the profile is not found - skull.setDisplayName("§6§lYou should not see this!"); - skull.addLoreLines( - "§cPlease file a bug report", - "§cat https://ineanto.xyz/git/ineanto/nicko!" - ); + return skull; + } catch (MojangApiUtils.MojangApiException | IOException e) { + NickoBukkit.getInstance().getLogger().severe("Unable to get head for specified UUID ( " + uuid + ")! (GUI/PlayerCheck)"); } - return skull; + final ItemBuilder builder = new ItemBuilder(Material.TNT); + final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.ERROR); + builder.setDisplayName(translation.getName()); + translation.getLore().forEach(builder::addLoreLines); + return builder; }); } } diff --git a/src/main/java/xyz/atnrch/nicko/gui/items/appearance/ChangeSkinItem.java b/src/main/java/xyz/atnrch/nicko/gui/items/appearance/ChangeSkinItem.java index 2903cdf..51e414b 100644 --- a/src/main/java/xyz/atnrch/nicko/gui/items/appearance/ChangeSkinItem.java +++ b/src/main/java/xyz/atnrch/nicko/gui/items/appearance/ChangeSkinItem.java @@ -1,13 +1,19 @@ package xyz.atnrch.nicko.gui.items.appearance; +import org.bukkit.Material; +import xyz.atnrch.nicko.NickoBukkit; import xyz.atnrch.nicko.anvil.AnvilManager; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import xyz.atnrch.nicko.i18n.I18N; import xyz.atnrch.nicko.i18n.I18NDict; import xyz.atnrch.nicko.i18n.ItemTranslation; +import xyz.xenondevs.invui.item.builder.ItemBuilder; import xyz.xenondevs.invui.item.builder.SkullBuilder; import xyz.xenondevs.invui.item.impl.SuppliedItem; +import xyz.xenondevs.invui.util.MojangApiUtils; + +import java.io.IOException; public class ChangeSkinItem { private final I18N i18n; @@ -20,11 +26,20 @@ public class ChangeSkinItem { public SuppliedItem get() { return new SuppliedItem(() -> { - final SkullBuilder builder = new SkullBuilder(player.getName()); - final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.Home.CHANGE_SKIN); - builder.setDisplayName(translation.getName()); - translation.getLore().forEach(builder::addLoreLines); - return builder; + try { + final SkullBuilder builder = new SkullBuilder(player.getName()); + final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.Home.CHANGE_SKIN); + builder.setDisplayName(translation.getName()); + translation.getLore().forEach(builder::addLoreLines); + return builder; + } catch (MojangApiUtils.MojangApiException | IOException e) { + final ItemBuilder builder = new ItemBuilder(Material.TNT); + final ItemTranslation translation = i18n.translateItem(I18NDict.GUI.ERROR); + builder.setDisplayName(translation.getName()); + translation.getLore().forEach(builder::addLoreLines); + NickoBukkit.getInstance().getLogger().warning("Unable to get Head texture for specified player (" + player.getName() + ")! (GUI/Home)"); + return builder; + } }, click -> { final ClickType clickType = click.getClickType(); if (clickType.isLeftClick() || clickType.isRightClick()) { diff --git a/src/main/java/xyz/atnrch/nicko/i18n/I18NDict.java b/src/main/java/xyz/atnrch/nicko/i18n/I18NDict.java index f60b0ad..cc2b2d9 100644 --- a/src/main/java/xyz/atnrch/nicko/i18n/I18NDict.java +++ b/src/main/java/xyz/atnrch/nicko/i18n/I18NDict.java @@ -70,6 +70,7 @@ public class I18NDict { public static final String GO_BACK = GUI_KEY + "go_back"; public static final String UNAVAILABLE = GUI_KEY + "unavailable"; public static final String LOADING = GUI_KEY + "loading"; + public static final String ERROR = GUI_KEY + "error"; public static final String SCROLL_UP = GUI_KEY + "scroll_up"; public static final String SCROLL_DOWN = GUI_KEY + "scroll_down"; diff --git a/src/main/java/xyz/atnrch/nicko/profile/AppearanceData.java b/src/main/java/xyz/atnrch/nicko/profile/AppearanceData.java deleted file mode 100644 index 362e576..0000000 --- a/src/main/java/xyz/atnrch/nicko/profile/AppearanceData.java +++ /dev/null @@ -1,31 +0,0 @@ -package xyz.atnrch.nicko.profile; - -public class AppearanceData { - private String name; - private String skin; - - public AppearanceData(String name, String skin) { - this.name = name; - this.skin = skin; - } - - public boolean isEmpty() { - return name == null && skin == null; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getSkin() { - return skin; - } - - public void setSkin(String skin) { - this.skin = skin; - } -} diff --git a/src/main/resources/en.yml b/src/main/resources/en.yml index e896a3b..a1536e7 100644 --- a/src/main/resources/en.yml +++ b/src/main/resources/en.yml @@ -44,6 +44,10 @@ gui: name: "Unavailable" lore: - "§7§oThis button is disabled." + error: + name: "Error!" + lore: + - "§7§oAn error occurred." loading: name: "§7§oLoading..." choice: