diff --git a/galaxy/build.gradle.kts b/galaxy/build.gradle.kts index 7f4525c..cf30c2f 100644 --- a/galaxy/build.gradle.kts +++ b/galaxy/build.gradle.kts @@ -3,6 +3,9 @@ plugins { id("io.github.goooler.shadow") } +val nexusUser = providers.gradleProperty("alttdSnapshotUsername").orNull ?: System.getenv("NEXUS_USERNAME") +val nexusPass = providers.gradleProperty("alttdSnapshotPassword").orNull ?: System.getenv("NEXUS_PASSWORD") + dependencies { implementation(project(":api")) // API compileOnly("com.alttd.cosmos:cosmos-api:1.21.8-R0.1-SNAPSHOT") { @@ -11,6 +14,7 @@ dependencies { compileOnly("com.gitlab.ruany:LiteBansAPI:0.6.1") // move to proxy compileOnly("org.apache.commons:commons-lang3:3.17.0") // needs an alternative, already removed from upstream api and will be removed in server compileOnly("net.luckperms:api:5.5") // Luckperms + implementation("com.alttd.inventory_gui:InventoryGUI:1.1.1-SNAPSHOT") } tasks { diff --git a/galaxy/src/main/java/com/alttd/chat/nicknames/NicknamesGui.java b/galaxy/src/main/java/com/alttd/chat/nicknames/NicknamesGui.java index 1f1feac..44e1e5e 100644 --- a/galaxy/src/main/java/com/alttd/chat/nicknames/NicknamesGui.java +++ b/galaxy/src/main/java/com/alttd/chat/nicknames/NicknamesGui.java @@ -6,23 +6,20 @@ import com.alttd.chat.database.Queries; import com.alttd.chat.events.NickEvent; import com.alttd.chat.objects.Nick; import com.alttd.chat.util.Utility; +import com.alttd.inventory_gui.click.GuiItem; +import com.alttd.inventory_gui.gui.InventoryGui; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; @@ -31,37 +28,43 @@ import org.bukkit.scheduler.BukkitRunnable; import java.util.Arrays; import java.util.Date; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; public class NicknamesGui implements Listener { - private final Inventory inv; + public static final String UNKNOWN_PLAYER_NAME = "UNKNOWN PLAYER NAME"; private final int currentPage; + private final ChatPlugin plugin = ChatPlugin.getInstance(); + private final InventoryGui nicknamesGui; + //Inventory is shared between GUI users so actions one person does are replicated to the other GUI's public NicknamesGui() { - // Create a new inventory, with no owner (as this isn't a real inventory) - inv = Bukkit.createInventory(null, 36, Utility.parseMiniMessage("Nicknames GUI").asComponent()); - - // Put the items into the inventory + nicknamesGui = InventoryGui.builder() + .plugin(plugin) + .title(Component.text("Nicknames GUI")) + .rows(6) + .build(); currentPage = 1; setItems(currentPage); } + //TODO create all pages and share those between instances so page changes don't affect others, but everything is still synchronized public void setItems(int currentPage) { new BukkitRunnable() { @Override public void run() { - inv.clear(); NickUtilities.updateCache(); boolean hasNextPage = false; int i = (currentPage - 1) * 27; //TODO set to 1 or 2 to test int limit = i / 27; + MiniMessage miniMessage = MiniMessage.miniMessage(); for (Nick nick : Nicknames.getInstance().NickCache.values()) { if (nick.hasRequest()) { if (limit >= i / 27) { - inv.setItem(i % 27, createPlayerSkull(nick, Config.NICK_ITEM_LORE)); + ItemStack playerSkull = createPlayerSkull(nick, Config.NICK_ITEM_LORE); + nicknamesGui.getRoot().setItem(i % 27, GuiItem.clickable(playerSkull, inventoryClickEvent -> + handleInventoryClick(nick, inventoryClickEvent, miniMessage, playerSkull))); i++; } else { hasNextPage = true; @@ -71,20 +74,139 @@ public class NicknamesGui implements Listener { } if (currentPage != 1) { - inv.setItem(28, createGuiItem(Material.PAPER, "§bPrevious page", - "§aCurrent page: %page%".replace("%page%", String.valueOf(currentPage)), - "§aPrevious page: %previousPage%".replace("%previousPage%", String.valueOf(currentPage - 1)))); + ItemStack itemStack = createGuiItem(Material.PAPER, "§bPrevious page", + "§aCurrent page: %page%".replace("%page%", String.valueOf(currentPage)), + "§aPrevious page: %previousPage%".replace("%previousPage%", String.valueOf(currentPage - 1))); + GuiItem previousPage = GuiItem.clickable(itemStack, e -> setItems(currentPage - 1)); + nicknamesGui.getRoot().setItem(28, previousPage); } if (hasNextPage) { - inv.setItem(36, createGuiItem(Material.PAPER, "§bNext page", - "§aCurrent page: %page%".replace("%page%", String.valueOf(currentPage)), - "§aNext page: §b%nextPage%".replace("%nextPage%", String.valueOf(currentPage + 1)))); + ItemStack itemStack = createGuiItem(Material.PAPER, "§bNext page", + "§aCurrent page: %page%".replace("%page%", String.valueOf(currentPage)), + "§aNext page: §b%nextPage%".replace("%nextPage%", String.valueOf(currentPage + 1))); + GuiItem nextPage = GuiItem.clickable(itemStack, e -> setItems(currentPage + 1)); + nicknamesGui.getRoot().setItem(36, nextPage); } } }.runTaskAsynchronously(ChatPlugin.getInstance()); } + private static void handleInventoryClick(Nick nick, InventoryClickEvent inventoryClickEvent, MiniMessage miniMessage, ItemStack playerSkull) { + final Player playerWhoClicked = (Player) inventoryClickEvent.getWhoClicked(); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(nick.getUuid()); + if (offlinePlayer.getName() == null) { + playerWhoClicked.sendRichMessage(Config.NICK_PLAYER_NOT_ONLINE, Placeholder.parsed("player", getOfflinePlayerName(offlinePlayer))); + return; + } + Component offlinePlayerName = miniMessage.deserialize(getOfflinePlayerName(offlinePlayer)); + if (!nick.hasRequest()) { + playerWhoClicked.sendRichMessage(Config.NICK_ALREADY_HANDLED, + Placeholder.component("targetplayer", offlinePlayerName)); + return; + } + if (inventoryClickEvent.isLeftClick()) { + handleLeftClickPlayerSkull(nick, inventoryClickEvent, offlinePlayer, playerWhoClicked, offlinePlayerName, playerSkull); + } else if (inventoryClickEvent.isRightClick()) { + handleRightClickPlayerSkull(nick, inventoryClickEvent, offlinePlayer, playerWhoClicked, offlinePlayerName, playerSkull); + } + //TODO what do we do no click? + } + + private static void handleRightClickPlayerSkull(Nick nick, InventoryClickEvent inventoryClickEvent, OfflinePlayer offlinePlayer, Player playerWhoClicked, Component offlinePlayerName, ItemStack playerSkull) { + Queries.denyNewNickname(nick.getUuid()); + + String newNick = nick.getNewNick(); + + new BukkitRunnable() { + @Override + public void run() { + NickEvent nickEvent = new NickEvent(inventoryClickEvent.getWhoClicked().getName(), getOfflinePlayerName(offlinePlayer), newNick, NickEvent.NickEventType.DENIED); + nickEvent.callEvent(); + } + }.runTask(ChatPlugin.getInstance()); + + playerWhoClicked.sendRichMessage(Config.NICK_DENIED, + Placeholder.unparsed("targetplayer", getOfflinePlayerName(offlinePlayer)), + Placeholder.component("newnick", Utility.applyColor(nick.getNewNick())), + Placeholder.component("oldnick", Utility.applyColor(nick.getCurrentNick() == null ? getOfflinePlayerName(offlinePlayer) : nick.getCurrentNick()))); + + if (Nicknames.getInstance().NickCache.containsKey(nick.getUuid()) + && Nicknames.getInstance().NickCache.get(nick.getUuid()).getCurrentNick() != null) { + nick.setNewNick(null); + nick.setRequestedDate(0); + Nicknames.getInstance().NickCache.put(nick.getUuid(), nick); + } else { + Nicknames.getInstance().NickCache.remove(nick.getUuid()); + } + + if (offlinePlayer.isOnline() && offlinePlayer.getPlayer() != null) { + Nicknames.getInstance().setNick(offlinePlayer.getPlayer(), nick.getCurrentNick() == null ? getOfflinePlayerName(offlinePlayer) : nick.getCurrentNick()); + offlinePlayer.getPlayer().sendRichMessage(Config.NICK_NOT_CHANGED); + } + + NickUtilities.bungeeMessageHandled(nick.getUuid(), inventoryClickEvent.getWhoClicked().getServer().getPlayer(inventoryClickEvent.getWhoClicked().getName()), "Denied"); + final ComponentLike messageDenied = MiniMessage.miniMessage().deserialize("'s nickname was denied!", + Placeholder.unparsed("name", getOfflinePlayerName(offlinePlayer))); + ChatPlugin.getInstance().getServer().getOnlinePlayers().stream() + .filter(player -> player.hasPermission("chat.command.nick.review")) + .forEach(player -> player.sendMessage(messageDenied)); + + ItemStack completedNickRequestItem = createCompletedNickRequestItem(offlinePlayerName, playerSkull); + inventoryClickEvent.getInventory().setItem(inventoryClickEvent.getSlot(), completedNickRequestItem); + playerWhoClicked.updateInventory(); + } + + private static void handleLeftClickPlayerSkull(Nick nick, InventoryClickEvent inventoryClickEvent, OfflinePlayer offlinePlayer, Player playerWhoClicked, Component offlinePlayerName, ItemStack playerSkull) { + Queries.acceptNewNickname(nick.getUuid(), nick.getNewNick()); + + String newNick = nick.getNewNick(); + + new BukkitRunnable() { + @Override + public void run() { + NickEvent nickEvent = new NickEvent(inventoryClickEvent.getWhoClicked().getName(), getOfflinePlayerName(offlinePlayer), newNick, NickEvent.NickEventType.ACCEPTED); + nickEvent.callEvent(); + } + }.runTask(ChatPlugin.getInstance()); + + playerWhoClicked.sendRichMessage(Config.NICK_ACCEPTED, + Placeholder.component("targetplayer", offlinePlayerName), + Placeholder.component("newnick", Utility.applyColor(nick.getNewNick())), + Placeholder.component("oldnick", nick.getCurrentNick() == null ? offlinePlayerName : Utility.applyColor(nick.getCurrentNick()))); + + Player affectedPlayer = offlinePlayer.getPlayer(); + if (offlinePlayer.isOnline() && affectedPlayer != null) { + Nicknames.getInstance().setNick(affectedPlayer, nick.getNewNick()); + } + + NickUtilities.bungeeMessageHandled(nick.getUuid(), inventoryClickEvent.getWhoClicked().getServer().getPlayer(inventoryClickEvent.getWhoClicked().getName()), "Accepted"); + + nick.setCurrentNick(nick.getNewNick()); + nick.setLastChangedDate(new Date().getTime()); + nick.setNewNick(null); + nick.setRequestedDate(0); + + Nicknames.getInstance().NickCache.put(nick.getUuid(), nick); + + ItemStack completedNickRequestItem = createCompletedNickRequestItem(offlinePlayerName, playerSkull); + inventoryClickEvent.getInventory().setItem(inventoryClickEvent.getSlot(), completedNickRequestItem); + playerWhoClicked.updateInventory(); + } + + private static ItemStack createCompletedNickRequestItem(Component offlinePlayerName, ItemStack playerSkull) { + ItemStack itemStack = new ItemStack(Material.SKELETON_SKULL); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.displayName(offlinePlayerName); + itemMeta.lore(playerSkull.lore()); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + private static String getOfflinePlayerName(OfflinePlayer offlinePlayer) { + return offlinePlayer.getName() == null ? UNKNOWN_PLAYER_NAME : offlinePlayer.getName(); + } + private ItemStack createPlayerSkull(Nick nick, List lore) { MiniMessage miniMessage = MiniMessage.miniMessage(); ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD); @@ -94,9 +216,9 @@ public class NicknamesGui implements Listener { meta.setOwningPlayer(offlinePlayer); String name = offlinePlayer.getName(); if (name == null) { - meta.displayName(miniMessage.deserialize("UNKNOWN PLAYER NAME")); + meta.displayName(miniMessage.deserialize("" + getOfflinePlayerName(offlinePlayer) + "")); } else { - meta.displayName(miniMessage.deserialize(offlinePlayer.getName())); + meta.displayName(miniMessage.deserialize(getOfflinePlayerName(offlinePlayer))); } TagResolver resolver = TagResolver.resolver( @@ -128,185 +250,6 @@ public class NicknamesGui implements Listener { // You can open the inventory with this public void openInventory(final HumanEntity ent) {//Possibly with a boolean to show if it should get from cache or update cache - ent.openInventory(inv); - } - - // Check for clicks on items - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void onInventoryClick(InventoryClickEvent e) { - if (e.getInventory() != inv) { - return; - } - - e.setCancelled(true); - - final ItemStack clickedItem = e.getCurrentItem(); - - if (clickedItem == null || clickedItem.getType() == Material.AIR) { - return; - } - - final Player p = (Player) e.getWhoClicked(); - - if (clickedItem.getType().equals(Material.PAPER)) { - Component component = clickedItem.getItemMeta().displayName(); - if (component == null) { - throw new IllegalStateException("Nicknames GUI: Item with no display name clicked!"); - } - String serialize = PlainTextComponentSerializer.plainText().serialize(component); - if (serialize.equals("Next Page")) { - setItems(currentPage + 1); - } - } else if (clickedItem.getType().equals(Material.PLAYER_HEAD)) { - ItemMeta itemMeta = clickedItem.getItemMeta(); - if (itemMeta == null) { - return; - } - SkullMeta meta = (SkullMeta) itemMeta; - if (meta.hasEnchants()) { - return; - } - OfflinePlayer owningPlayer = meta.getOwningPlayer(); - - if (owningPlayer == null) { - p.sendRichMessage(Config.NICK_USER_NOT_FOUND); - return; - } - - new BukkitRunnable() { - @Override - public void run() { - NickUtilities.updateCache(); - - Nick nick; - UUID uniqueId = owningPlayer.getUniqueId(); - if (Nicknames.getInstance().NickCache.containsKey(uniqueId)) { - nick = Nicknames.getInstance().NickCache.get(uniqueId); - } else { - nick = Queries.getNick(uniqueId); - } - Component itemDisplayName = itemMeta.displayName(); - if (itemDisplayName == null) { - return; - } - - if (nick == null || !nick.hasRequest()) { - p.sendRichMessage(Config.NICK_ALREADY_HANDLED, - Placeholder.component("targetplayer", itemDisplayName)) - ; - return; - } - - if (e.isLeftClick()) { - if (owningPlayer.hasPlayedBefore()) { - Queries.acceptNewNickname(uniqueId, nick.getNewNick()); - - String newNick = nick.getNewNick(); - - new BukkitRunnable() { - @Override - public void run() { - NickEvent nickEvent = new NickEvent(e.getWhoClicked().getName(), itemMeta.getDisplayName(), newNick, NickEvent.NickEventType.ACCEPTED); - nickEvent.callEvent(); - } - }.runTask(ChatPlugin.getInstance()); - - p.sendRichMessage(Config.NICK_ACCEPTED, - Placeholder.component("targetplayer", itemDisplayName), - Placeholder.component("newnick", Utility.applyColor(nick.getNewNick())), - Placeholder.component("oldnick", Utility.applyColor(nick.getCurrentNick() == null ? itemMeta.getDisplayName() : nick.getCurrentNick()))); - - if (owningPlayer.isOnline() && owningPlayer.getPlayer() != null) { - Nicknames.getInstance().setNick(owningPlayer.getPlayer(), nick.getNewNick()); - } - - NickUtilities.bungeeMessageHandled(uniqueId, e.getWhoClicked().getServer().getPlayer(e.getWhoClicked().getName()), "Accepted"); - - nick.setCurrentNick(nick.getNewNick()); - nick.setLastChangedDate(new Date().getTime()); - nick.setNewNick(null); - nick.setRequestedDate(0); - - Nicknames.getInstance().NickCache.put(uniqueId, nick); - - ItemStack itemStack = new ItemStack(Material.SKELETON_SKULL); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.displayName(itemMeta.displayName()); - itemMeta.lore(clickedItem.lore()); - itemStack.setItemMeta(itemMeta); - e.getInventory().setItem(e.getSlot(), itemStack); - p.updateInventory(); - } else { - p.sendRichMessage(Config.NICK_PLAYER_NOT_ONLINE, Placeholder.component("player", itemDisplayName)); - } - - } else if (e.isRightClick()) { - if (owningPlayer.hasPlayedBefore()) { - Queries.denyNewNickname(uniqueId); - - String newNick = nick.getNewNick(); - - new BukkitRunnable() { - @Override - public void run() { - NickEvent nickEvent = new NickEvent(e.getWhoClicked().getName(), itemMeta.getDisplayName(), newNick, NickEvent.NickEventType.DENIED); - nickEvent.callEvent(); - } - }.runTask(ChatPlugin.getInstance()); - - p.sendMessage(MiniMessage.miniMessage().deserialize(Config.NICK_DENIED, - Placeholder.unparsed("targetplayer", owningPlayer.getName()), - Placeholder.component("newnick", Utility.applyColor(nick.getNewNick())), - Placeholder.component("oldnick", Utility.applyColor(nick.getCurrentNick() == null ? owningPlayer.getName() : nick.getCurrentNick())))); - - if (Nicknames.getInstance().NickCache.containsKey(uniqueId) - && Nicknames.getInstance().NickCache.get(uniqueId).getCurrentNick() != null) { - nick.setNewNick(null); - nick.setRequestedDate(0); - Nicknames.getInstance().NickCache.put(uniqueId, nick); - } else { - Nicknames.getInstance().NickCache.remove(uniqueId); - } - - if (owningPlayer.isOnline() && owningPlayer.getPlayer() != null) { - Nicknames.getInstance().setNick(owningPlayer.getPlayer(), nick.getCurrentNick() == null ? owningPlayer.getName() : nick.getCurrentNick()); - owningPlayer.getPlayer().sendRichMessage(Config.NICK_NOT_CHANGED); - } - - NickUtilities.bungeeMessageHandled(uniqueId, e.getWhoClicked().getServer().getPlayer(e.getWhoClicked().getName()), "Denied"); - final ComponentLike messageDenied = MiniMessage.miniMessage().deserialize("'s nickname was denied!", - Placeholder.unparsed("name", owningPlayer.getName())); - ChatPlugin.getInstance().getServer().getOnlinePlayers().forEach(p -> { - if (p.hasPermission("chat.command.nick.review")) { - p.sendMessage(messageDenied); - } - }); - - ItemStack itemStack = new ItemStack(Material.SKELETON_SKULL); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.displayName(itemDisplayName); - itemMeta.lore(clickedItem.lore()); - itemStack.setItemMeta(itemMeta); - e.getInventory().setItem(e.getSlot(), itemStack); - p.updateInventory(); - } else { - if (itemDisplayName == null) { - p.sendRichMessage(Config.NICK_PLAYER_NOT_ONLINE, Placeholder.parsed("player", "UNKNOWN PLAYER NAME")); - } else { - p.sendRichMessage(Config.NICK_PLAYER_NOT_ONLINE, Placeholder.component("player", itemDisplayName)); - } - } - } - } - }.runTaskAsynchronously(ChatPlugin.getInstance()); - } - } - - // Cancel dragging in our inventory - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void onInventoryClick(InventoryDragEvent e) { - if (e.getInventory() == inv) { - e.setCancelled(true); - } + nicknamesGui.open(ent); } } diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts index d9074b4..769b7d3 100644 --- a/velocity/build.gradle.kts +++ b/velocity/build.gradle.kts @@ -5,8 +5,8 @@ plugins { dependencies { implementation(project(":api")) // API - compileOnly("com.velocitypowered:velocity-api:3.2.0-SNAPSHOT") - annotationProcessor("com.velocitypowered:velocity-api:3.2.0-SNAPSHOT") + compileOnly("com.velocitypowered:velocity-api:3.1.0") + annotationProcessor("com.velocitypowered:velocity-api:3.1.0") implementation("mysql:mysql-connector-java:8.0.33") // mysql implementation("org.spongepowered", "configurate-yaml", "4.2.0") compileOnly("net.kyori:adventure-text-minimessage:4.23.0")