From 8bd395c07a5a9a90bba7b61648efa12207a02fa4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:35:49 +0000 Subject: [PATCH 1/3] Initial plan From b968b07758ec6a84c9059d5ebb3d2f33e64e3320 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:41:08 +0000 Subject: [PATCH 2/3] Add right_click_command and shift_click_command support for panel buttons - Add rightClickCommand and shiftClickCommand fields to ControlPanelButton - Update ControlPanelGenerator to dispatch commands based on ClickType - Update ControlPanelManager to parse new command fields from YAML - Update controlPanelTemplate.yml comments with new command documentation - Update ControlPanelObjectTest to cover new fields Agent-Logs-Url: https://github.com/BentoBoxWorld/ControlPanel/sessions/ae4d379e-4e77-4531-8669-54851ebebea3 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../database/objects/ControlPanelObject.java | 54 +++++++++++++++++++ .../managers/ControlPanelManager.java | 2 + .../panels/ControlPanelGenerator.java | 48 ++++++++++++++++- src/main/resources/controlPanelTemplate.yml | 4 ++ .../objects/ControlPanelObjectTest.java | 8 +++ 5 files changed, 114 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java b/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java index 6c4c8f4..ccf0330 100644 --- a/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java +++ b/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java @@ -304,6 +304,48 @@ public void setCommand(String command) } + /** + * Method ControlPanelButton#getRightClickCommand returns the rightClickCommand of this object. + * + * @return the rightClickCommand (type String) of this object. + */ + public String getRightClickCommand() + { + return rightClickCommand; + } + + + /** + * Method ControlPanelButton#setRightClickCommand sets new value for the rightClickCommand of this object. + * @param rightClickCommand new value for this object. + */ + public void setRightClickCommand(String rightClickCommand) + { + this.rightClickCommand = rightClickCommand; + } + + + /** + * Method ControlPanelButton#getShiftClickCommand returns the shiftClickCommand of this object. + * + * @return the shiftClickCommand (type String) of this object. + */ + public String getShiftClickCommand() + { + return shiftClickCommand; + } + + + /** + * Method ControlPanelButton#setShiftClickCommand sets new value for the shiftClickCommand of this object. + * @param shiftClickCommand new value for this object. + */ + public void setShiftClickCommand(String shiftClickCommand) + { + this.shiftClickCommand = shiftClickCommand; + } + + /** * Method ControlPanelButton#getName returns the name of this object. * @@ -388,6 +430,18 @@ public void setDescriptionLines(List descriptionLines) @Expose private String command; + /** + * Command that will run on right click. + */ + @Expose + private String rightClickCommand; + + /** + * Command that will run on shift click. + */ + @Expose + private String shiftClickCommand; + /** * Name of the Button. */ diff --git a/src/main/java/world/bentobox/controlpanel/managers/ControlPanelManager.java b/src/main/java/world/bentobox/controlpanel/managers/ControlPanelManager.java index af25886..e7cc2f0 100644 --- a/src/main/java/world/bentobox/controlpanel/managers/ControlPanelManager.java +++ b/src/main/java/world/bentobox/controlpanel/managers/ControlPanelManager.java @@ -367,6 +367,8 @@ private void readControlPanel(YamlConfiguration config, @Nullable User user, fin { button.setName(buttonSection.getString("name")); button.setCommand(buttonSection.getString("command", "[user_command]")); + button.setRightClickCommand(buttonSection.getString("right_click_command")); + button.setShiftClickCommand(buttonSection.getString("shift_click_command")); // Create empty list button.setDescriptionLines(new ArrayList<>()); diff --git a/src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java b/src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java index 0dd7932..2e0890c 100644 --- a/src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java +++ b/src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java @@ -8,6 +8,7 @@ import org.bukkit.Material; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Comparator; @@ -120,7 +121,14 @@ private PanelItem generateButton(ControlPanelButton button) icon(button.getIcon() == null ? new ItemStack(button.getMaterial() == null ? Material.PAPER : button.getMaterial()) : button.getIcon()). description(description). clickHandler((panel, user, clickType, slot) -> { - final String parsedCommand = button.getCommand(). + final String rawCommand = this.getCommandForClickType(button, clickType); + + if (rawCommand == null || rawCommand.isEmpty()) + { + return true; + } + + final String parsedCommand = rawCommand. replace("[label]", this.topLabel). replace("[server]", ""). replace("[player]", user.getName()). @@ -128,7 +136,7 @@ private PanelItem generateButton(ControlPanelButton button) if (!parsedCommand.isEmpty()) { - if (button.getCommand().startsWith("[server]")) + if (rawCommand.startsWith("[server]")) { if (!this.addon.getServer().dispatchCommand( this.addon.getServer().getConsoleSender(), @@ -154,6 +162,42 @@ private PanelItem generateButton(ControlPanelButton button) } + /** + * This method returns the command string for a given click type. + * If a specific click type command is not defined, falls back to the default command. + * @param button ControlPanelButton that contains command definitions. + * @param clickType The type of click performed. + * @return The command string to execute, or null if no command is defined. + */ + private String getCommandForClickType(ControlPanelButton button, ClickType clickType) + { + switch (clickType) + { + case RIGHT: + case SHIFT_RIGHT: + if (button.getRightClickCommand() != null && !button.getRightClickCommand().isEmpty()) + { + return button.getRightClickCommand(); + } + + break; + + case SHIFT_LEFT: + if (button.getShiftClickCommand() != null && !button.getShiftClickCommand().isEmpty()) + { + return button.getShiftClickCommand(); + } + + break; + + default: + break; + } + + return button.getCommand(); + } + + // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- diff --git a/src/main/resources/controlPanelTemplate.yml b/src/main/resources/controlPanelTemplate.yml index 912e844..d8dd75e 100644 --- a/src/main/resources/controlPanelTemplate.yml +++ b/src/main/resources/controlPanelTemplate.yml @@ -5,6 +5,10 @@ # [server] - Command will be run by console, f.e. '[server] op [player]' will result in '/op BONNe1704' # [label] - [label] in command will be replaced with corresponding GameMode user command, # f.e. '[label] challenges' in BSkyblock will result in 'island challenges' +# Command types: +# command - Executed on left click (default click action) +# right_click_command - Executed on right click. Falls back to 'command' if not set. +# shift_click_command - Executed on shift+left click. Falls back to 'command' if not set. # material is used from Material.match # icon is used by parsing BentoBox ItemParser. Replacement for material. # permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]". diff --git a/src/test/java/world/bentobox/controlpanel/database/objects/ControlPanelObjectTest.java b/src/test/java/world/bentobox/controlpanel/database/objects/ControlPanelObjectTest.java index c6beb6c..624f54c 100644 --- a/src/test/java/world/bentobox/controlpanel/database/objects/ControlPanelObjectTest.java +++ b/src/test/java/world/bentobox/controlpanel/database/objects/ControlPanelObjectTest.java @@ -91,6 +91,14 @@ void testControlPanelButton() { button.setCommand("island go"); assertEquals("island go", button.getCommand()); + assertNull(button.getRightClickCommand()); + button.setRightClickCommand("island settings"); + assertEquals("island settings", button.getRightClickCommand()); + + assertNull(button.getShiftClickCommand()); + button.setShiftClickCommand("island team"); + assertEquals("island team", button.getShiftClickCommand()); + assertNull(button.getDescriptionLines()); List desc = new ArrayList<>(); desc.add("Line 1"); From 95e84741043a11c37581042f257280794c08a165 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:42:21 +0000 Subject: [PATCH 3/3] Address code review: clarify click type documentation Agent-Logs-Url: https://github.com/BentoBoxWorld/ControlPanel/sessions/ae4d379e-4e77-4531-8669-54851ebebea3 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../controlpanel/database/objects/ControlPanelObject.java | 2 +- src/main/resources/controlPanelTemplate.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java b/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java index ccf0330..08fc904 100644 --- a/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java +++ b/src/main/java/world/bentobox/controlpanel/database/objects/ControlPanelObject.java @@ -437,7 +437,7 @@ public void setDescriptionLines(List descriptionLines) private String rightClickCommand; /** - * Command that will run on shift click. + * Command that will run on shift+left click. */ @Expose private String shiftClickCommand; diff --git a/src/main/resources/controlPanelTemplate.yml b/src/main/resources/controlPanelTemplate.yml index d8dd75e..58347ae 100644 --- a/src/main/resources/controlPanelTemplate.yml +++ b/src/main/resources/controlPanelTemplate.yml @@ -7,7 +7,7 @@ # f.e. '[label] challenges' in BSkyblock will result in 'island challenges' # Command types: # command - Executed on left click (default click action) -# right_click_command - Executed on right click. Falls back to 'command' if not set. +# right_click_command - Executed on right click or shift+right click. Falls back to 'command' if not set. # shift_click_command - Executed on shift+left click. Falls back to 'command' if not set. # material is used from Material.match # icon is used by parsing BentoBox ItemParser. Replacement for material.