diff --git a/src/main/java/net/dv8tion/jda/api/interactions/components/ActionRow.java b/src/main/java/net/dv8tion/jda/api/interactions/components/ActionRow.java
index efc958deb5..3ca53aa8fc 100644
--- a/src/main/java/net/dv8tion/jda/api/interactions/components/ActionRow.java
+++ b/src/main/java/net/dv8tion/jda/api/interactions/components/ActionRow.java
@@ -269,6 +269,13 @@ public ActionRow asEnabled()
return withDisabled(false);
}
+ @Nonnull
+ @Override
+ public ActionRow createCopy()
+ {
+ return ActionRow.of(components);
+ }
+
@Nonnull
@Override
public Component.Type getType()
diff --git a/src/main/java/net/dv8tion/jda/api/interactions/components/LayoutComponent.java b/src/main/java/net/dv8tion/jda/api/interactions/components/LayoutComponent.java
index a08ad51435..69fd15f0e9 100644
--- a/src/main/java/net/dv8tion/jda/api/interactions/components/LayoutComponent.java
+++ b/src/main/java/net/dv8tion/jda/api/interactions/components/LayoutComponent.java
@@ -190,6 +190,15 @@ default boolean isValid()
return true;
}
+ /**
+ * Creates a copy of this {@link LayoutComponent}.
+ *
This does not create copies of the contained components.
+ *
+ * @return A copy of this {@link LayoutComponent}
+ */
+ @Nonnull
+ LayoutComponent createCopy();
+
/**
* Find and replace a component in this layout.
*
This will locate and replace the existing component with the specified ID. If you provide null it will be removed instead.
diff --git a/src/main/java/net/dv8tion/jda/api/utils/FileUpload.java b/src/main/java/net/dv8tion/jda/api/utils/FileUpload.java
index db027de307..e5ee426d30 100644
--- a/src/main/java/net/dv8tion/jda/api/utils/FileUpload.java
+++ b/src/main/java/net/dv8tion/jda/api/utils/FileUpload.java
@@ -301,6 +301,17 @@ public String getName()
return name;
}
+ /**
+ * The description for the file.
+ *
+ * @return The description
+ */
+ @Nullable
+ public String getDescription()
+ {
+ return description;
+ }
+
/**
* The {@link InputStream} representing the data to upload as a file.
*
diff --git a/src/main/java/net/dv8tion/jda/api/utils/messages/MessageCreateRequest.java b/src/main/java/net/dv8tion/jda/api/utils/messages/MessageCreateRequest.java
index 79a4a03bf3..18d49fc0d7 100644
--- a/src/main/java/net/dv8tion/jda/api/utils/messages/MessageCreateRequest.java
+++ b/src/main/java/net/dv8tion/jda/api/utils/messages/MessageCreateRequest.java
@@ -325,6 +325,10 @@ default R addFiles(@Nonnull FileUpload... files)
default R applyData(@Nonnull MessageCreateData data)
{
Checks.notNull(data, "MessageCreateData");
+
+ final List layoutComponents = data.getComponents().stream()
+ .map(LayoutComponent::createCopy)
+ .collect(Collectors.toList());
return setContent(data.getContent())
.setAllowedMentions(data.getAllowedMentions())
.mentionUsers(data.getMentionedUsers())
@@ -332,7 +336,7 @@ default R applyData(@Nonnull MessageCreateData data)
.mentionRepliedUser(data.isMentionRepliedUser())
.setEmbeds(data.getEmbeds())
.setTTS(data.isTTS())
- .setComponents(data.getComponents())
+ .setComponents(layoutComponents)
.setFiles(data.getFiles());
}
@@ -377,7 +381,12 @@ default R applyEditData(@Nonnull MessageEditData data)
if (data.isSet(MessageEditBuilder.EMBEDS))
setEmbeds(data.getEmbeds());
if (data.isSet(MessageEditBuilder.COMPONENTS))
- setComponents(data.getComponents());
+ {
+ final List layoutComponents = data.getComponents().stream()
+ .map(LayoutComponent::createCopy)
+ .collect(Collectors.toList());
+ setComponents(layoutComponents);
+ }
if (data.isSet(MessageEditBuilder.ATTACHMENTS))
setFiles(data.getFiles());
if (data.isSet(MessageEditBuilder.MENTIONS))
diff --git a/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditBuilder.java b/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditBuilder.java
index d12536be80..e7418c724f 100644
--- a/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditBuilder.java
+++ b/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditBuilder.java
@@ -32,6 +32,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.stream.Collectors;
/**
* Builder specialized for building a {@link MessageEditData}.
@@ -247,7 +248,12 @@ public MessageEditBuilder applyData(@Nonnull MessageEditData data)
if (data.isSet(EMBEDS))
this.setEmbeds(data.getEmbeds());
if (data.isSet(COMPONENTS))
- this.setComponents(data.getComponents());
+ {
+ final List layoutComponents = data.getComponents().stream()
+ .map(LayoutComponent::createCopy)
+ .collect(Collectors.toList());
+ this.setComponents(layoutComponents);
+ }
if (data.isSet(ATTACHMENTS))
this.setAttachments(data.getAttachments());
if (data.isSet(MENTIONS))
diff --git a/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditRequest.java b/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditRequest.java
index 640876e2a2..6a7368a859 100644
--- a/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditRequest.java
+++ b/src/main/java/net/dv8tion/jda/api/utils/messages/MessageEditRequest.java
@@ -17,6 +17,7 @@
package net.dv8tion.jda.api.utils.messages;
import net.dv8tion.jda.api.entities.Message;
+import net.dv8tion.jda.api.interactions.components.LayoutComponent;
import net.dv8tion.jda.api.requests.RestAction;
import net.dv8tion.jda.api.utils.AttachedFile;
import net.dv8tion.jda.api.utils.FileUpload;
@@ -29,6 +30,8 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
/**
* Specialized abstraction of setters for editing existing messages throughout the API.
@@ -205,6 +208,9 @@ default R setFiles(@Nullable Collection extends FileUpload> files)
@Nonnull
default R applyCreateData(@Nonnull MessageCreateData data)
{
+ final List layoutComponents = data.getComponents().stream()
+ .map(LayoutComponent::createCopy)
+ .collect(Collectors.toList());
return setReplace(true)
.setContent(data.getContent())
.setAllowedMentions(data.getAllowedMentions())
@@ -212,7 +218,7 @@ default R applyCreateData(@Nonnull MessageCreateData data)
.mentionRoles(data.getMentionedRoles())
.mentionRepliedUser(data.isMentionRepliedUser())
.setEmbeds(data.getEmbeds())
- .setComponents(data.getComponents())
+ .setComponents(layoutComponents)
.setFiles(data.getFiles());
}