diff --git a/src/main/java/net/dv8tion/jda/api/EmbedBuilder.java b/src/main/java/net/dv8tion/jda/api/EmbedBuilder.java index 8416e4b82c..50aabe5ce5 100644 --- a/src/main/java/net/dv8tion/jda/api/EmbedBuilder.java +++ b/src/main/java/net/dv8tion/jda/api/EmbedBuilder.java @@ -57,7 +57,7 @@ public class EmbedBuilder /** * Constructs a new EmbedBuilder instance, which can be used to create {@link net.dv8tion.jda.api.entities.MessageEmbed MessageEmbeds}. - * These can then be sent to a channel using {@link net.dv8tion.jda.api.entities.MessageChannel#sendMessage(MessageEmbed)}. + * These can then be sent to a channel using {@link net.dv8tion.jda.api.entities.MessageChannel#sendMessageEmbeds(MessageEmbed, MessageEmbed...)}. *
Every part of an embed can be removed or cleared by providing {@code null} to the setter method. */ public EmbedBuilder() { } @@ -443,7 +443,7 @@ public EmbedBuilder setColor(int color) * InputStream file = new URL("https://http.cat/500").openStream(); * embed.setThumbnail("attachment://cat.png") // we specify this in sendFile as "cat.png" * .setDescription("This is a cute cat :3"); - * channel.sendFile(file, "cat.png").embed(embed.build()).queue(); + * channel.sendFile(file, "cat.png").setEmbeds(embed.build()).queue(); * * * @param url @@ -489,7 +489,7 @@ public EmbedBuilder setThumbnail(@Nullable String url) * InputStream file = new URL("https://http.cat/500").openStream(); * embed.setImage("attachment://cat.png") // we specify this in sendFile as "cat.png" * .setDescription("This is a cute cat :3"); - * channel.sendFile(file, "cat.png").embed(embed.build()).queue(); + * channel.sendFile(file, "cat.png").setEmbeds(embed.build()).queue(); * * * @param url @@ -586,7 +586,7 @@ public EmbedBuilder setAuthor(@Nullable String name, @Nullable String url) * InputStream file = new URL("https://http.cat/500").openStream(); * embed.setAuthor("Minn", null, "attachment://cat.png") // we specify this in sendFile as "cat.png" * .setDescription("This is a cute cat :3"); - * channel.sendFile(file, "cat.png").embed(embed.build()).queue(); + * channel.sendFile(file, "cat.png").setEmbeds(embed.build()).queue(); * * * @param name @@ -662,7 +662,7 @@ public EmbedBuilder setFooter(@Nullable String text) * InputStream file = new URL("https://http.cat/500").openStream(); * embed.setFooter("Cool footer!", "attachment://cat.png") // we specify this in sendFile as "cat.png" * .setDescription("This is a cute cat :3"); - * channel.sendFile(file, "cat.png").embed(embed.build()).queue(); + * channel.sendFile(file, "cat.png").setEmbeds(embed.build()).queue(); * * * @param text diff --git a/src/main/java/net/dv8tion/jda/api/MessageBuilder.java b/src/main/java/net/dv8tion/jda/api/MessageBuilder.java index c9692aa42f..3b58739d03 100644 --- a/src/main/java/net/dv8tion/jda/api/MessageBuilder.java +++ b/src/main/java/net/dv8tion/jda/api/MessageBuilder.java @@ -45,9 +45,9 @@ public class MessageBuilder implements Appendable { protected final StringBuilder builder = new StringBuilder(); + protected final List embeds = new ArrayList<>(); protected boolean isTTS = false; protected String nonce; - protected MessageEmbed embed; protected List components = new ArrayList<>(); protected EnumSet allowedMentions = null; protected Set mentionedUsers = new HashSet<>(); @@ -68,8 +68,8 @@ public MessageBuilder(@Nullable Message message) isTTS = message.isTTS(); builder.append(message.getContentRaw()); List embeds = message.getEmbeds(); - if (embeds != null && !embeds.isEmpty() && embeds.get(0).getType() == EmbedType.RICH) - embed = embeds.get(0); + if (embeds != null) + embeds.stream().filter(it -> it.getType() == EmbedType.RICH).forEach(this.embeds::add); components.addAll(message.getActionRows()); if (message instanceof DataMessage) { @@ -89,7 +89,7 @@ public MessageBuilder(@Nullable MessageBuilder builder) this.isTTS = builder.isTTS; this.builder.append(builder.builder); this.nonce = builder.nonce; - this.embed = builder.embed; + this.embeds.addAll(builder.embeds); this.components.addAll(builder.components); if (builder.allowedMentions != null) this.allowedMentions = Helpers.copyEnumSet(Message.MentionType.class, builder.allowedMentions); @@ -101,12 +101,12 @@ public MessageBuilder(@Nullable MessageBuilder builder) public MessageBuilder(@Nullable EmbedBuilder builder) { if (builder != null) - this.embed = builder.build(); + this.embeds.add(builder.build()); } public MessageBuilder(@Nullable MessageEmbed embed) { - this.embed = embed; + this.embeds.add(embed); } /** @@ -125,7 +125,7 @@ public MessageBuilder setTTS(boolean tts) this.isTTS = tts; return this; } - + /** * Adds a {@link net.dv8tion.jda.api.entities.MessageEmbed} to the Message. Embeds can be built using * the {@link net.dv8tion.jda.api.EmbedBuilder} and offer specialized formatting. @@ -134,11 +134,66 @@ public MessageBuilder setTTS(boolean tts) * the embed to add, or null to remove * * @return The MessageBuilder instance. Useful for chaining. + * + * @deprecated Use {@link #setEmbeds(MessageEmbed...)} instead */ @Nonnull + @Deprecated + @ForRemoval(deadline = "5.0.0") + @ReplaceWith("setEmbeds(embed)") + @DeprecatedSince("4.4.0") public MessageBuilder setEmbed(@Nullable MessageEmbed embed) { - this.embed = embed; + return setEmbeds(embed); + } + + /** + * Adds up to 10 {@link net.dv8tion.jda.api.entities.MessageEmbed MessageEmbeds} to the Message. Embeds can be built using + * the {@link net.dv8tion.jda.api.EmbedBuilder} and offer specialized formatting. + * + * @param embeds + * the embeds to add, or empty array to remove + * + * @throws java.lang.IllegalArgumentException + * If any of the provided MessageEmbeds is null or not sendable according to {@link net.dv8tion.jda.api.entities.MessageEmbed#isSendable() MessageEmbed.isSendable()}! + * The sum of all {@link MessageEmbed#getLength()} must not be greater than {@link MessageEmbed#EMBED_MAX_LENGTH_BOT}! + * + * @return The MessageBuilder instance. Useful for chaining. + */ + @Nonnull + public MessageBuilder setEmbeds(@Nonnull MessageEmbed... embeds) + { + Checks.noneNull(embeds, "MessageEmbeds"); + return setEmbeds(Arrays.asList(embeds)); + } + + /** + * Adds up to 10 {@link net.dv8tion.jda.api.entities.MessageEmbed MessageEmbeds} to the Message. Embeds can be built using + * the {@link net.dv8tion.jda.api.EmbedBuilder} and offer specialized formatting. + * + * @param embeds + * the embeds to add, or empty list to remove + * + * @throws java.lang.IllegalArgumentException + * If any of the provided MessageEmbeds is null or not sendable according to {@link net.dv8tion.jda.api.entities.MessageEmbed#isSendable() MessageEmbed.isSendable()}! + * The sum of all {@link MessageEmbed#getLength()} must not be greater than {@link MessageEmbed#EMBED_MAX_LENGTH_BOT}! + * + * @return The MessageBuilder instance. Useful for chaining. + */ + @Nonnull + public MessageBuilder setEmbeds(@Nonnull Collection embeds) + { + + Checks.noneNull(embeds, "MessageEmbeds"); + embeds.forEach(embed -> + Checks.check(embed.isSendable(), + "Provided Message contains an empty embed or an embed with a length greater than %d characters, which is the max for bot accounts!", + MessageEmbed.EMBED_MAX_LENGTH_BOT) + ); + Checks.check(embeds.size() <= 10, "Cannot have more than 10 embeds in a message!"); + Checks.check(embeds.stream().mapToInt(MessageEmbed::getLength).sum() <= MessageEmbed.EMBED_MAX_LENGTH_BOT, "The sum of all MessageEmbeds may not exceed %d!", MessageEmbed.EMBED_MAX_LENGTH_BOT); + this.embeds.clear(); + this.embeds.addAll(embeds); return this; } @@ -456,7 +511,7 @@ public int length() * @return whether the message contains content */ public boolean isEmpty() { - return builder.length() == 0 && embed == null; + return builder.length() == 0 && embeds.isEmpty(); } /** @@ -1019,7 +1074,7 @@ public StringBuilder getStringBuilder() @Nonnull public MessageBuilder clear() { this.builder.setLength(0); - this.embed = null; + this.embeds.clear(); this.isTTS = false; return this; } @@ -1191,7 +1246,7 @@ public Message build() throw new IllegalStateException("Cannot build a Message with more than 2000 characters. Please limit your input."); String[] ids = new String[0]; - return new DataMessage(isTTS, message, nonce, embed, + return new DataMessage(isTTS, message, nonce, embeds, allowedMentions, mentionedUsers.toArray(ids), mentionedRoles.toArray(ids), components.toArray(new ComponentLayout[0])); } @@ -1252,9 +1307,9 @@ public Queue buildAll(@Nullable SplitPolicy... policy) messages.add(build(currentBeginIndex, builder.length() - 1)); } - if (this.embed != null) + if (this.embeds != null) { - ((DataMessage) messages.get(messages.size() - 1)).setEmbed(embed); + ((DataMessage) messages.get(messages.size() - 1)).setEmbeds(embeds); } return messages; diff --git a/src/main/java/net/dv8tion/jda/api/entities/Message.java b/src/main/java/net/dv8tion/jda/api/entities/Message.java index ad7c54ca4f..bec743fb14 100644 --- a/src/main/java/net/dv8tion/jda/api/entities/Message.java +++ b/src/main/java/net/dv8tion/jda/api/entities/Message.java @@ -15,6 +15,9 @@ */ package net.dv8tion.jda.api.entities; +import net.dv8tion.jda.annotations.DeprecatedSince; +import net.dv8tion.jda.annotations.ForRemoval; +import net.dv8tion.jda.annotations.ReplaceWith; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.exceptions.HttpException; @@ -1002,10 +1005,97 @@ default List