diff --git a/docs/src/fancydialogs/tutorials/json-schema.md b/docs/src/fancydialogs/tutorials/json-schema.md index 54cff265..6e661d78 100644 --- a/docs/src/fancydialogs/tutorials/json-schema.md +++ b/docs/src/fancydialogs/tutorials/json-schema.md @@ -36,7 +36,10 @@ Below is an example of a simple dialog defined using the FancyDialogs JSON schem "label": "What is your favorite color?", "placeholder": "gold", "maxLength": 50, - "maxLines": 1 + "maxLines": 1, + "requirements": { + "type": "" + } } ] }, @@ -49,7 +52,10 @@ Below is an example of a simple dialog defined using the FancyDialogs JSON schem "name": "message", "data": "Your favorite color is: {fav_color}" } - ] + ], + "requirements": { + "type": "" + } } ] } @@ -85,6 +91,13 @@ Items will be supported in the body section in a future release. `selects`: A list of select fields - see [Select Fields](#select-fields) for details +`requirements`: The requirement for this field to display +- `type`: Either `permission` or `stringMatch`. +- `permission`: If type is `permission`, this is the permission to check for. +- `input`: If type is `stringMatch`, this is the string being matched against `output`. +- `output`: If type is `stringMatch`, this is the string being matched against `input`. + + !!!info More input types will be added in future releases, such as checkboxes and number sliders. !!! @@ -103,6 +116,13 @@ More input types will be added in future releases, such as checkboxes and number `maxLines`: The maximum number of lines for the input (greater than 1 will create a multiline text field) +`requirements`: The requirement for this field to display +- `type`: Either `permission` or `stringMatch`. +- `permission`: If type is `permission`, this is the permission to check for. +- `input`: If type is `stringMatch`, this is the string being matched against `output`. +- `output`: If type is `stringMatch`, this is the string being matched against `input`. + + #### Select Fields `key`: The key to use to store the input value (can be used as a placeholder in actions) @@ -116,11 +136,23 @@ More input types will be added in future releases, such as checkboxes and number - `display`: The text to display in the select field (supports MiniMessage & PlaceholderAPI) - `initial`: Whether this option is selected by default (default: false) +`requirements`: The requirement for this field to display +- `type`: Either `permission` or `stringMatch`. +- `permission`: If type is `permission`, this is the permission to check for. +- `input`: If type is `stringMatch`, this is the string being matched against `output`. +- `output`: If type is `stringMatch`, this is the string being matched against `input`. + ### Button fields - `label`: The text to display on the button (supports MiniMessage & PlaceholderAPI) - `tooltip`: The tooltip to display when hovering over the button (supports MiniMessage & PlaceholderAPI) - `actions`: A list of actions that will be executed when the button is clicked - see [Actions](#actions) for details + +- `requirements`: The requirement for this field to display + - `type`: Either `permission` or `stringMatch`. + - `permission`: If type is `permission`, this is the permission to check for. + - `input`: If type is `stringMatch`, this is the string being matched against `output`. + - `output`: If type is `stringMatch`, this is the string being matched against `input`. #### Actions diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogButton.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogButton.java index bc02e25d..b7c3dc39 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogButton.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogButton.java @@ -1,6 +1,7 @@ package com.fancyinnovations.fancydialogs.api.data; import java.util.List; +import java.util.Map; import java.util.UUID; public class DialogButton { @@ -9,12 +10,14 @@ public class DialogButton { private final String tooltip; private final List actions; private transient String id; + private final Map requirements; - public DialogButton(String label, String tooltip, List actions) { + public DialogButton(String label, String tooltip, List actions, Map requirements) { this.id = UUID.randomUUID().toString(); this.label = label; this.tooltip = tooltip; this.actions = actions; + this.requirements = Map.copyOf(requirements); } public String id() { @@ -32,6 +35,8 @@ public String tooltip() { return tooltip; } + public Map requirements() { return requirements; } + public List actions() { return actions; } diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogCheckbox.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogCheckbox.java index d6522454..f584a396 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogCheckbox.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogCheckbox.java @@ -1,11 +1,13 @@ package com.fancyinnovations.fancydialogs.api.data.inputs; +import java.util.Map; + public class DialogCheckbox extends DialogInput { private final boolean initial; - public DialogCheckbox(String key, String label, int order, boolean initial) { - super(key, label, order); + public DialogCheckbox(String key, String label, int order, boolean initial, Map requirements) { + super(key, label, order, requirements); this.initial = initial; } diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInput.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInput.java index c72a6047..52e6aa96 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInput.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInput.java @@ -1,15 +1,19 @@ package com.fancyinnovations.fancydialogs.api.data.inputs; +import java.util.Map; + public abstract class DialogInput { protected final String key; protected final String label; protected final int order; + protected final Map requirements; - public DialogInput(String key, String label, int order) { + public DialogInput(String key, String label, int order, Map requirements) { this.key = key; this.label = label; this.order = order; + this.requirements = Map.copyOf(requirements); } public String getKey() { @@ -23,4 +27,6 @@ public String getLabel() { public int getOrder() { return order; } + + public Map getRequirements() { return requirements; } } diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogSelect.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogSelect.java index 78d2e724..33e5b4b5 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogSelect.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogSelect.java @@ -1,13 +1,14 @@ package com.fancyinnovations.fancydialogs.api.data.inputs; import java.util.List; +import java.util.Map; public class DialogSelect extends DialogInput { private final List options; - public DialogSelect(String key, String label, int order, List options) { - super(key, label, order); + public DialogSelect(String key, String label, int order, List options, Map requirements) { + super(key, label, order, requirements); this.options = options; } diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogTextField.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogTextField.java index 5e60f3fc..31ae49d8 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogTextField.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogTextField.java @@ -1,13 +1,15 @@ package com.fancyinnovations.fancydialogs.api.data.inputs; +import java.util.Map; + public class DialogTextField extends DialogInput { private final String placeholder; private final int maxLength; private final int maxLines; - public DialogTextField(String key, String label, int order, String placeholder, int maxLength, int maxLines) { - super(key, label, order); + public DialogTextField(String key, String label, int order, String placeholder, int maxLength, int maxLines, Map requirements) { + super(key, label, order, requirements); this.placeholder = placeholder; this.maxLength = maxLength; this.maxLines = maxLines; diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/ConfirmationDialog.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/ConfirmationDialog.java index 86606d56..4cb80ff0 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/ConfirmationDialog.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/ConfirmationDialog.java @@ -99,7 +99,8 @@ private void buildDialog() { confirmText, List.of( new DialogButton.DialogAction("confirm", "") - ) + ), + Map.of("", "") ); this.confirmButtonId = confirmBtn.id(); @@ -108,14 +109,15 @@ private void buildDialog() { cancelText, List.of( new DialogButton.DialogAction("cancel", "") - ) + ), + Map.of("", "") ); this.cancelButtonId = cancelBtn.id(); List textFields = null; if (expectedUserInput != null && !expectedUserInput.isEmpty()) { textFields = List.of( - new DialogTextField("confirmation_user_input", "Type '" + expectedUserInput + "' to confirm", 0, "", expectedUserInput.length(), 1) + new DialogTextField("confirmation_user_input", "Type '" + expectedUserInput + "' to confirm", 0, "", expectedUserInput.length(), 1, Map.of("type", "")) ); } diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java index 20488213..a34534b8 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java @@ -26,6 +26,7 @@ import de.oliver.fancysitula.factories.FancySitula; import org.bukkit.entity.Player; import org.lushplugins.chatcolorhandler.ChatColorHandler; +import org.lushplugins.chatcolorhandler.parsers.Parser; import org.lushplugins.chatcolorhandler.parsers.ParserTypes; import java.util.ArrayList; @@ -54,6 +55,29 @@ private String replaceArgs(String text, String[] args) { return result; } + private boolean checkPerm(Player player, String perm) { + if (perm == null) { + return true; + } + if (!perm.equals("") && !player.hasPermission(perm)) { + return false; + } + return true; + } + + private boolean checkRequirements(Player player, Map requirements) { + if (requirements == null) { return true; } + if (requirements.get("type") == null) { return true; } + if (requirements.get("type").equals("permission")) { + return checkPerm(player, requirements.get("permission")); + } + if (requirements.get("type").equals("stringMatch")) { + if (requirements.get("input") == null || requirements.get("output") == null) { return true; } + return ChatColorHandler.translate(requirements.get("input"), player, ParserTypes.placeholder()).equals(ChatColorHandler.translate(requirements.get("output"), player, ParserTypes.placeholder())); + } + return true; + } + private FS_Dialog buildForPlayer(Player player, String[] args) { List body = new ArrayList<>(); for (DialogBodyData bodyData : data.body()) { @@ -73,6 +97,7 @@ private FS_Dialog buildForPlayer(Player player, String[] args) { List inputs = new ArrayList<>(); if (data.inputs() != null) { for (DialogInput input : data.inputs().all()) { + if (!checkRequirements(player, input.getRequirements())) { continue; } FS_DialogInputControl control = null; if (input instanceof DialogTextField textField) { String label = replaceArgs(textField.getLabel(), args); @@ -122,6 +147,7 @@ private FS_Dialog buildForPlayer(Player player, String[] args) { List actions = new ArrayList<>(); for (DialogButton button : data.buttons()) { FS_DialogActionButtonAction buttonAction; + if (!checkRequirements(player, button.requirements())) { continue; } if (button.actions().size() == 1 && button.actions().get(0).name().equals("copy_to_clipboard")) { diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java index 690bdf39..cf778ce2 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java @@ -13,6 +13,7 @@ import java.io.File; import java.util.List; +import java.util.Map; public class DefaultDialogs { @@ -52,7 +53,8 @@ private static void welcomeToFancyDialogsDialog() { 1, "", 50, - 1 + 1, + Map.of("type", "") ) ), List.of( @@ -65,7 +67,8 @@ private static void welcomeToFancyDialogsDialog() { new DialogSelect.Entry("green", "Green", false), new DialogSelect.Entry("blue", "Blue", false), new DialogSelect.Entry("yellow", "Yellow", false) - ) + ), + Map.of("type", "") ) ), List.of( @@ -73,7 +76,8 @@ private static void welcomeToFancyDialogsDialog() { "is_cool", "Are you cool?", 3, - true + true, + Map.of("type", "") ) ) ), @@ -81,21 +85,24 @@ private static void welcomeToFancyDialogsDialog() { new DialogButton( "Close", "Enjoy using FancyDialogs", - List.of() + List.of(), + Map.of("type", "") ), new DialogButton( "Show favourite color", "Click to show your fav color :D", List.of( new DialogButton.DialogAction("message", "Hi {nickname}, your favorite color is: {color_choice}") - ) + ), + Map.of("type", "") ), new DialogButton( "Check if you are cool", "Click to know if, you are cool", List.of( new DialogButton.DialogAction("message", "Hi {nickname}, are you cool: {is_cool}") - ) + ), + Map.of("type", "") ) ) ); @@ -121,26 +128,30 @@ private static void welcomeDialog() { "Click to read our rules!", List.of( new DialogButton.DialogAction("open_dialog", "rules") - ) + ), + Map.of("type", "") ), new DialogButton( "Start playing", "Click to start playing!", - List.of() + List.of(), + Map.of("type", "") ), new DialogButton( "Join our Discord", "Click to join our Discord server!", List.of( new DialogButton.DialogAction("message", "Join our Discord server here: LINK TO DISCORD") - ) + ), + Map.of("type", "") ), new DialogButton( "Visit our website", "Click to visit our website!", List.of( new DialogButton.DialogAction("message", "Visit our website here: LINK TO WEBSITE") - ) + ), + Map.of("type", "") ) ) ); @@ -163,33 +174,38 @@ private static void quickActions() { "Click to visit our website!", List.of( new DialogButton.DialogAction("message", "Visit our website here: LINK TO WEBSITE") - ) + ), + Map.of("type", "") ), new DialogButton( "Read the rules", "Click to read our rules!", List.of( new DialogButton.DialogAction("open_dialog", "rules") - ) + ), + Map.of("type", "") ), new DialogButton( "Join our Discord", "Click to join our Discord server!", List.of( new DialogButton.DialogAction("message", "Join our Discord server here: LINK TO DISCORD") - ) + ), + Map.of("type", "") ), new DialogButton( "Support us", "Click to support us!", List.of( new DialogButton.DialogAction("message", "Support us by donating here: LINK TO DONATE") - ) + ), + Map.of("type", "") ), new DialogButton( "Close", "Click to close this dialog!", - List.of() + List.of(), + Map.of("type", "") ) ) );