Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
*
Expand DownExpand Up@@ -388,6 +430,18 @@ public void setDescriptionLines(List<String> descriptionLines)
@Expose
private String command;

/**
* Command that will run on right click.
*/
@Expose
private String rightClickCommand;

/**
* Command that will run on shift+left click.
*/
@Expose
private String shiftClickCommand;

/**
* Name of the Button.
*/
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<>());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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;
Expand DownExpand Up@@ -120,15 +121,22 @@
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()).
trim();

if (!parsedCommand.isEmpty())
{
if (button.getCommand().startsWith("[server]"))
if (rawCommand.startsWith("[server]"))
{
if (!this.addon.getServer().dispatchCommand(
this.addon.getServer().getConsoleSender(),
Expand All@@ -154,6 +162,42 @@
}


/**
* 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:

Check warning on line 177 in src/main/java/world/bentobox/controlpanel/panels/ControlPanelGenerator.java

View check run for this annotation

SonarQubeCloud/ SonarCloud Code Analysis

Merge the previous cases into this one using comma-separated label.

See more on https://sonarcloud.io/project/issues?id=BentoBoxWorld_ControlPanel&issues=AZ1PLfu0P8eqLqF6p9Nx&open=AZ1PLfu0P8eqLqF6p9Nx&pullRequest=35
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
// ---------------------------------------------------------------------
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/controlPanelTemplate.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 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.
# permission is a suffix that will be added to the end of "[gamemode].controlpanel.panel.[suffix]".
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -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<String> desc = new ArrayList<>();
desc.add("Line 1");
Expand Down
Loading