diff --git a/plugins/fancydialogs/VERSION b/plugins/fancydialogs/VERSION index 329ee9fd..998726ed 100644 --- a/plugins/fancydialogs/VERSION +++ b/plugins/fancydialogs/VERSION @@ -1 +1 @@ -0.0.28 \ No newline at end of file +0.0.29 \ No newline at end of file diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/ConfirmationDialog.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/ConfirmationDialog.java similarity index 77% rename from plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/ConfirmationDialog.java rename to plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/ConfirmationDialog.java index 312594ff..86606d56 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/ConfirmationDialog.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/ConfirmationDialog.java @@ -1,9 +1,12 @@ -package com.fancyinnovations.fancydialogs.api; +package com.fancyinnovations.fancydialogs.api.dialogs; +import com.fancyinnovations.fancydialogs.api.Dialog; +import com.fancyinnovations.fancydialogs.api.FancyDialogs; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogData; import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogTextField; import org.bukkit.entity.Player; import java.util.List; @@ -19,6 +22,7 @@ public class ConfirmationDialog { private String title = "Confirmation"; private String confirmText = "Yes"; private String cancelText = "No"; + private String expectedUserInput = ""; private Dialog dialog; private String confirmButtonId; @@ -28,7 +32,7 @@ public class ConfirmationDialog { private Runnable onCancel = () -> { }; - public ConfirmationDialog(String title, String question, String confirmText, String cancelText, Runnable onConfirm, Runnable onCancel) { + public ConfirmationDialog(String title, String question, String confirmText, String cancelText, String expectedUserInput, Runnable onConfirm, Runnable onCancel) { this.title = title; this.question = question; this.confirmText = confirmText; @@ -56,6 +60,11 @@ public class ConfirmationDialog { return this; } + public ConfirmationDialog withExpectedUserInput(String expectedUserInput) { + this.expectedUserInput = expectedUserInput; + return this; + } + public ConfirmationDialog withOnConfirm(Runnable onConfirm) { this.onConfirm = onConfirm; return this; @@ -103,18 +112,31 @@ public class ConfirmationDialog { ); 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) + ); + } + + DialogInputs inputs = new DialogInputs(textFields, null, null); + DialogData dialogData = new DialogData( "confirmation_dialog_" + UUID.randomUUID(), title, false, List.of(new DialogBodyData(question)), - DialogInputs.EMPTY, // TODO add support for confirmation phrases + inputs, List.of(confirmBtn, cancelBtn) ); this.dialog = FancyDialogs.get().createDialog(dialogData); } + public String getExpectedUserInput() { + return expectedUserInput; + } + public String getConfirmButtonId() { return confirmButtonId; } diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/NoticeDialog.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/NoticeDialog.java similarity index 91% rename from plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/NoticeDialog.java rename to plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/NoticeDialog.java index 8f224a10..1fe91101 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/NoticeDialog.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/dialogs/NoticeDialog.java @@ -1,5 +1,6 @@ -package com.fancyinnovations.fancydialogs.api; +package com.fancyinnovations.fancydialogs.api.dialogs; +import com.fancyinnovations.fancydialogs.api.FancyDialogs; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogData; import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs; diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/events/DialogButtonClickedEvent.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/events/DialogButtonClickedEvent.java index b97d01f9..3ed4b0b8 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/events/DialogButtonClickedEvent.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/events/DialogButtonClickedEvent.java @@ -6,6 +6,8 @@ import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; +import java.util.Map; + public class DialogButtonClickedEvent extends Event { private static final HandlerList handlerList = new HandlerList(); @@ -13,12 +15,14 @@ public class DialogButtonClickedEvent extends Event { private final Player player; private final String dialogId; private final String buttonId; + private final Map payload; - public DialogButtonClickedEvent(@NotNull Player player, @NotNull String dialogId, @NotNull String buttonId) { + public DialogButtonClickedEvent(@NotNull Player player, @NotNull String dialogId, @NotNull String buttonId, @NotNull Map payload) { super(!Bukkit.isPrimaryThread()); this.player = player; this.dialogId = dialogId; this.buttonId = buttonId; + this.payload = payload; } public static HandlerList getHandlerList() { @@ -37,6 +41,10 @@ public class DialogButtonClickedEvent extends Event { return buttonId; } + public Map getPayload() { + return payload; + } + @Override public @NotNull HandlerList getHandlers() { return handlerList; diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java index 5881330d..29f027d9 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java @@ -1,9 +1,9 @@ package com.fancyinnovations.fancydialogs.commands; import com.fancyinnovations.fancydialogs.FancyDialogsPlugin; -import com.fancyinnovations.fancydialogs.api.ConfirmationDialog; import com.fancyinnovations.fancydialogs.api.Dialog; import com.fancyinnovations.fancydialogs.api.data.DialogData; +import com.fancyinnovations.fancydialogs.api.dialogs.ConfirmationDialog; import com.fancyinnovations.fancydialogs.config.FancyDialogsConfig; import com.fancyinnovations.fancydialogs.dialog.DialogImpl; import de.oliver.fancyanalytics.logger.LogLevel; diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/CustomClickActionPacketListener.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/CustomClickActionPacketListener.java index 774a0bd1..f1b369a8 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/CustomClickActionPacketListener.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/CustomClickActionPacketListener.java @@ -46,7 +46,7 @@ public class CustomClickActionPacketListener { String dialogId = packet.getPayload().get("dialog_id"); String buttonId = packet.getPayload().get("button_id"); - new DialogButtonClickedEvent(event.player(), dialogId, buttonId).callEvent(); + new DialogButtonClickedEvent(event.player(), dialogId, buttonId, packet.getPayload()).callEvent(); if (dialogId.startsWith("confirmation_dialog_")) { return; // Ignore confirmation dialog actions, handled separately diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/DialogButtonClickedListener.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/DialogButtonClickedListener.java index b1a406aa..f82e5f69 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/DialogButtonClickedListener.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/listener/DialogButtonClickedListener.java @@ -1,6 +1,7 @@ package com.fancyinnovations.fancydialogs.listener; -import com.fancyinnovations.fancydialogs.api.ConfirmationDialog; +import com.fancyinnovations.fancydialogs.FancyDialogsPlugin; +import com.fancyinnovations.fancydialogs.api.dialogs.ConfirmationDialog; import com.fancyinnovations.fancydialogs.api.events.DialogButtonClickedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -16,6 +17,21 @@ public class DialogButtonClickedListener implements Listener { } if (event.getButtonId().equals(dialog.getConfirmButtonId())) { + if (dialog.getExpectedUserInput() != null && !dialog.getExpectedUserInput().isEmpty()) { + if (!event.getPayload().containsKey("confirmation_user_input")) { + FancyDialogsPlugin.get().getFancyLogger().warn("Confirmation dialog expected user input but none was provided."); + return; + } + + String userInput = event.getPayload().get("confirmation_user_input"); + if (!userInput.equals(dialog.getExpectedUserInput())) { + FancyDialogsPlugin.get().getTranslator() + .translate("confirmation_dialog.input_mismatch") + .send(event.getPlayer()); + return; + } + } + dialog.getOnConfirm().run(); ConfirmationDialog.CACHE.remove(event.getDialogId()); } else if (event.getButtonId().equals(dialog.getCancelButtonId())) { diff --git a/plugins/fancydialogs/src/main/resources/languages/default.yml b/plugins/fancydialogs/src/main/resources/languages/default.yml index fecae7cb..efb95eab 100644 --- a/plugins/fancydialogs/src/main/resources/languages/default.yml +++ b/plugins/fancydialogs/src/main/resources/languages/default.yml @@ -2,6 +2,8 @@ language_name: default messages: dialog: not_found: "Dialog {warningColor}{id} is not registered." + confirmation_dialog: + input_mismatch: "Your input does not match the expected phrase." commands: dialog: open: