Chat/galaxy/src/main/java/com/alttd/chat/nicknames/NicknamesGui.java

313 lines
15 KiB
Java
Raw Normal View History

2022-09-26 21:55:49 +00:00
package com.alttd.chat.nicknames;
import com.alttd.chat.ChatPlugin;
import com.alttd.chat.config.Config;
2022-09-26 21:55:49 +00:00
import com.alttd.chat.database.Queries;
import com.alttd.chat.events.NickEvent;
import com.alttd.chat.objects.Nick;
2022-10-01 11:47:20 +00:00
import com.alttd.chat.util.Utility;
import net.kyori.adventure.text.Component;
2025-06-20 22:53:55 +00:00
import net.kyori.adventure.text.ComponentLike;
2022-10-02 02:52:33 +00:00
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;
2022-09-26 21:55:49 +00:00
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;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
2022-10-02 02:52:33 +00:00
import java.util.stream.Collectors;
2022-09-26 21:55:49 +00:00
public class NicknamesGui implements Listener {
2022-10-01 11:47:20 +00:00
private final Inventory inv;
private final int currentPage;
2022-09-26 21:55:49 +00:00
public NicknamesGui() {
// Create a new inventory, with no owner (as this isn't a real inventory)
2025-06-20 22:53:55 +00:00
inv = Bukkit.createInventory(null, 36, Utility.parseMiniMessage("Nicknames GUI").asComponent());
2022-09-26 21:55:49 +00:00
// Put the items into the inventory
currentPage = 1;
setItems(currentPage);
}
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;
for (Nick nick : Nicknames.getInstance().NickCache.values()) {
if (nick.hasRequest()) {
if (limit >= i / 27) {
inv.setItem(i % 27, createPlayerSkull(nick, Config.NICK_ITEM_LORE));
2022-09-26 21:55:49 +00:00
i++;
} else {
hasNextPage = true;
break;
}
}
}
if (currentPage != 1) {
inv.setItem(28, createGuiItem(Material.PAPER, "§bPrevious page",
2025-06-20 22:53:55 +00:00
"§aCurrent page: %page%".replace("%page%", String.valueOf(currentPage)),
"§aPrevious page: %previousPage%".replace("%previousPage%", String.valueOf(currentPage - 1))));
2022-09-26 21:55:49 +00:00
}
if (hasNextPage) {
inv.setItem(36, createGuiItem(Material.PAPER, "§bNext page",
2025-06-20 22:53:55 +00:00
"§aCurrent page: %page%".replace("%page%", String.valueOf(currentPage)),
"§aNext page: §b%nextPage%".replace("%nextPage%", String.valueOf(currentPage + 1))));
2022-09-26 21:55:49 +00:00
}
}
}.runTaskAsynchronously(ChatPlugin.getInstance());
}
private ItemStack createPlayerSkull(Nick nick, List<String> lore) {
2022-10-02 02:52:33 +00:00
MiniMessage miniMessage = MiniMessage.miniMessage();
2022-09-26 21:55:49 +00:00
ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD);
SkullMeta meta = (SkullMeta) playerHead.getItemMeta();
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(nick.getUuid());
meta.setOwningPlayer(offlinePlayer);
2022-10-02 02:52:33 +00:00
String name = offlinePlayer.getName();
2025-06-20 22:53:55 +00:00
if (name == null) {
2022-10-02 02:52:33 +00:00
meta.displayName(miniMessage.deserialize("UNKNOWN PLAYER NAME"));
2025-06-20 22:53:55 +00:00
} else {
2022-10-02 02:52:33 +00:00
meta.displayName(miniMessage.deserialize(offlinePlayer.getName()));
2025-06-20 22:53:55 +00:00
}
2022-10-02 02:52:33 +00:00
TagResolver resolver = TagResolver.resolver(
2022-10-03 15:42:28 +00:00
Placeholder.component("newnick", Utility.applyColor(nick.getNewNick())),
Placeholder.component("oldnick", Utility.applyColor(nick.getCurrentNick() == null ? "None" : nick.getCurrentNick())),
Placeholder.unparsed("lastchanged", nick.getLastChangedDate() == 0 ? "Not Applicable" : nick.getLastChangedDateFormatted()));
2022-10-02 02:52:33 +00:00
meta.lore(lore.stream().map(a -> miniMessage.deserialize(a, resolver)).collect(Collectors.toList()));
2022-09-26 21:55:49 +00:00
playerHead.setItemMeta(meta);
return playerHead;
}
// Nice little method to create a gui item with a custom name, and description
private ItemStack createGuiItem(final Material material, final String name, final String... lore) {
final ItemStack item = new ItemStack(material, 1);
final ItemMeta meta = item.getItemMeta();
// Set the name of the item
2022-10-01 11:47:20 +00:00
meta.displayName(Component.text(name));
2022-09-26 21:55:49 +00:00
// Set the lore of the item
2022-10-02 08:53:26 +00:00
MiniMessage miniMessage = MiniMessage.miniMessage();
meta.lore(Arrays.stream(lore).map(miniMessage::deserialize).collect(Collectors.toList()));
2022-09-26 21:55:49 +00:00
item.setItemMeta(meta);
return item;
}
// 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) {
2025-06-20 22:53:55 +00:00
if (e.getInventory() != inv) {
return;
}
2022-09-26 21:55:49 +00:00
e.setCancelled(true);
final ItemStack clickedItem = e.getCurrentItem();
2025-06-20 22:53:55 +00:00
if (clickedItem == null || clickedItem.getType() == Material.AIR) {
return;
}
2022-09-26 21:55:49 +00:00
final Player p = (Player) e.getWhoClicked();
if (clickedItem.getType().equals(Material.PAPER)) {
2025-06-20 22:53:55 +00:00
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);
2022-10-02 02:52:33 +00:00
if (serialize.equals("Next Page")) {
2022-09-26 21:55:49 +00:00
setItems(currentPage + 1);
}
} else if (clickedItem.getType().equals(Material.PLAYER_HEAD)) {
2025-06-20 22:53:55 +00:00
ItemMeta itemMeta = clickedItem.getItemMeta();
if (itemMeta == null) {
return;
}
SkullMeta meta = (SkullMeta) itemMeta;
2022-09-26 21:55:49 +00:00
if (meta.hasEnchants()) {
return;
}
OfflinePlayer owningPlayer = meta.getOwningPlayer();
if (owningPlayer == null) {
2025-06-20 22:53:55 +00:00
p.sendRichMessage(Config.NICK_USER_NOT_FOUND);
2022-09-26 21:55:49 +00:00
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);
}
2025-06-20 22:53:55 +00:00
Component itemDisplayName = itemMeta.displayName();
if (itemDisplayName == null) {
return;
}
2022-09-26 21:55:49 +00:00
if (nick == null || !nick.hasRequest()) {
2025-06-20 22:53:55 +00:00
p.sendRichMessage(Config.NICK_ALREADY_HANDLED,
Placeholder.component("targetplayer", itemDisplayName))
;
2022-09-26 21:55:49 +00:00
return;
}
if (e.isLeftClick()) {
if (owningPlayer.hasPlayedBefore()) {
Queries.acceptNewNickname(uniqueId, nick.getNewNick());
String newNick = nick.getNewNick();
new BukkitRunnable() {
@Override
public void run() {
2025-06-20 22:53:55 +00:00
NickEvent nickEvent = new NickEvent(e.getWhoClicked().getName(), itemMeta.getDisplayName(), newNick, NickEvent.NickEventType.ACCEPTED);
2022-09-26 21:55:49 +00:00
nickEvent.callEvent();
}
}.runTask(ChatPlugin.getInstance());
2025-06-20 22:53:55 +00:00
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())));
2022-09-26 21:55:49 +00:00
2022-10-01 11:47:20 +00:00
if (owningPlayer.isOnline() && owningPlayer.getPlayer() != null) {
2022-10-09 18:25:40 +00:00
Nicknames.getInstance().setNick(owningPlayer.getPlayer(), nick.getNewNick());
2022-09-26 21:55:49 +00:00
}
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();
2025-06-20 22:53:55 +00:00
itemMeta.displayName(itemMeta.displayName());
2022-10-01 11:47:20 +00:00
itemMeta.lore(clickedItem.lore());
2022-09-26 21:55:49 +00:00
itemStack.setItemMeta(itemMeta);
e.getInventory().setItem(e.getSlot(), itemStack);
p.updateInventory();
} else {
2025-06-20 22:53:55 +00:00
p.sendRichMessage(Config.NICK_PLAYER_NOT_ONLINE, Placeholder.component("player", itemDisplayName));
2022-09-26 21:55:49 +00:00
}
} else if (e.isRightClick()) {
if (owningPlayer.hasPlayedBefore()) {
Queries.denyNewNickname(uniqueId);
String newNick = nick.getNewNick();
new BukkitRunnable() {
@Override
public void run() {
2025-06-20 22:53:55 +00:00
NickEvent nickEvent = new NickEvent(e.getWhoClicked().getName(), itemMeta.getDisplayName(), newNick, NickEvent.NickEventType.DENIED);
2022-09-26 21:55:49 +00:00
nickEvent.callEvent();
}
}.runTask(ChatPlugin.getInstance());
2022-10-02 02:52:33 +00:00
p.sendMessage(MiniMessage.miniMessage().deserialize(Config.NICK_DENIED,
2025-06-20 22:53:55 +00:00
Placeholder.unparsed("targetplayer", owningPlayer.getName()),
Placeholder.component("newnick", Utility.applyColor(nick.getNewNick())),
Placeholder.component("oldnick", Utility.applyColor(nick.getCurrentNick() == null ? owningPlayer.getName() : nick.getCurrentNick()))));
2022-09-26 21:55:49 +00:00
if (Nicknames.getInstance().NickCache.containsKey(uniqueId)
2025-06-20 22:53:55 +00:00
&& Nicknames.getInstance().NickCache.get(uniqueId).getCurrentNick() != null) {
2022-09-26 21:55:49 +00:00
nick.setNewNick(null);
nick.setRequestedDate(0);
Nicknames.getInstance().NickCache.put(uniqueId, nick);
} else {
Nicknames.getInstance().NickCache.remove(uniqueId);
}
2022-10-01 11:47:20 +00:00
if (owningPlayer.isOnline() && owningPlayer.getPlayer() != null) {
2022-10-09 18:25:40 +00:00
Nicknames.getInstance().setNick(owningPlayer.getPlayer(), nick.getCurrentNick() == null ? owningPlayer.getName() : nick.getCurrentNick());
2025-06-20 22:53:55 +00:00
owningPlayer.getPlayer().sendRichMessage(Config.NICK_NOT_CHANGED);
2022-09-26 21:55:49 +00:00
}
NickUtilities.bungeeMessageHandled(uniqueId, e.getWhoClicked().getServer().getPlayer(e.getWhoClicked().getName()), "Denied");
2025-06-20 22:53:55 +00:00
final ComponentLike messageDenied = MiniMessage.miniMessage().deserialize("<red><name>'s nickname was denied!",
Placeholder.unparsed("name", owningPlayer.getName()));
2022-09-26 21:55:49 +00:00
ChatPlugin.getInstance().getServer().getOnlinePlayers().forEach(p -> {
2022-10-29 08:29:26 +00:00
if (p.hasPermission("chat.command.nick.review")) {
2022-09-26 21:55:49 +00:00
p.sendMessage(messageDenied);
}
});
ItemStack itemStack = new ItemStack(Material.SKELETON_SKULL);
ItemMeta itemMeta = itemStack.getItemMeta();
2025-06-20 22:53:55 +00:00
itemMeta.displayName(itemDisplayName);
2022-10-01 11:47:20 +00:00
itemMeta.lore(clickedItem.lore());
2022-09-26 21:55:49 +00:00
itemStack.setItemMeta(itemMeta);
e.getInventory().setItem(e.getSlot(), itemStack);
p.updateInventory();
} else {
2025-06-20 22:53:55 +00:00
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));
}
2022-09-26 21:55:49 +00:00
}
}
}
}.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);
}
}
}