From 07d80f7dbb4b9743e0a608cd83fb92d63db734bd Mon Sep 17 00:00:00 2001 From: RaphaelS <71974856+RapahelS@users.noreply.github.com> Date: Fri, 5 Dec 2025 01:13:40 +0000 Subject: [PATCH 1/3] Refactor asynchronous tasks in SellGUI and CommandSellGUI for improved readability and performance --- .../shopguiplus/sellgui/SellGUI.java | 34 ++++----- .../sellgui/command/CommandSellGUI.java | 69 ++++++++++++------- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java index 74acdc1..6436832 100644 --- a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java +++ b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java @@ -127,23 +127,25 @@ private void setupUpdates() { UpdateChecker updateChecker = new UpdateChecker(this, 85170); updateChecker.getVersion(updateVersion -> { - CommandSender console = Bukkit.getConsoleSender(); - if (localVersion.contains("dev")) { - String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] You are running a DEVELOPMENT " + - "build. This may contain bugs."); + scheduler.runNextTick(task -> { + CommandSender console = Bukkit.getConsoleSender(); + if (localVersion.contains("dev")) { + String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] You are running a DEVELOPMENT " + + "build. This may contain bugs."); + console.sendMessage(message); + return; + } + + if (localVersion.equalsIgnoreCase(updateVersion)) { + String message = (ChatColor.GREEN + "[" + pluginPrefix + "] You are running the LATEST release."); + console.sendMessage(message); + return; + } + + String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] There is a new update available." + + " Please update ASAP. Download: https://www.spigotmc.org/resources/85170/"); console.sendMessage(message); - return; - } - - if (localVersion.equalsIgnoreCase(updateVersion)) { - String message = (ChatColor.GREEN + "[" + pluginPrefix + "] You are running the LATEST release."); - console.sendMessage(message); - return; - } - - String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] There is a new update available." + - " Please update ASAP. Download: https://www.spigotmc.org/resources/85170/"); - console.sendMessage(message); + }); }); } diff --git a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java index 78da7f3..b6467c2 100644 --- a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java +++ b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java @@ -14,7 +14,6 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; -import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.logging.Logger; @@ -118,19 +117,24 @@ private boolean commandReload(CommandSender sender) { return true; } - CompletableFuture.runAsync(this.plugin::generateFiles).whenComplete((success, error) -> { - if (error != null) { - sender.sendMessage(ChatColor.RED + "An error occurred, please check the server console."); - error.printStackTrace(); - return; - } + scheduler.runAsync(task -> { + this.plugin.generateFiles(); + + Runnable completion = () -> { + if (!this.plugin.getConfiguration().getBoolean("options.transaction_log.enabled", false)) + this.plugin.closeLogger(); + else if (this.plugin.fileLogger == null) this.plugin.initLogger(); - if (!this.plugin.getConfiguration().getBoolean("options.transaction_log.enabled", false)) this.plugin.closeLogger(); - else if (this.plugin.fileLogger == null) this.plugin.initLogger(); + sendMessage(sender, "reloaded_config"); + if (sender instanceof Player player) { + PlayerHandler.playSound(player, "success"); + } + }; - sendMessage(sender, "reloaded_config"); if (sender instanceof Player player) { - PlayerHandler.playSound(player, "success"); + scheduler.runAtEntity(player, t -> completion.run()); + } else { + scheduler.runNextTick(t -> completion.run()); } }); return true; @@ -167,22 +171,35 @@ private boolean commandDebug(CommandSender sender) { "- Memory Usage: " + getMemoryUsage() + "\n\n| Plugins\n" + String.join("\n", pluginInfoList) + "\n\n| Plugin Configuration\n\n" + configuration.saveToString(); - try { - String pasteUrl = new Hastebin().post(pasteRaw, true); - String pastedDumpMsg = ChatColor.translateAlternateColorCodes('&', - "&c[ShopGUIPlus-SellGUI] Successfully dumped server information here: %s."); - String message = String.format(Locale.US, pastedDumpMsg, pasteUrl); - Bukkit.getConsoleSender().sendMessage(message); - if (sender instanceof Player) sender.sendMessage(message); + scheduler.runAsync(task -> { + try { + String pasteUrl = new Hastebin().post(pasteRaw, true); + String pastedDumpMsg = ChatColor.translateAlternateColorCodes('&', + "&c[ShopGUIPlus-SellGUI] Successfully dumped server information here: %s."); - if (sender instanceof Player player) { - PlayerHandler.playSound(player, "success"); + String message = String.format(Locale.US, pastedDumpMsg, pasteUrl); + + scheduler.runNextTick(t -> Bukkit.getConsoleSender().sendMessage(message)); + + if (sender instanceof Player player) { + scheduler.runAtEntity(player, t -> { + player.sendMessage(message); + PlayerHandler.playSound(player, "success"); + }); + } + } catch (IOException ex) { + Runnable errorTask = () -> { + sender.sendMessage(ChatColor.RED + "An error occurred, please check the console:"); + ex.printStackTrace(); + }; + if (sender instanceof Player player) { + scheduler.runAtEntity(player, t -> errorTask.run()); + } else { + scheduler.runNextTick(t -> errorTask.run()); + } } - } catch (IOException ex) { - sender.sendMessage(ChatColor.RED + "An error occurred, please check the console:"); - ex.printStackTrace(); - } + }); return true; } @@ -311,7 +328,9 @@ private void setDecorationItems(ConfigurationSection configuration, Gui gui, Set if (section.getBoolean("item.sellinventory")) { scheduler.runAtEntity(human, task -> human.closeInventory()); - commandBase(Bukkit.getPlayer(humanName)); + if (human instanceof Player) { + commandBase((Player) human); + } } }); From ed7124ce837fe139234d3497c49d1cab70afedba Mon Sep 17 00:00:00 2001 From: RapahelS Date: Fri, 12 Dec 2025 14:38:07 +0100 Subject: [PATCH 2/3] Revert "Refactor asynchronous tasks in SellGUI and CommandSellGUI for improved readability and performance" This reverts commit 07d80f7dbb4b9743e0a608cd83fb92d63db734bd. --- .../shopguiplus/sellgui/SellGUI.java | 34 +++++---- .../sellgui/command/CommandSellGUI.java | 69 +++++++------------ 2 files changed, 41 insertions(+), 62 deletions(-) diff --git a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java index 6436832..74acdc1 100644 --- a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java +++ b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java @@ -127,25 +127,23 @@ private void setupUpdates() { UpdateChecker updateChecker = new UpdateChecker(this, 85170); updateChecker.getVersion(updateVersion -> { - scheduler.runNextTick(task -> { - CommandSender console = Bukkit.getConsoleSender(); - if (localVersion.contains("dev")) { - String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] You are running a DEVELOPMENT " + - "build. This may contain bugs."); - console.sendMessage(message); - return; - } - - if (localVersion.equalsIgnoreCase(updateVersion)) { - String message = (ChatColor.GREEN + "[" + pluginPrefix + "] You are running the LATEST release."); - console.sendMessage(message); - return; - } - - String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] There is a new update available." + - " Please update ASAP. Download: https://www.spigotmc.org/resources/85170/"); + CommandSender console = Bukkit.getConsoleSender(); + if (localVersion.contains("dev")) { + String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] You are running a DEVELOPMENT " + + "build. This may contain bugs."); console.sendMessage(message); - }); + return; + } + + if (localVersion.equalsIgnoreCase(updateVersion)) { + String message = (ChatColor.GREEN + "[" + pluginPrefix + "] You are running the LATEST release."); + console.sendMessage(message); + return; + } + + String message = (ChatColor.DARK_RED + "[" + pluginPrefix + "] There is a new update available." + + " Please update ASAP. Download: https://www.spigotmc.org/resources/85170/"); + console.sendMessage(message); }); } diff --git a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java index b6467c2..78da7f3 100644 --- a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java +++ b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/command/CommandSellGUI.java @@ -14,6 +14,7 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.logging.Logger; @@ -117,24 +118,19 @@ private boolean commandReload(CommandSender sender) { return true; } - scheduler.runAsync(task -> { - this.plugin.generateFiles(); - - Runnable completion = () -> { - if (!this.plugin.getConfiguration().getBoolean("options.transaction_log.enabled", false)) - this.plugin.closeLogger(); - else if (this.plugin.fileLogger == null) this.plugin.initLogger(); + CompletableFuture.runAsync(this.plugin::generateFiles).whenComplete((success, error) -> { + if (error != null) { + sender.sendMessage(ChatColor.RED + "An error occurred, please check the server console."); + error.printStackTrace(); + return; + } - sendMessage(sender, "reloaded_config"); - if (sender instanceof Player player) { - PlayerHandler.playSound(player, "success"); - } - }; + if (!this.plugin.getConfiguration().getBoolean("options.transaction_log.enabled", false)) this.plugin.closeLogger(); + else if (this.plugin.fileLogger == null) this.plugin.initLogger(); + sendMessage(sender, "reloaded_config"); if (sender instanceof Player player) { - scheduler.runAtEntity(player, t -> completion.run()); - } else { - scheduler.runNextTick(t -> completion.run()); + PlayerHandler.playSound(player, "success"); } }); return true; @@ -171,35 +167,22 @@ private boolean commandDebug(CommandSender sender) { "- Memory Usage: " + getMemoryUsage() + "\n\n| Plugins\n" + String.join("\n", pluginInfoList) + "\n\n| Plugin Configuration\n\n" + configuration.saveToString(); + try { + String pasteUrl = new Hastebin().post(pasteRaw, true); + String pastedDumpMsg = ChatColor.translateAlternateColorCodes('&', + "&c[ShopGUIPlus-SellGUI] Successfully dumped server information here: %s."); - scheduler.runAsync(task -> { - try { - String pasteUrl = new Hastebin().post(pasteRaw, true); - String pastedDumpMsg = ChatColor.translateAlternateColorCodes('&', - "&c[ShopGUIPlus-SellGUI] Successfully dumped server information here: %s."); - - String message = String.format(Locale.US, pastedDumpMsg, pasteUrl); - - scheduler.runNextTick(t -> Bukkit.getConsoleSender().sendMessage(message)); + String message = String.format(Locale.US, pastedDumpMsg, pasteUrl); + Bukkit.getConsoleSender().sendMessage(message); + if (sender instanceof Player) sender.sendMessage(message); - if (sender instanceof Player player) { - scheduler.runAtEntity(player, t -> { - player.sendMessage(message); - PlayerHandler.playSound(player, "success"); - }); - } - } catch (IOException ex) { - Runnable errorTask = () -> { - sender.sendMessage(ChatColor.RED + "An error occurred, please check the console:"); - ex.printStackTrace(); - }; - if (sender instanceof Player player) { - scheduler.runAtEntity(player, t -> errorTask.run()); - } else { - scheduler.runNextTick(t -> errorTask.run()); - } + if (sender instanceof Player player) { + PlayerHandler.playSound(player, "success"); } - }); + } catch (IOException ex) { + sender.sendMessage(ChatColor.RED + "An error occurred, please check the console:"); + ex.printStackTrace(); + } return true; } @@ -328,9 +311,7 @@ private void setDecorationItems(ConfigurationSection configuration, Gui gui, Set if (section.getBoolean("item.sellinventory")) { scheduler.runAtEntity(human, task -> human.closeInventory()); - if (human instanceof Player) { - commandBase((Player) human); - } + commandBase(Bukkit.getPlayer(humanName)); } }); From 508a8ff1bf109fa3f292310bc0c3e0068912836a Mon Sep 17 00:00:00 2001 From: RapahelS Date: Fri, 12 Dec 2025 15:55:36 +0100 Subject: [PATCH 3/3] feat: implement configurable aliases and /sell override logic - Added CommandRegistrar to dynamically register aliases from config - Added SellCommandListener to intercept no-arg alias commands (e.g. /sell) to open GUI - Updated config.yml with default aliases (sell, sg, sellg) - Ensures fallback to other plugins if arguments are provided to aliases --- .../shopguiplus/sellgui/SellGUI.java | 4 + .../listeners/SellCommandListener.java | 36 +++++++ .../sellgui/utility/CommandRegistrar.java | 94 +++++++++++++++++++ src/main/resources/config.yml | 12 +++ 4 files changed, 146 insertions(+) create mode 100644 src/main/java/net/mackenziemolloy/shopguiplus/sellgui/listeners/SellCommandListener.java create mode 100644 src/main/java/net/mackenziemolloy/shopguiplus/sellgui/utility/CommandRegistrar.java diff --git a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java index 74acdc1..98fb98b 100644 --- a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java +++ b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/SellGUI.java @@ -48,6 +48,10 @@ public void onEnable() { scheduler = foliaLib.getScheduler(); new CommandSellGUI(this).register(); + new net.mackenziemolloy.shopguiplus.sellgui.utility.CommandRegistrar(this).registerAliases(); + getServer().getPluginManager() + .registerEvents(new net.mackenziemolloy.shopguiplus.sellgui.listeners.SellCommandListener(this), this); + Logger logger = getLogger(); checkCompatibility(); diff --git a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/listeners/SellCommandListener.java b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/listeners/SellCommandListener.java new file mode 100644 index 0000000..75fac7f --- /dev/null +++ b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/listeners/SellCommandListener.java @@ -0,0 +1,36 @@ +package net.mackenziemolloy.shopguiplus.sellgui.listeners; + +import net.mackenziemolloy.shopguiplus.sellgui.SellGUI; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +import java.util.Locale; + +public class SellCommandListener implements Listener { + + private final SellGUI plugin; + + public SellCommandListener(SellGUI plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onCommandPreProcess(PlayerCommandPreprocessEvent event) { + String message = event.getMessage(); + String[] args = message.split(" "); + + if (args.length != 1) { + return; + } + + String command = args[0].substring(1).toLowerCase(Locale.US); + java.util.List aliases = plugin.getConfiguration().getStringList("options.commands.aliases"); + + if (aliases.contains(command)) { + event.setCancelled(true); + plugin.getCommand("sellgui").execute(event.getPlayer(), "sellgui", new String[0]); + } + } +} diff --git a/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/utility/CommandRegistrar.java b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/utility/CommandRegistrar.java new file mode 100644 index 0000000..5624b6e --- /dev/null +++ b/src/main/java/net/mackenziemolloy/shopguiplus/sellgui/utility/CommandRegistrar.java @@ -0,0 +1,94 @@ +package net.mackenziemolloy.shopguiplus.sellgui.utility; + +import net.mackenziemolloy.shopguiplus.sellgui.SellGUI; +import org.bukkit.Bukkit; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandMap; +import org.bukkit.command.PluginCommand; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.SimplePluginManager; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.List; +import java.util.logging.Level; + +public class CommandRegistrar { + + private final SellGUI plugin; + + public CommandRegistrar(SellGUI plugin) { + this.plugin = plugin; + } + + public void registerAliases() { + List aliases = plugin.getConfiguration().getStringList("options.commands.aliases"); + if (aliases == null || aliases.isEmpty()) { + return; + } + + CommandMap commandMap = getCommandMap(); + if (commandMap == null) { + plugin.getLogger().severe("Could not retrieve CommandMap. Custom aliases will not work."); + return; + } + + PluginCommand sellGuiCommand = plugin.getCommand("sellgui"); + if (sellGuiCommand == null) { + plugin.getLogger().severe("The main 'sellgui' command is not registered!"); + return; + } + + for (String alias : aliases) { + Command command = commandMap.getCommand(alias); + if (command != null && !command.getLabel().equalsIgnoreCase(alias)) { + // If the command exists but under a fallback prefix (plugin:cmd), we might + // still want to register ours? + // Bukkit's getCommand returns the first match. + // If Essentials has 'sell', getCommand('sell') returns it. + } + + // We only skip if there is a command that directly matches the alias + if (command != null + && (command.getLabel().equalsIgnoreCase(alias) || command.getAliases().contains(alias))) { + // plugin.getLogger().info("Skipping registration of alias '" + alias + "' as it + // is already registered."); + continue; + } + + PluginCommand aliasCommand = createPluginCommand(alias, plugin); + if (aliasCommand != null) { + aliasCommand.setExecutor(sellGuiCommand.getExecutor()); + aliasCommand.setTabCompleter(sellGuiCommand.getTabCompleter()); + aliasCommand.setDescription(sellGuiCommand.getDescription()); + + commandMap.register(plugin.getDescription().getName(), aliasCommand); + } + } + } + + private CommandMap getCommandMap() { + try { + if (Bukkit.getPluginManager() instanceof SimplePluginManager) { + Field f = SimplePluginManager.class.getDeclaredField("commandMap"); + f.setAccessible(true); + return (CommandMap) f.get(Bukkit.getPluginManager()); + } + } catch (Exception e) { + plugin.getLogger().log(Level.SEVERE, "Failed to get command map", e); + } + return null; + } + + private PluginCommand createPluginCommand(String name, Plugin plugin) { + try { + Constructor c = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class); + c.setAccessible(true); + return c.newInstance(name, plugin); + } catch (Exception e) { + plugin.getLogger().log(Level.SEVERE, "Failed to create PluginCommand for alias: " + name, e); + return null; + } + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 689b53a..e09df66 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -17,6 +17,18 @@ # options: + # + # Command Configuration + # + commands: + # + # Custom aliases for /sellgui + # + aliases: + - "sell" + - "sg" + - "sellg" + # # 0 - None # 1 - Hover message (Adds "receipt_text" to the end of the message)