diff --git a/api/src/main/java/net/md_5/bungee/api/event/CustomClickEvent.java b/api/src/main/java/net/md_5/bungee/api/event/CustomClickEvent.java index 0d340668..6860dafb 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/CustomClickEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/CustomClickEvent.java @@ -1,6 +1,6 @@ package net.md_5.bungee.api.event; -import java.util.Map; +import com.google.gson.JsonElement; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -34,19 +34,9 @@ public class CustomClickEvent extends Event implements Cancellable */ private final String id; /** - * The raw data as submitted. + * The data as submitted. */ - private final String rawData; - /** - * The parsed form data. - *
- * If a form submission, usually contains a - * {@code CustomClickEvent.ACTION_KEY} key with the ID of the relevant - * submission action. - *
- * If not a form submission, then may be null. - */ - private final Map parsedData; + private final JsonElement data; /** * Cancelled state. */ diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/ConfirmationDialog.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/ConfirmationDialog.java index e373ae5c..3d17fe02 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/ConfirmationDialog.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/ConfirmationDialog.java @@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.ToString; import lombok.experimental.Accessors; -import net.md_5.bungee.api.dialog.action.DialogClickAction; +import net.md_5.bungee.api.dialog.action.DialogAction; /** * Represents a simple dialog with text and two actions at the bottom (default: @@ -26,11 +26,11 @@ public final class ConfirmationDialog implements Dialog /** * The "yes" click action / bottom (appears on the left). */ - private DialogClickAction yes; + private DialogAction yes; /** * The "no" click action / bottom (appears on the right). */ - private DialogClickAction no; + private DialogAction no; public ConfirmationDialog(@NonNull DialogBase base) { diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogBase.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogBase.java index b261628e..1c352c6d 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogBase.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogBase.java @@ -8,6 +8,7 @@ import lombok.NonNull; import lombok.experimental.Accessors; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.dialog.body.DialogBody; +import net.md_5.bungee.api.dialog.input.DialogInput; /** * Represents the title and other options common to all dialogs. @@ -29,6 +30,10 @@ public final class DialogBase */ @SerializedName("external_title") private BaseComponent externalTitle; + /** + * The inputs to the dialog. + */ + private List inputs; /** * The body elements which make up this dialog. */ @@ -38,9 +43,42 @@ public final class DialogBase */ @SerializedName("can_close_with_escape") private Boolean canCloseWithEscape; + /** + * Whether this dialog should pause the game in single-player mode (default: + * true). + */ + private Boolean pause; + /** + * Action to take after the a click or submit action is performed on the + * dialog (default: close). + */ + @SerializedName("after_action") + private AfterAction afterAction; public DialogBase(@NonNull BaseComponent title) { - this( title, null, null, null ); + this( title, null, null, null, null, null, null ); + } + + /** + * Types of action which may be taken after the dialog. + */ + public enum AfterAction + { + /** + * Close the dialog. + */ + @SerializedName("close") + CLOSE, + /** + * Do nothing. + */ + @SerializedName("none") + NONE, + /** + * Show a waiting for response screen. + */ + @SerializedName("wait_for_response") + WAIT_FOR_RESPONSE; } } diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogListDialog.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogListDialog.java index ea3e02f4..133b0d88 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogListDialog.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/DialogListDialog.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.ToString; import lombok.experimental.Accessors; -import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.dialog.action.DialogAction; /** * Represents a dialog which contains buttons that link to other dialogs. @@ -29,10 +29,10 @@ public final class DialogListDialog implements Dialog */ private List dialogs; /** - * The {@link ClickEvent} activated when the dialog is cancelled. + * The {@link DialogAction} activated when the dialog is exited. */ - @SerializedName("on_cancel") - private ClickEvent onCancel; + @SerializedName("exit_action") + private DialogAction exitAction; /** * The number of columns for the dialog buttons (default: 2). */ @@ -48,11 +48,11 @@ public final class DialogListDialog implements Dialog this( base, Arrays.asList( dialogs ), null, null, null ); } - public DialogListDialog(@NonNull DialogBase base, List dialogs, ClickEvent onCancel, Integer columns, Integer buttonWidth) + public DialogListDialog(@NonNull DialogBase base, List dialogs, DialogAction exitAction, Integer columns, Integer buttonWidth) { this.base = base; this.dialogs = dialogs; - this.onCancel = onCancel; + this.exitAction = exitAction; columns( columns ); buttonWidth( buttonWidth ); } diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/MultiActionDialog.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/MultiActionDialog.java index 3314c6a6..6a7c23af 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/MultiActionDialog.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/MultiActionDialog.java @@ -9,8 +9,7 @@ import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.ToString; import lombok.experimental.Accessors; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.dialog.action.DialogClickAction; +import net.md_5.bungee.api.dialog.action.DialogAction; /** * Represents a dialog with text a list of action buttons grouped into columns @@ -30,30 +29,30 @@ public final class MultiActionDialog implements Dialog * The action buttons in the dialog. At least one must be provided. */ @NonNull - private List actions; + private List actions; /** * The number of columns for the dialog buttons (default: 2). */ private Integer columns; /** - * The {@link ClickEvent} activated when the dialog is cancelled. + * The {@link DialogAction} activated when the dialog is exited. */ - @SerializedName("on_cancel") - private ClickEvent onCancel; + @SerializedName("exit_action") + private DialogAction exitAction; - public MultiActionDialog(@NonNull DialogBase base, @NonNull DialogClickAction... actions) + public MultiActionDialog(@NonNull DialogBase base, @NonNull DialogAction... actions) { this( base, Arrays.asList( actions ), null, null ); } - public MultiActionDialog(@NonNull DialogBase base, @NonNull List actions, Integer columns, ClickEvent onCancel) + public MultiActionDialog(@NonNull DialogBase base, @NonNull List actions, Integer columns, DialogAction exitAction) { Preconditions.checkArgument( !actions.isEmpty(), "At least one action must be provided" ); this.base = base; this.actions = actions; columns( columns ); - this.onCancel = onCancel; + this.exitAction = exitAction; } public MultiActionDialog columns(Integer columns) diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/MultiActionInputFormDialog.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/MultiActionInputFormDialog.java deleted file mode 100644 index 0243e5bd..00000000 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/MultiActionInputFormDialog.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.md_5.bungee.api.dialog; - -import com.google.common.base.Preconditions; -import java.util.Arrays; -import java.util.List; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NonNull; -import lombok.ToString; -import lombok.experimental.Accessors; -import net.md_5.bungee.api.dialog.action.DialogSubmitAction; -import net.md_5.bungee.api.dialog.input.DialogInput; - -/** - * Represents a dialog which contains a variety of inputs and a multiple submit - * buttons at the bottom. - */ -@Data -@ToString -@EqualsAndHashCode -@Accessors(fluent = true) -public final class MultiActionInputFormDialog implements Dialog -{ - - @Accessors(fluent = false) - @NonNull - private DialogBase base; - /** - * The inputs to the dialog. At least one input must be provided. - */ - @NonNull - private List inputs; - /** - * The action/submit buttons for the dialog. At least one action must be - * provided. - */ - @NonNull - private List actions; - /** - * The amount of columns (default: 2) - */ - private Integer columns; - - public MultiActionInputFormDialog(@NonNull DialogBase base, @NonNull DialogInput input, @NonNull DialogSubmitAction action) - { - this( base, Arrays.asList( input ), Arrays.asList( action ), null ); - } - - public MultiActionInputFormDialog(@NonNull DialogBase base, @NonNull DialogInput input, @NonNull DialogSubmitAction action, Integer columns) - { - this( base, Arrays.asList( input ), Arrays.asList( action ), columns ); - } - - public MultiActionInputFormDialog(@NonNull DialogBase base, @NonNull List inputs, @NonNull List actions, Integer columns) - { - Preconditions.checkArgument( !inputs.isEmpty(), "At least one input must be provided" ); - Preconditions.checkArgument( !actions.isEmpty(), "At least one action must be provided" ); - - this.base = base; - this.inputs = inputs; - this.actions = actions; - columns( columns ); - } - - public MultiActionInputFormDialog columns(Integer columns) - { - Preconditions.checkArgument( columns == null || columns > 0, "At least one column is required" ); - this.columns = columns; - return this; - } -} diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/NoticeDialog.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/NoticeDialog.java index 605d0702..920d72c1 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/NoticeDialog.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/NoticeDialog.java @@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.ToString; import lombok.experimental.Accessors; -import net.md_5.bungee.api.dialog.action.DialogClickAction; +import net.md_5.bungee.api.dialog.action.DialogAction; /** * Represents a simple dialog with text and one action at the bottom (default: @@ -26,7 +26,7 @@ public final class NoticeDialog implements Dialog /** * The "OK" action button for the dialog. */ - private DialogClickAction action; + private DialogAction action; public NoticeDialog(DialogBase base) { diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/ServerLinksDialog.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/ServerLinksDialog.java index 5becf793..393abc39 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/ServerLinksDialog.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/ServerLinksDialog.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.ToString; import lombok.experimental.Accessors; -import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.dialog.action.DialogAction; /** * Represents a dialog which shows the links configured/sent from the server. @@ -19,15 +19,19 @@ import net.md_5.bungee.api.chat.ClickEvent; public final class ServerLinksDialog implements Dialog { - @NonNull @Accessors(fluent = false) private DialogBase base; /** - * The optional {@link ClickEvent} for this dialog. + * The optional {@link DialogAction} for this dialog. */ - @SerializedName("on_click") - private ClickEvent onClick; + @SerializedName("action") + private DialogAction action; + /** + * The {@link DialogAction} activated when the dialog is exited. + */ + @SerializedName("exit_action") + private DialogAction exitAction; /** * The number of columns for the dialog buttons (default: 2). */ @@ -43,10 +47,10 @@ public final class ServerLinksDialog implements Dialog this( base, null, null, null ); } - public ServerLinksDialog(@NonNull DialogBase base, ClickEvent onClick, Integer columns, Integer buttonWidth) + public ServerLinksDialog(@NonNull DialogBase base, DialogAction action, Integer columns, Integer buttonWidth) { this.base = base; - this.onClick = onClick; + this.action = action; columns( columns ); buttonWidth( buttonWidth ); } diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/SimpleInputFormDialog.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/SimpleInputFormDialog.java deleted file mode 100644 index c9e6cc0a..00000000 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/SimpleInputFormDialog.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.md_5.bungee.api.dialog; - -import com.google.common.base.Preconditions; -import java.util.Arrays; -import java.util.List; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NonNull; -import lombok.ToString; -import lombok.experimental.Accessors; -import net.md_5.bungee.api.dialog.action.DialogSubmitAction; -import net.md_5.bungee.api.dialog.input.DialogInput; - -/** - * Represents a dialog which contains a variety of inputs and a single submit - * button at the bottom. - */ -@Data -@ToString -@EqualsAndHashCode -@Accessors(fluent = true) -public final class SimpleInputFormDialog implements Dialog -{ - - @NonNull - @Accessors(fluent = false) - private DialogBase base; - /** - * The inputs to the dialog. At least one input must be provided. - */ - @NonNull - private List inputs; - /** - * The action/submit buttons for the dialog. - */ - private DialogSubmitAction action; - - public SimpleInputFormDialog(@NonNull DialogBase base, @NonNull DialogInput... inputs) - { - this( base, null, inputs ); - } - - public SimpleInputFormDialog(@NonNull DialogBase base, DialogSubmitAction action, @NonNull DialogInput... inputs) - { - this( base, action, Arrays.asList( inputs ) ); - } - - public SimpleInputFormDialog(@NonNull DialogBase base, DialogSubmitAction action, @NonNull List inputs) - { - Preconditions.checkArgument( !inputs.isEmpty(), "At least one input must be provided" ); - - this.base = base; - this.inputs = inputs; - this.action = action; - } -} diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogAction.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogAction.java index 2c43835a..6310449f 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogAction.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogAction.java @@ -11,7 +11,7 @@ import net.md_5.bungee.api.chat.BaseComponent; */ @Data @Accessors(fluent = true) -public class DialogAction +public abstract class DialogAction { /** diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogClickAction.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogClickAction.java deleted file mode 100644 index 2e1a6156..00000000 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogClickAction.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.md_5.bungee.api.dialog.action; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NonNull; -import lombok.ToString; -import lombok.experimental.Accessors; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; - -/** - * Represents a button which may be clicked. - */ -@Data -@Accessors(fluent = true) -@ToString(callSuper = true) -@EqualsAndHashCode(callSuper = true) -public class DialogClickAction extends DialogAction -{ - - /** - * The optional action to take on click. - */ - @SerializedName("on_click") - private ClickEvent onClick; - - public DialogClickAction(@NonNull BaseComponent label) - { - this( null, label ); - } - - public DialogClickAction(ClickEvent onClick, @NonNull BaseComponent label) - { - this( onClick, label, null, null ); - } - - public DialogClickAction(ClickEvent onClick, @NonNull BaseComponent label, BaseComponent tooltip, Integer width) - { - super( label, tooltip, width ); - this.onClick = onClick; - } -} diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogSubmitAction.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogSubmitAction.java deleted file mode 100644 index c0d98b6e..00000000 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DialogSubmitAction.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.md_5.bungee.api.dialog.action; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NonNull; -import lombok.ToString; -import lombok.experimental.Accessors; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.dialog.submit.DialogSubmission; - -/** - * Represents a dialog button associated with the submission of a form dialog - * containing inputs. - */ -@Data -@Accessors(fluent = true) -@ToString(callSuper = true) -@EqualsAndHashCode(callSuper = true) -public class DialogSubmitAction extends DialogAction -{ - - /** - * The ID of the button, used to distinguish submissions initiated via - * different buttons on the dialog. - */ - @NonNull - private String id; - /** - * The submission action to take. - */ - @NonNull - @SerializedName("on_submit") - private DialogSubmission onSubmit; - - public DialogSubmitAction(@NonNull String id, @NonNull DialogSubmission onSubmit, @NonNull BaseComponent label) - { - this( id, onSubmit, label, null, null ); - } - - public DialogSubmitAction(@NonNull String id, @NonNull DialogSubmission onSubmit, @NonNull BaseComponent label, BaseComponent tooltip, Integer width) - { - super( label, tooltip, width ); - this.id = id; - this.onSubmit = onSubmit; - } -} diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DynamicAction.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DynamicAction.java new file mode 100644 index 00000000..b015671f --- /dev/null +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/DynamicAction.java @@ -0,0 +1,35 @@ +package net.md_5.bungee.api.dialog.action; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import lombok.ToString; +import lombok.experimental.Accessors; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.dialog.dynamic.DynamicType; + +/** + * Represents a static dialog action. + */ +@Data +@Accessors(fluent = true) +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class DynamicAction extends DialogAction +{ + + @NonNull + private DynamicType action; + + public DynamicAction(@NonNull BaseComponent label, BaseComponent tooltip, Integer width, @NonNull DynamicType action) + { + super( label, tooltip, width ); + this.action = action; + } + + public DynamicAction(@NonNull BaseComponent label, @NonNull DynamicType action) + { + super( label ); + this.action = action; + } +} diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/action/StaticAction.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/StaticAction.java new file mode 100644 index 00000000..fe5d61b9 --- /dev/null +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/action/StaticAction.java @@ -0,0 +1,44 @@ +package net.md_5.bungee.api.dialog.action; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import lombok.ToString; +import lombok.experimental.Accessors; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import org.jetbrains.annotations.ApiStatus; + +/** + * Represents a static dialog action. + */ +@Data +@Accessors(fluent = true) +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class StaticAction extends DialogAction +{ + + @NonNull + private ChatClickEventWrapper action; + + public StaticAction(@NonNull BaseComponent label, BaseComponent tooltip, Integer width, @NonNull ClickEvent action) + { + super( label, tooltip, width ); + this.action = new ChatClickEventWrapper( action ); + } + + public StaticAction(@NonNull BaseComponent label, @NonNull ClickEvent action) + { + super( label ); + this.action = new ChatClickEventWrapper( action ); + } + + @Data + @ApiStatus.Internal + public static final class ChatClickEventWrapper + { + + private final ClickEvent event; + } +} diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CustomFormSubmission.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/Custom.java similarity index 51% rename from dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CustomFormSubmission.java rename to dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/Custom.java index 8c29782f..46d1ae4c 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CustomFormSubmission.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/Custom.java @@ -1,5 +1,6 @@ -package net.md_5.bungee.api.dialog.submit; +package net.md_5.bungee.api.dialog.dynamic; +import com.google.gson.JsonElement; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; @@ -7,13 +8,13 @@ import lombok.ToString; import lombok.experimental.Accessors; /** - * Submits the form with the given ID and all values as a payload. + * Submits the dialog with the given ID and values as a payload. */ @Data @Accessors(fluent = true) @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) -public class CustomFormSubmission extends DialogSubmission +public class Custom extends DynamicType { /** @@ -21,10 +22,14 @@ public class CustomFormSubmission extends DialogSubmission */ @NonNull private String id; + /** + * Fields to be added to the submission payload. + */ + private JsonElement additions; - public CustomFormSubmission(@NonNull String id) + public Custom(@NonNull String id) { - super( "minecraft:custom_form" ); + super( "dynamic/custom" ); this.id = id; } } diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/DialogSubmission.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/DynamicType.java similarity index 83% rename from dialog/src/main/java/net/md_5/bungee/api/dialog/submit/DialogSubmission.java rename to dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/DynamicType.java index 89c8aae6..638279b3 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/DialogSubmission.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/DynamicType.java @@ -1,4 +1,4 @@ -package net.md_5.bungee.api.dialog.submit; +package net.md_5.bungee.api.dialog.dynamic; import lombok.Data; import lombok.NonNull; @@ -10,7 +10,7 @@ import org.jetbrains.annotations.ApiStatus; */ @Data @Accessors(fluent = true) -public class DialogSubmission +public class DynamicType { /** diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CommandTemplateSubmission.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/RunCommand.java similarity index 72% rename from dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CommandTemplateSubmission.java rename to dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/RunCommand.java index ea061a19..b5a9d6bc 100644 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CommandTemplateSubmission.java +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/RunCommand.java @@ -1,4 +1,4 @@ -package net.md_5.bungee.api.dialog.submit; +package net.md_5.bungee.api.dialog.dynamic; import lombok.Data; import lombok.EqualsAndHashCode; @@ -7,14 +7,14 @@ import lombok.ToString; import lombok.experimental.Accessors; /** - * Executes a command on form submission. If the command requires a permission + * Executes a command. If the command requires a permission * higher than 0, a confirmation dialog will be shown by the client. */ @Data @Accessors(fluent = true) @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) -public class CommandTemplateSubmission extends DialogSubmission +public class RunCommand extends DynamicType { /** @@ -28,9 +28,9 @@ public class CommandTemplateSubmission extends DialogSubmission @NonNull private String template; - public CommandTemplateSubmission(@NonNull String template) + public RunCommand(@NonNull String template) { - super( "minecraft:command_template" ); + super( "dynamic/run_command" ); this.template = template; } } diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/package-info.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/package-info.java new file mode 100644 index 00000000..2745b531 --- /dev/null +++ b/dialog/src/main/java/net/md_5/bungee/api/dialog/dynamic/package-info.java @@ -0,0 +1,4 @@ +/** + * Represents the various dynamic actions of dialogs. + */ +package net.md_5.bungee.api.dialog.dynamic; diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CustomTemplateSubmission.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CustomTemplateSubmission.java deleted file mode 100644 index 5c1cd122..00000000 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/CustomTemplateSubmission.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.md_5.bungee.api.dialog.submit; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NonNull; -import lombok.ToString; -import lombok.experimental.Accessors; - -/** - * Submits the form with the given ID and a single payload specified by the - * template. - */ -@Data -@Accessors(fluent = true) -@ToString(callSuper = true) -@EqualsAndHashCode(callSuper = true) -public class CustomTemplateSubmission extends DialogSubmission -{ - - /** - * The namespaced key of the submission. - */ - @NonNull - private String id; - /** - * The template to be applied, where variables of the form - * $(key) will be replaced by their - * {@link net.md_5.bungee.api.dialog.input.DialogInput#key} value. - *
- * The action key is special and will be replaced with the - * {@link net.md_5.bungee.api.dialog.action.DialogSubmitAction#id}. - */ - @NonNull - private String template; - - public CustomTemplateSubmission(@NonNull String id, @NonNull String template) - { - super( "minecraft:custom_template" ); - this.id = id; - this.template = template; - } -} diff --git a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/package-info.java b/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/package-info.java deleted file mode 100644 index 4ec5cb6d..00000000 --- a/dialog/src/main/java/net/md_5/bungee/api/dialog/submit/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Represents the various submissions actions of form dialogs. - */ -package net.md_5.bungee.api.dialog.submit; diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java b/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java index b1b532c9..99adad59 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java @@ -50,7 +50,7 @@ public class ProtocolConstants public static final int MINECRAFT_1_21_2 = 768; public static final int MINECRAFT_1_21_4 = 769; public static final int MINECRAFT_1_21_5 = 770; - public static final int MINECRAFT_1_21_6 = 1073742075; + public static final int MINECRAFT_1_21_6 = 1073742076; public static final List SUPPORTED_VERSIONS; public static final List SUPPORTED_VERSION_IDS; diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java index 9b2ff7cd..4ecc1e0f 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java @@ -9,6 +9,7 @@ import net.md_5.bungee.protocol.AbstractPacketHandler; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.Protocol; import net.md_5.bungee.protocol.ProtocolConstants; +import se.llbit.nbt.Tag; @Data @NoArgsConstructor @@ -18,20 +19,20 @@ public class CustomClickAction extends DefinedPacket { private String id; - private String data; + private Tag data; @Override public void read(ByteBuf buf, Protocol protocol, ProtocolConstants.Direction direction, int protocolVersion) { id = readString( buf ); - data = readNullable( DefinedPacket::readString, buf ); + data = readNullable( (buf0) -> readTag( buf0, protocolVersion ), buf ); } @Override public void write(ByteBuf buf, Protocol protocol, ProtocolConstants.Direction direction, int protocolVersion) { writeString( id, buf ); - writeNullable( data, DefinedPacket::writeString, buf ); + writeNullable( data, (data0, buf0) -> writeTag( data0, buf0, protocolVersion ), buf ); } @Override diff --git a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java index 86d9d4c0..2f540f0f 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java @@ -1,7 +1,6 @@ package net.md_5.bungee.connection; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; import com.mojang.brigadier.context.StringRange; import com.mojang.brigadier.suggestion.Suggestion; import com.mojang.brigadier.suggestion.Suggestions; @@ -9,7 +8,6 @@ import io.netty.channel.Channel; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.UUID; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.ServerConnection; @@ -31,6 +29,7 @@ import net.md_5.bungee.netty.PacketHandler; import net.md_5.bungee.protocol.PacketWrapper; import net.md_5.bungee.protocol.Protocol; import net.md_5.bungee.protocol.ProtocolConstants; +import net.md_5.bungee.protocol.TagUtil; import net.md_5.bungee.protocol.packet.Chat; import net.md_5.bungee.protocol.packet.ClientChat; import net.md_5.bungee.protocol.packet.ClientCommand; @@ -48,6 +47,7 @@ import net.md_5.bungee.protocol.packet.TabCompleteRequest; import net.md_5.bungee.protocol.packet.TabCompleteResponse; import net.md_5.bungee.protocol.packet.UnsignedClientCommand; import net.md_5.bungee.util.AllowedCharacters; +import se.llbit.nbt.SpecificTag; public class UpstreamBridge extends PacketHandler { @@ -385,29 +385,7 @@ public class UpstreamBridge extends PacketHandler @Override public void handle(CustomClickAction customClickAction) throws Exception { - Map data = null; - if ( customClickAction.getData() != null ) - { - ImmutableMap.Builder parsed = ImmutableMap.builder(); - - String[] lines = customClickAction.getData().split( "\n" ); - for ( String line : lines ) - { - String[] split = line.split( "\t", 2 ); - if ( split.length > 1 ) - { - parsed.put( split[0], split[1] ); - } - } - data = parsed.buildOrThrow(); - - if ( data.isEmpty() ) - { - data = null; - } - } - - CustomClickEvent event = new CustomClickEvent( con, customClickAction.getId(), customClickAction.getData(), data ); + CustomClickEvent event = new CustomClickEvent( con, customClickAction.getId(), TagUtil.toJson( (SpecificTag) customClickAction.getData() ) ); if ( bungee.getPluginManager().callEvent( event ).isCancelled() ) { throw CancelSendSignal.INSTANCE; diff --git a/serializer/src/main/java/net/md_5/bungee/chat/BaseComponentSerializer.java b/serializer/src/main/java/net/md_5/bungee/chat/BaseComponentSerializer.java index 48e6a16c..67fcca25 100644 --- a/serializer/src/main/java/net/md_5/bungee/chat/BaseComponentSerializer.java +++ b/serializer/src/main/java/net/md_5/bungee/chat/BaseComponentSerializer.java @@ -12,12 +12,9 @@ import java.util.IdentityHashMap; import java.util.Locale; import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.ClickEventCustom; import net.md_5.bungee.api.chat.ComponentStyle; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.dialog.chat.ShowDialogClickEvent; @RequiredArgsConstructor public class BaseComponentSerializer @@ -44,36 +41,12 @@ public class BaseComponentSerializer } if ( clickEvent != null ) { - ClickEvent.Action action = ClickEvent.Action.valueOf( clickEvent.get( "action" ).getAsString().toUpperCase( Locale.ROOT ) ); if ( newClickEvent ) { - switch ( action ) - { - case OPEN_URL: - component.setClickEvent( new ClickEvent( action, clickEvent.get( "url" ).getAsString() ) ); - break; - case RUN_COMMAND: - case SUGGEST_COMMAND: - component.setClickEvent( new ClickEvent( action, clickEvent.get( "command" ).getAsString() ) ); - break; - case CHANGE_PAGE: - int page = clickEvent.get( "page" ).getAsInt(); - Preconditions.checkArgument( page >= 0, "Page number has to be positive" ); - component.setClickEvent( new ClickEvent( action, Integer.toString( page ) ) ); - break; - case SHOW_DIALOG: - component.setClickEvent( context.deserialize( clickEvent.get( "dialog" ), ShowDialogClickEvent.class ) ); - break; - case CUSTOM: - component.setClickEvent( new ClickEventCustom( clickEvent.get( "id" ).getAsString(), ( clickEvent.has( "payload" ) ) ? clickEvent.get( "payload" ).getAsString() : null ) ); - break; - default: - component.setClickEvent( new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" ) ); - break; - } + component.setClickEvent( ClickEventSerializer.NEW.deserialize( clickEvent, context ) ); } else { - component.setClickEvent( new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" ) ); + component.setClickEvent( ClickEventSerializer.OLD.deserialize( clickEvent, context ) ); } } @@ -171,50 +144,17 @@ public class BaseComponentSerializer //Events if ( component.getClickEvent() != null ) { - JsonObject clickEvent = new JsonObject(); - String actionName = component.getClickEvent().getAction().toString().toLowerCase( Locale.ROOT ); - clickEvent.addProperty( "action", actionName.toLowerCase( Locale.ROOT ) ); switch ( serializer.getVersion() ) { case V1_21_5: - ClickEvent.Action action = ClickEvent.Action.valueOf( actionName.toUpperCase( Locale.ROOT ) ); - switch ( action ) - { - case OPEN_URL: - clickEvent.addProperty( "url", component.getClickEvent().getValue() ); - break; - case RUN_COMMAND: - case SUGGEST_COMMAND: - clickEvent.addProperty( "command", component.getClickEvent().getValue() ); - break; - case CHANGE_PAGE: - clickEvent.addProperty( "page", Integer.parseInt( component.getClickEvent().getValue() ) ); - break; - case SHOW_DIALOG: - clickEvent.add( "dialog", context.serialize( component.getClickEvent() ) ); - break; - case CUSTOM: - ClickEventCustom custom = (ClickEventCustom) component.getClickEvent(); - clickEvent.addProperty( "id", custom.getValue() ); - if ( custom.getPayload() != null ) - { - clickEvent.addProperty( "payload", custom.getPayload() ); - } - break; - default: - clickEvent.addProperty( "value", component.getClickEvent().getValue() ); - break; - } - object.add( "click_event", clickEvent ); + object.add( "click_event", ClickEventSerializer.NEW.serialize( component.getClickEvent(), context ) ); break; case V1_16: - clickEvent.addProperty( "value", component.getClickEvent().getValue() ); - object.add( "clickEvent", clickEvent ); + object.add( "clickEvent", ClickEventSerializer.OLD.serialize( component.getClickEvent(), context ) ); break; default: throw new IllegalArgumentException( "Unknown version " + serializer.getVersion() ); } - } if ( component.getHoverEvent() != null ) { diff --git a/serializer/src/main/java/net/md_5/bungee/chat/ClickEventSerializer.java b/serializer/src/main/java/net/md_5/bungee/chat/ClickEventSerializer.java new file mode 100644 index 00000000..d60deadf --- /dev/null +++ b/serializer/src/main/java/net/md_5/bungee/chat/ClickEventSerializer.java @@ -0,0 +1,108 @@ +package net.md_5.bungee.chat; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import java.util.Locale; +import lombok.Data; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ClickEventCustom; +import net.md_5.bungee.api.dialog.chat.ShowDialogClickEvent; + +@Data +public class ClickEventSerializer +{ + + public static final ClickEventSerializer OLD = new ClickEventSerializer( ClickType.OLD ); + public static final ClickEventSerializer NEW = new ClickEventSerializer( ClickType.NEW ); + public static final ClickEventSerializer DIALOG = new ClickEventSerializer( ClickType.DIALOG ); + // + public enum ClickType + { + OLD, NEW, DIALOG; + } + private final ClickType type; + + public ClickEvent deserialize(JsonObject clickEvent, JsonDeserializationContext context) throws JsonParseException + { + ClickEvent.Action action = ClickEvent.Action.valueOf( clickEvent.get( ( type == ClickType.DIALOG ) ? "type" : "action" ).getAsString().toUpperCase( Locale.ROOT ) ); + switch ( type ) + { + case NEW: + case DIALOG: + switch ( action ) + { + case OPEN_URL: + return new ClickEvent( action, clickEvent.get( "url" ).getAsString() ); + case RUN_COMMAND: + case SUGGEST_COMMAND: + return new ClickEvent( action, clickEvent.get( "command" ).getAsString() ); + case CHANGE_PAGE: + int page = clickEvent.get( "page" ).getAsInt(); + Preconditions.checkArgument( page >= 0, "Page number has to be positive" ); + return new ClickEvent( action, Integer.toString( page ) ); + case SHOW_DIALOG: + return context.deserialize( clickEvent.get( "dialog" ), ShowDialogClickEvent.class ); + case CUSTOM: + return new ClickEventCustom( clickEvent.get( "id" ).getAsString(), ( clickEvent.has( "payload" ) ) ? clickEvent.get( "payload" ).getAsString() : null ); + default: + return new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" ); + } + case OLD: + return new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" ); + default: + throw new IllegalArgumentException( "Unknown serializer type" ); + } + } + + public JsonElement serialize(ClickEvent src, JsonSerializationContext context) + { + JsonObject clickEvent = new JsonObject(); + String actionName = src.getAction().toString().toLowerCase( Locale.ROOT ); + clickEvent.addProperty( ( type == ClickType.DIALOG ) ? "type" : "action", actionName.toLowerCase( Locale.ROOT ) ); + switch ( type ) + { + case NEW: + case DIALOG: + ClickEvent.Action action = ClickEvent.Action.valueOf( actionName.toUpperCase( Locale.ROOT ) ); + switch ( action ) + { + case OPEN_URL: + clickEvent.addProperty( "url", src.getValue() ); + break; + case RUN_COMMAND: + case SUGGEST_COMMAND: + clickEvent.addProperty( "command", src.getValue() ); + break; + case CHANGE_PAGE: + clickEvent.addProperty( "page", Integer.parseInt( src.getValue() ) ); + break; + case SHOW_DIALOG: + clickEvent.add( "dialog", context.serialize( src ) ); + break; + case CUSTOM: + ClickEventCustom custom = (ClickEventCustom) src; + clickEvent.addProperty( "id", custom.getValue() ); + if ( custom.getPayload() != null ) + { + clickEvent.addProperty( "payload", custom.getPayload() ); + } + break; + default: + clickEvent.addProperty( "value", src.getValue() ); + break; + } + break; + case OLD: + clickEvent.addProperty( "value", src.getValue() ); + break; + default: + throw new IllegalArgumentException( "Unknown serializer type" ); + } + + return clickEvent; + } +} diff --git a/serializer/src/main/java/net/md_5/bungee/chat/VersionedComponentSerializer.java b/serializer/src/main/java/net/md_5/bungee/chat/VersionedComponentSerializer.java index 8abf5d25..2bcde060 100644 --- a/serializer/src/main/java/net/md_5/bungee/chat/VersionedComponentSerializer.java +++ b/serializer/src/main/java/net/md_5/bungee/chat/VersionedComponentSerializer.java @@ -30,6 +30,7 @@ import net.md_5.bungee.api.chat.hover.content.Text; import net.md_5.bungee.api.chat.hover.content.TextSerializer; import net.md_5.bungee.api.dialog.Dialog; import net.md_5.bungee.api.dialog.chat.ShowDialogClickEvent; +import net.md_5.bungee.dialog.ChatClickEventWrapperSerializer; import net.md_5.bungee.dialog.DialogSerializer; import net.md_5.bungee.dialog.ShowDialogClickEventSerializer; import org.jetbrains.annotations.ApiStatus; @@ -67,6 +68,7 @@ public class VersionedComponentSerializer implements JsonDeserializer, JsonSerializer +{ + + @Override + public StaticAction.ChatClickEventWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException + { + return new StaticAction.ChatClickEventWrapper( ClickEventSerializer.DIALOG.deserialize( json.getAsJsonObject(), context ) ); + } + + @Override + public JsonElement serialize(StaticAction.ChatClickEventWrapper src, Type typeOfSrc, JsonSerializationContext context) + { + return ClickEventSerializer.DIALOG.serialize( src.event(), context ); + } +} diff --git a/serializer/src/main/java/net/md_5/bungee/dialog/DialogSerializer.java b/serializer/src/main/java/net/md_5/bungee/dialog/DialogSerializer.java index d33adb71..11a557c5 100644 --- a/serializer/src/main/java/net/md_5/bungee/dialog/DialogSerializer.java +++ b/serializer/src/main/java/net/md_5/bungee/dialog/DialogSerializer.java @@ -22,16 +22,14 @@ import net.md_5.bungee.api.dialog.Dialog; import net.md_5.bungee.api.dialog.DialogBase; import net.md_5.bungee.api.dialog.DialogListDialog; import net.md_5.bungee.api.dialog.MultiActionDialog; -import net.md_5.bungee.api.dialog.MultiActionInputFormDialog; import net.md_5.bungee.api.dialog.NoticeDialog; import net.md_5.bungee.api.dialog.ServerLinksDialog; -import net.md_5.bungee.api.dialog.SimpleInputFormDialog; import net.md_5.bungee.chat.VersionedComponentSerializer; @RequiredArgsConstructor public class DialogSerializer implements JsonDeserializer, JsonSerializer { - private static final ThreadLocal> serializedDialogs = new ThreadLocal>(); + private static final ThreadLocal> serializedDialogs = new ThreadLocal<>(); private static final BiMap> TYPES; private final VersionedComponentSerializer serializer; @@ -44,8 +42,6 @@ public class DialogSerializer implements JsonDeserializer, JsonSerialize builder.put( "minecraft:multi_action", MultiActionDialog.class ); builder.put( "minecraft:server_links", ServerLinksDialog.class ); builder.put( "minecraft:dialog_list", DialogListDialog.class ); - builder.put( "minecraft:simple_input_form", SimpleInputFormDialog.class ); - builder.put( "minecraft:multi_action_input_form", MultiActionInputFormDialog.class ); TYPES = builder.build(); } @@ -108,7 +104,7 @@ public class DialogSerializer implements JsonDeserializer, JsonSerialize boolean first = serializedDialogs.get() == null; if ( first ) { - serializedDialogs.set( Collections.newSetFromMap( new IdentityHashMap() ) ); + serializedDialogs.set( Collections.newSetFromMap( new IdentityHashMap<>() ) ); } try