diff --git a/src/main/java/net/dv8tion/jda/api/components/Component.java b/src/main/java/net/dv8tion/jda/api/components/Component.java index ab0f8baaa7..a800266290 100644 --- a/src/main/java/net/dv8tion/jda/api/components/Component.java +++ b/src/main/java/net/dv8tion/jda/api/components/Component.java @@ -122,15 +122,15 @@ enum Type /** A text input field */ TEXT_INPUT(4, false, true), /** A select menu of users */ - USER_SELECT(5, true, false), + USER_SELECT(5, true, true), /** A select menu of roles */ - ROLE_SELECT(6, true, false), + ROLE_SELECT(6, true, true), /** A select menu of users and roles */ - MENTIONABLE_SELECT(7, true, false), + MENTIONABLE_SELECT(7, true, true), /** A select menu of channels */ - CHANNEL_SELECT(8, true, false), + CHANNEL_SELECT(8, true, true), SECTION(9, true, false), - TEXT_DISPLAY(10, true, false), + TEXT_DISPLAY(10, true, true), THUMBNAIL(11, true, false), MEDIA_GALLERY(12, true, false), FILE_DISPLAY(13, true, false), @@ -197,6 +197,16 @@ public boolean isModalCompatible() return modalCompatible; } + /** + * Whether this component is an {@link net.dv8tion.jda.api.components.selections.EntitySelectMenu EntitySelectMenu} + * + * @return {@code true} is this is a type of {@link net.dv8tion.jda.api.components.selections.EntitySelectMenu EntitySelectMenu} + */ + public boolean isEntitySelectMenu() + { + return this == MENTIONABLE_SELECT || this == CHANNEL_SELECT || this == USER_SELECT || this == ROLE_SELECT; + } + /** * Maps the provided type id to the respective enum instance. * diff --git a/src/main/java/net/dv8tion/jda/api/components/ModalTopLevelComponent.java b/src/main/java/net/dv8tion/jda/api/components/ModalTopLevelComponent.java index ee00ee1b74..e84984ec06 100644 --- a/src/main/java/net/dv8tion/jda/api/components/ModalTopLevelComponent.java +++ b/src/main/java/net/dv8tion/jda/api/components/ModalTopLevelComponent.java @@ -22,6 +22,7 @@ * Represents a component that can be added directly to a modal, this includes: *
Note: This is effectively equivalent to using the cast operator: + *
+ * //These are the same!
+ * TextDisplay textDisplay = union.asTextDisplay();
+ * TextDisplay textDisplay2 = (TextDisplay) union;
+ *
+ *
+ * You can use {@link #getType()} to see if the component is of type {@link net.dv8tion.jda.api.components.Component.Type#TEXT_DISPLAY TEXT_DISPLAY} to validate
+ * whether you can call this method in addition to normal instanceof checks: component instanceof TextDisplay
+ *
+ * @throws IllegalStateException
+ * If the component represented by this union is not actually a {@link TextDisplay}.
+ *
+ * @return The component as a {@link TextDisplay}
+ */
+ @Nonnull
+ TextDisplay asTextDisplay();
+
@Nonnull
@Override
ModalTopLevelComponentUnion withUniqueId(int uniqueId);
diff --git a/src/main/java/net/dv8tion/jda/api/components/label/LabelChildComponent.java b/src/main/java/net/dv8tion/jda/api/components/label/LabelChildComponent.java
index 6d174d6fe1..208b7cdd70 100644
--- a/src/main/java/net/dv8tion/jda/api/components/label/LabelChildComponent.java
+++ b/src/main/java/net/dv8tion/jda/api/components/label/LabelChildComponent.java
@@ -25,6 +25,7 @@
* Note: This is effectively equivalent to using the cast operator: + *
+ * //These are the same!
+ * EntitySelectMenu menu = union.asEntitySelectMenu();
+ * EntitySelectMenu menu2 = (EntitySelectMenu) union;
+ *
+ *
+ * You can use {@link #getType()} to see if the component is one of:
+ * component instanceof EntitySelectMenu
+ *
+ * @throws IllegalStateException
+ * If the component represented by this union is not actually a {@link EntitySelectMenu}.
+ *
+ * @return The component as a {@link EntitySelectMenu}
+ */
+ @Nonnull
+ EntitySelectMenu asEntitySelectMenu();
+
@Nonnull
@Override
LabelChildComponentUnion withUniqueId(int uniqueId);
diff --git a/src/main/java/net/dv8tion/jda/api/components/selections/EntitySelectMenu.java b/src/main/java/net/dv8tion/jda/api/components/selections/EntitySelectMenu.java
index ab9aafdc3c..647481391c 100644
--- a/src/main/java/net/dv8tion/jda/api/components/selections/EntitySelectMenu.java
+++ b/src/main/java/net/dv8tion/jda/api/components/selections/EntitySelectMenu.java
@@ -655,7 +655,7 @@ public EntitySelectMenu build()
Checks.check(minValues <= maxValues, "Min values cannot be greater than max values!");
EnumSetThis only has an effect in Modals!
+ *
+ * @param required
+ * Whether this menu is required
+ *
+ * @return The same builder instance for chaining
+ */
+ @Nonnull
+ public B setRequired(@Nullable Boolean required)
+ {
+ this.required = required;
+ return (B) this;
+ }
+
/**
* The custom id used to identify the select menu.
*
@@ -390,6 +418,17 @@ public boolean isDisabled()
return disabled;
}
+ /**
+ * Whether the user must populate this select menu in Modals, or {@code null} if not set.
+ *
+ * @return Whether this menu must be populated, or null
+ */
+ @Nullable
+ public Boolean isRequired()
+ {
+ return required;
+ }
+
/**
* Creates a new {@link SelectMenu} instance if all requirements are satisfied.
*
diff --git a/src/main/java/net/dv8tion/jda/api/components/selections/StringSelectMenu.java b/src/main/java/net/dv8tion/jda/api/components/selections/StringSelectMenu.java
index 3c8deb7805..acfdb9c15e 100644
--- a/src/main/java/net/dv8tion/jda/api/components/selections/StringSelectMenu.java
+++ b/src/main/java/net/dv8tion/jda/api/components/selections/StringSelectMenu.java
@@ -18,7 +18,6 @@
import net.dv8tion.jda.api.components.ActionComponent;
import net.dv8tion.jda.api.components.actionrow.ActionRow;
-import net.dv8tion.jda.api.components.label.LabelChildComponent;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.interactions.components.selections.SelectMenuInteraction;
import net.dv8tion.jda.api.interactions.components.selections.StringSelectInteraction;
@@ -63,7 +62,7 @@
* @see StringSelectInteraction
* @see EntitySelectMenu
*/
-public interface StringSelectMenu extends SelectMenu, LabelChildComponent
+public interface StringSelectMenu extends SelectMenu
{
@Nonnull
@Override
@@ -100,14 +99,6 @@ default StringSelectMenu withDisabled(boolean disabled)
@Nonnull
List This only has an effect in Modals!
- *
- * @param required
- * Whether this menu is required
- *
- * @return The same builder instance for chaining
- */
- @Nonnull
- public Builder setRequired(@Nullable Boolean required)
- {
- this.required = required;
- return this;
- }
-
/**
* Creates a new {@link StringSelectMenu} instance if all requirements are satisfied.
* Requirements: {@linkplain MessageRequest#useComponentsV2() Components V2} needs to be enabled!
*/
-public interface TextDisplay extends Component, MessageTopLevelComponent, ContainerChildComponent, SectionContentComponent
+public interface TextDisplay
+ extends Component, MessageTopLevelComponent, ModalTopLevelComponent,
+ ContainerChildComponent, SectionContentComponent
{
/**
* Constructs a new {@link TextDisplay} from the given content.
diff --git a/src/main/java/net/dv8tion/jda/api/interactions/modals/ModalMapping.java b/src/main/java/net/dv8tion/jda/api/interactions/modals/ModalMapping.java
index d92f395a9c..a3793d7543 100644
--- a/src/main/java/net/dv8tion/jda/api/interactions/modals/ModalMapping.java
+++ b/src/main/java/net/dv8tion/jda/api/interactions/modals/ModalMapping.java
@@ -19,9 +19,12 @@
import net.dv8tion.jda.annotations.ForRemoval;
import net.dv8tion.jda.annotations.ReplaceWith;
import net.dv8tion.jda.api.components.Component;
+import net.dv8tion.jda.api.entities.Mentions;
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
import net.dv8tion.jda.api.utils.data.DataArray;
import net.dv8tion.jda.api.utils.data.DataObject;
+import net.dv8tion.jda.internal.entities.SelectMenuMentions;
+import net.dv8tion.jda.internal.interactions.InteractionImpl;
import net.dv8tion.jda.internal.utils.EntityString;
import net.dv8tion.jda.internal.utils.Helpers;
@@ -37,16 +40,20 @@
*/
public class ModalMapping
{
+ private final InteractionImpl interaction;
private final String customId;
private final int uniqueId;
+ private final DataObject resolved;
private final DataObject value;
private final Component.Type type;
- public ModalMapping(DataObject object)
+ public ModalMapping(InteractionImpl interaction, DataObject resolved, DataObject object)
{
+ this.interaction = interaction;
this.uniqueId = object.getInt("id");
this.customId = object.getString("custom_id");
this.type = Component.Type.fromKey(object.getInt("type"));
+ this.resolved = resolved;
this.value = object;
}
@@ -123,8 +130,18 @@ public String getAsString()
/**
* The String list representation of this component.
*
- * For {@link net.dv8tion.jda.api.components.selections.StringSelectMenu StringSelectMenus}, this returns
- * the values chosen by the User.
+ * Return values include:
+ *
*
* Use {@link #getType()} to check if this method can be used safely!
*
@@ -136,7 +153,7 @@ public String getAsString()
@Nonnull
public List This is available if the component was an {@link net.dv8tion.jda.api.components.selections.EntitySelectMenu EntitySelectMenu}.
+ *
+ * You can use {@link #getType()} and {@link Component.Type#isEntitySelectMenu()} to check if this method can be used safely.
+ *
+ * @throws IllegalStateException
+ * If this ModalMapping cannot be represented as such
+ *
+ * @return This component's value as a list of Longs.
+ */
+ @Nonnull
+ public List This is available if the component was an {@link net.dv8tion.jda.api.components.selections.EntitySelectMenu EntitySelectMenu}.
+ *
+ * You can use {@link #getType()} and {@link Component.Type#isEntitySelectMenu()} to check if this method can be used safely.
+ *
+ * @throws IllegalStateException
+ * If this ModalMapping cannot be represented as such
+ *
+ * @return This component's value as a {@link Mentions} object.
+ */
+ @Nonnull
+ public Mentions getAsMentions()
+ {
+ if (!type.isEntitySelectMenu())
+ typeError("Mentions");
+
+ return new SelectMenuMentions(interaction.getJDA(), interaction.getInteractionEntityBuilder(), interaction.getGuild(), resolved, value.getArray("values"));
+ }
+
@Override
public String toString()
{
diff --git a/src/main/java/net/dv8tion/jda/internal/components/selections/EntitySelectMenuImpl.java b/src/main/java/net/dv8tion/jda/internal/components/selections/EntitySelectMenuImpl.java
index a6bd5d94be..4663f8b5b0 100644
--- a/src/main/java/net/dv8tion/jda/internal/components/selections/EntitySelectMenuImpl.java
+++ b/src/main/java/net/dv8tion/jda/internal/components/selections/EntitySelectMenuImpl.java
@@ -17,6 +17,7 @@
package net.dv8tion.jda.internal.components.selections;
import net.dv8tion.jda.api.components.Component;
+import net.dv8tion.jda.api.components.label.LabelChildComponentUnion;
import net.dv8tion.jda.api.components.selections.EntitySelectMenu;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.utils.data.DataArray;
@@ -30,7 +31,7 @@
import java.util.Objects;
import java.util.stream.Collectors;
-public class EntitySelectMenuImpl extends SelectMenuImpl implements EntitySelectMenu
+public class EntitySelectMenuImpl extends SelectMenuImpl implements EntitySelectMenu, LabelChildComponentUnion
{
protected final Component.Type type;
protected final EnumSet
This can be useful to create an updated version of this menu without needing to rebuild it from scratch.
@@ -153,7 +144,6 @@ static Builder create(@Nonnull String customId)
class Builder extends SelectMenu.Builder
This defaults to {@code true} in Modals when unset.
- *
- *
A select menu may not have more than {@value #OPTIONS_MAX_AMOUNT} options at once.
diff --git a/src/main/java/net/dv8tion/jda/api/components/textdisplay/TextDisplay.java b/src/main/java/net/dv8tion/jda/api/components/textdisplay/TextDisplay.java
index 79db4a319a..cd7520b3bf 100644
--- a/src/main/java/net/dv8tion/jda/api/components/textdisplay/TextDisplay.java
+++ b/src/main/java/net/dv8tion/jda/api/components/textdisplay/TextDisplay.java
@@ -18,6 +18,7 @@
import net.dv8tion.jda.api.components.Component;
import net.dv8tion.jda.api.components.MessageTopLevelComponent;
+import net.dv8tion.jda.api.components.ModalTopLevelComponent;
import net.dv8tion.jda.api.components.container.ContainerChildComponent;
import net.dv8tion.jda.api.components.section.SectionContentComponent;
import net.dv8tion.jda.api.entities.Message;
@@ -37,7 +38,9 @@
*
*
+ *
+ *