Java Discord API - A comprehensive Java library for building Discord bots and applications
—
Complete message handling including creation, editing, reactions, embeds, attachments, and rich message components for Discord communication.
Core message representation with content, metadata, and interaction capabilities.
/**
* Represents a Message received from Discord.
* This contains all content and metadata of a Discord message.
*/
interface Message extends ISnowflake {
/** Get raw message content */
String getContentRaw();
/** Get formatted content for display */
String getContentDisplay();
/** Get content with all formatting stripped */
String getContentStripped();
/** Get message type */
MessageType getType();
/** Get message author */
User getAuthor();
/** Get author as guild member (null if not in guild) */
Member getMember();
/** Get channel where message was sent */
MessageChannel getChannel();
/** Get guild where message was sent (null if DM) */
Guild getGuild();
/** Get when message was sent */
OffsetDateTime getTimeCreated();
/** Get when message was last edited (null if never edited) */
OffsetDateTime getTimeEdited();
/** Check if message was edited */
boolean isEdited();
/** Check if message is pinned */
boolean isPinned();
/** Check if message is ephemeral (interaction response only) */
boolean isEphemeral();
/** Check if message is from webhook */
boolean isWebhookMessage();
/** Check if message is TTS */
boolean isTTS();
/** Check if message suppresses embeds */
boolean isSuppressedEmbeds();
/** Get message embeds */
List<MessageEmbed> getEmbeds();
/** Get message attachments */
List<Message.Attachment> getAttachments();
/** Get message components (buttons, select menus) */
List<ActionRow> getActionRows();
/** Get message reactions */
List<MessageReaction> getReactions();
/** Get message stickers */
List<StickerItem> getStickers();
/** Get message flags */
EnumSet<MessageFlag> getFlags();
/** Get referenced message (reply reference) */
Message getReferencedMessage();
MessageReference getMessageReference();
/** Get message activity (game invites, etc.) */
MessageActivity getActivity();
/** Get mentioned users */
List<User> getMentions();
List<User> getMentionedUsers();
/** Get mentioned channels */
List<TextChannel> getMentionedChannels();
/** Get mentioned roles */
List<Role> getMentionedRoles();
/** Get mentioned members */
List<Member> getMentionedMembers();
/** Check if mentions everyone */
boolean mentionsEveryone();
/** Check if user/role/channel is mentioned */
boolean isMentioned(IMentionable mentionable);
boolean isMentioned(IMentionable mentionable, Message.MentionType... types);
/** Delete message */
RestAction<Void> delete();
/** Edit message content */
MessageEditAction editMessage(CharSequence newContent);
MessageEditAction editMessage(MessageEmbed newEmbed);
MessageEditAction editMessage(MessageEditData data);
/** Edit message embeds */
MessageEditAction editMessageEmbeds(MessageEmbed... embeds);
MessageEditAction editMessageEmbeds(Collection<? extends MessageEmbed> embeds);
/** Edit message components */
MessageEditAction editMessageComponents(ActionRow... components);
MessageEditAction editMessageComponents(Collection<? extends ActionRow> components);
/** Edit message attachments */
MessageEditAction editMessageAttachments(AttachedFile... attachments);
MessageEditAction editMessageAttachments(Collection<? extends AttachedFile> attachments);
/** Pin message */
RestAction<Void> pin();
/** Unpin message */
RestAction<Void> unpin();
/** Add reaction */
RestAction<Void> addReaction(Emoji emoji);
/** Remove reaction */
RestAction<Void> removeReaction(Emoji emoji);
RestAction<Void> removeReaction(Emoji emoji, User user);
/** Clear all reactions */
RestAction<Void> clearReactions();
/** Clear reactions for specific emoji */
RestAction<Void> clearReactions(Emoji emoji);
/** Retrieve users who reacted with emoji */
ReactionPaginationAction retrieveReactionUsers(Emoji emoji);
/** Crosspost message (announcement channels) */
RestAction<Message> crosspost();
/** Suppress embeds */
RestAction<Message> suppressEmbeds(boolean suppressed);
/** Create thread from message */
ThreadChannelAction createThreadChannel(String name);
/** Reply to message */
MessageCreateAction reply(CharSequence text);
MessageCreateAction reply(MessageEmbed embed);
MessageCreateAction reply(MessageCreateData message);
/** Reply with embeds */
MessageCreateAction replyEmbeds(MessageEmbed... embeds);
MessageCreateAction replyEmbeds(Collection<? extends MessageEmbed> embeds);
/** Reply with files */
MessageCreateAction replyFiles(FileUpload... files);
MessageCreateAction replyFiles(Collection<? extends FileUpload> files);
}Fluent interface for creating and sending new messages with all supported content types.
/**
* Extension of RestAction for creating messages with additional message-specific methods.
*/
interface MessageCreateAction extends RestAction<Message> {
/** Set message content */
MessageCreateAction setContent(String content);
/** Set message embeds */
MessageCreateAction setEmbeds(MessageEmbed... embeds);
MessageCreateAction setEmbeds(Collection<? extends MessageEmbed> embeds);
/** Add message embed */
MessageCreateAction addEmbeds(MessageEmbed... embeds);
MessageCreateAction addEmbeds(Collection<? extends MessageEmbed> embeds);
/** Set message components */
MessageCreateAction setComponents(ActionRow... components);
MessageCreateAction setComponents(Collection<? extends ActionRow> components);
/** Add message components */
MessageCreateAction addComponents(ActionRow... components);
MessageCreateAction addComponents(Collection<? extends ActionRow> components);
/** Set file attachments */
MessageCreateAction setFiles(FileUpload... files);
MessageCreateAction setFiles(Collection<? extends FileUpload> files);
/** Add file attachments */
MessageCreateAction addFiles(FileUpload... files);
MessageCreateAction addFiles(Collection<? extends FileUpload> files);
/** Set TTS (Text-to-Speech) */
MessageCreateAction setTTS(boolean tts);
/** Set whether to suppress embeds */
MessageCreateAction setSuppressEmbeds(boolean suppress);
/** Set allowed mentions */
MessageCreateAction setAllowedMentions(Collection<Message.MentionType> allowedMentions);
/** Mention users */
MessageCreateAction mentionUsers(long... userIds);
MessageCreateAction mentionUsers(String... userIds);
MessageCreateAction mentionUsers(User... users);
/** Mention roles */
MessageCreateAction mentionRoles(long... roleIds);
MessageCreateAction mentionRoles(String... roleIds);
MessageCreateAction mentionRoles(Role... roles);
/** Set message reference (reply) */
MessageCreateAction setMessageReference(Message message);
MessageCreateAction setMessageReference(long messageId);
MessageCreateAction setMessageReference(String messageId);
}Usage Examples:
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.utils.FileUpload;
// Basic text message
channel.sendMessage("Hello, World!").queue();
// Message with embed
EmbedBuilder embed = new EmbedBuilder()
.setTitle("Welcome!")
.setDescription("Thanks for joining our server")
.setColor(Color.BLUE);
channel.sendMessage("").setEmbeds(embed.build()).queue();
// Message with file
FileUpload file = FileUpload.fromData(imageBytes, "image.png");
channel.sendMessage("Check out this image!").setFiles(file).queue();
// Message with components
Button button = Button.primary("help", "Get Help");
channel.sendMessage("Need assistance?")
.setComponents(ActionRow.of(button))
.queue();
// Reply to message
originalMessage.reply("I'm replying to you!").queue();
// Complex message with everything
channel.sendMessage("Complex message")
.setEmbeds(embed.build())
.setFiles(file)
.setComponents(ActionRow.of(button))
.setTTS(false)
.mentionUsers(user.getId())
.queue(
success -> System.out.println("Message sent!"),
error -> System.err.println("Failed to send: " + error.getMessage())
);Interface for modifying existing messages including content, embeds, and components.
/**
* Extension of RestAction for editing messages.
*/
interface MessageEditAction extends RestAction<Message> {
/** Set new message content */
MessageEditAction setContent(String content);
/** Set new message embeds */
MessageEditAction setEmbeds(MessageEmbed... embeds);
MessageEditAction setEmbeds(Collection<? extends MessageEmbed> embeds);
/** Set new message components */
MessageEditAction setComponents(ActionRow... components);
MessageEditAction setComponents(Collection<? extends ActionRow> components);
/** Set new file attachments */
MessageEditAction setAttachments(AttachedFile... attachments);
MessageEditAction setAttachments(Collection<? extends AttachedFile> attachments);
/** Replace existing files */
MessageEditAction setFiles(FileUpload... files);
MessageEditAction setFiles(Collection<? extends FileUpload> files);
/** Set allowed mentions */
MessageEditAction setAllowedMentions(Collection<Message.MentionType> allowedMentions);
/** Mention users */
MessageEditAction mentionUsers(long... userIds);
MessageEditAction mentionUsers(String... userIds);
MessageEditAction mentionUsers(User... users);
/** Mention roles */
MessageEditAction mentionRoles(long... roleIds);
MessageEditAction mentionRoles(String... roleIds);
MessageEditAction mentionRoles(Role... roles);
/** Set whether to suppress embeds */
MessageEditAction setSuppressEmbeds(boolean suppress);
}Rich embedded content with titles, descriptions, fields, images, and more.
/**
* Builder for creating MessageEmbed objects.
*/
class EmbedBuilder {
/** Set embed title */
EmbedBuilder setTitle(String title);
EmbedBuilder setTitle(String title, String url);
/** Set embed description */
EmbedBuilder setDescription(CharSequence description);
/** Append to description */
EmbedBuilder appendDescription(CharSequence description);
/** Set embed timestamp */
EmbedBuilder setTimestamp(TemporalAccessor temporal);
/** Set embed color */
EmbedBuilder setColor(Color color);
EmbedBuilder setColor(int color);
/** Set thumbnail image */
EmbedBuilder setThumbnail(String url);
/** Set main image */
EmbedBuilder setImage(String url);
/** Set author information */
EmbedBuilder setAuthor(String name);
EmbedBuilder setAuthor(String name, String url);
EmbedBuilder setAuthor(String name, String url, String iconUrl);
/** Set footer information */
EmbedBuilder setFooter(String text);
EmbedBuilder setFooter(String text, String iconUrl);
/** Add field */
EmbedBuilder addField(String name, String value, boolean inline);
EmbedBuilder addField(MessageEmbed.Field field);
/** Add blank field */
EmbedBuilder addBlankField(boolean inline);
/** Clear all fields */
EmbedBuilder clearFields();
/** Get current field count */
int getFields();
/** Check if embed is empty */
boolean isEmpty();
/** Get total character count */
int length();
/** Build the embed */
MessageEmbed build();
}
/**
* Represents an embedded rich content object.
*/
interface MessageEmbed {
/** Get embed URL */
String getUrl();
/** Get embed title */
String getTitle();
/** Get embed description */
String getDescription();
/** Get embed type */
EmbedType getType();
/** Get embed timestamp */
OffsetDateTime getTimestamp();
/** Get embed color */
Color getColor();
int getColorRaw();
/** Get thumbnail */
MessageEmbed.Thumbnail getThumbnail();
/** Get site provider */
MessageEmbed.Provider getSiteProvider();
/** Get author info */
MessageEmbed.AuthorInfo getAuthor();
/** Get video info */
MessageEmbed.VideoInfo getVideoInfo();
/** Get footer */
MessageEmbed.Footer getFooter();
/** Get image info */
MessageEmbed.ImageInfo getImage();
/** Get fields */
List<MessageEmbed.Field> getFields();
/** Check if embed is empty */
boolean isEmpty();
/** Get total character count */
int getLength();
}Usage Examples:
import net.dv8tion.jda.api.EmbedBuilder;
import java.awt.Color;
import java.time.Instant;
// Simple embed
EmbedBuilder embed = new EmbedBuilder()
.setTitle("Server Statistics")
.setDescription("Current server information")
.addField("Members", "1,250", true)
.addField("Online", "420", true)
.addField("Channels", "45", true)
.setColor(Color.GREEN)
.setTimestamp(Instant.now())
.setFooter("Last updated");
channel.sendMessageEmbeds(embed.build()).queue();
// Complex embed with all features
EmbedBuilder complexEmbed = new EmbedBuilder()
.setTitle("User Profile", "https://example.com/profile")
.setAuthor("UserBot", null, "https://example.com/avatar.png")
.setDescription("Detailed user information and statistics")
.addField("Level", "42", true)
.addField("XP", "15,678", true)
.addField("Rank", "#127", true)
.addBlankField(false)
.addField("Recent Activity", "Last seen 2 hours ago", false)
.setThumbnail("https://example.com/user-avatar.png")
.setImage("https://example.com/user-banner.png")
.setColor(0x7289DA)
.setTimestamp(Instant.now())
.setFooter("Profile System", "https://example.com/bot-icon.png");
channel.sendMessageEmbeds(complexEmbed.build()).queue();Interactive message components including buttons, select menus, and action rows.
/**
* Represents a row of interactive components in a message.
*/
class ActionRow {
/** Create action row with components */
static ActionRow of(ItemComponent... components);
static ActionRow of(Collection<? extends ItemComponent> components);
/** Get components in this row */
List<ItemComponent> getComponents();
/** Check if row is empty */
boolean isEmpty();
}
/**
* Utility class for creating buttons.
*/
class Button {
/** Create primary button */
static Button primary(String id, String label);
static Button primary(String id, Emoji emoji);
static Button primary(String id, String label, Emoji emoji);
/** Create secondary button */
static Button secondary(String id, String label);
static Button secondary(String id, Emoji emoji);
static Button secondary(String id, String label, Emoji emoji);
/** Create success button */
static Button success(String id, String label);
static Button success(String id, Emoji emoji);
static Button success(String id, String label, Emoji emoji);
/** Create danger button */
static Button danger(String id, String label);
static Button danger(String id, Emoji emoji);
static Button danger(String id, String label, Emoji emoji);
/** Create link button */
static Button link(String url, String label);
static Button link(String url, Emoji emoji);
static Button link(String url, String label, Emoji emoji);
/** Get button ID */
String getId();
/** Get button label */
String getLabel();
/** Get button style */
ButtonStyle getStyle();
/** Get button emoji */
Emoji getEmoji();
/** Get button URL (link buttons only) */
String getUrl();
/** Check if button is disabled */
boolean isDisabled();
/** Create disabled version */
Button asDisabled();
/** Create enabled version */
Button asEnabled();
/** Modify button properties */
Button withId(String id);
Button withLabel(String label);
Button withEmoji(Emoji emoji);
Button withStyle(ButtonStyle style);
Button withUrl(String url);
Button withDisabled(boolean disabled);
}
/**
* Utility class for creating select menus.
*/
class SelectMenu {
/** Create string select menu */
static StringSelectMenu.Builder create(String customId);
/** Create entity select menu */
static EntitySelectMenu.Builder create(String customId, EntitySelectMenu.SelectTarget target);
}Usage Examples:
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu;
// Message with buttons
Button helpButton = Button.primary("help", "Get Help");
Button aboutButton = Button.secondary("about", "About");
Button websiteButton = Button.link("https://example.com", "Visit Website");
channel.sendMessage("Choose an option:")
.setComponents(ActionRow.of(helpButton, aboutButton, websiteButton))
.queue();
// Message with select menu
StringSelectMenu menu = StringSelectMenu.create("game-select")
.setPlaceholder("Choose a game")
.addOption("Minecraft", "minecraft", "Block building game")
.addOption("Fortnite", "fortnite", "Battle royale game")
.addOption("Among Us", "amongus", "Social deduction game")
.setMinValues(1)
.setMaxValues(1)
.build();
channel.sendMessage("What's your favorite game?")
.setComponents(ActionRow.of(menu))
.queue();
// Disabled button example
Button disabledButton = Button.danger("delete", "Delete").asDisabled();
channel.sendMessage("This action is currently unavailable")
.setComponents(ActionRow.of(disabledButton))
.queue();File upload and attachment handling for messages.
/**
* Utility class for creating file uploads.
*/
class FileUpload {
/** Create from byte array */
static FileUpload fromData(byte[] data, String name);
/** Create from InputStream */
static FileUpload fromInputStream(InputStream data, String name);
/** Create from File */
static FileUpload fromFile(File file);
static FileUpload fromFile(File file, String name);
/** Create from Path */
static FileUpload fromPath(Path path);
static FileUpload fromPath(Path path, String name);
/** Get file name */
String getName();
/** Get file description */
String getDescription();
/** Set file description */
FileUpload setDescription(String description);
/** Check if file is spoiler */
boolean isSpoiler();
/** Set spoiler status */
FileUpload setSpoiler(boolean spoiler);
/** Close and release resources */
void close();
}
/**
* Represents a file attachment in a message.
*/
interface Message.Attachment {
/** Get attachment ID */
long getIdLong();
String getId();
/** Get file name */
String getFileName();
/** Get file description */
String getDescription();
/** Get content type */
String getContentType();
/** Get file size in bytes */
int getSize();
/** Get attachment URL */
String getUrl();
/** Get proxy URL */
String getProxyUrl();
/** Check if attachment is image */
boolean isImage();
/** Check if attachment is video */
boolean isVideo();
/** Check if attachment is spoiler */
boolean isSpoiler();
/** Get image dimensions (if image) */
int getWidth();
int getHeight();
/** Download attachment */
RestAction<InputStream> getProxy();
CompletableFuture<InputStream> downloadAsInputStream();
CompletableFuture<byte[]> downloadAsByteArray();
CompletableFuture<File> downloadToFile(File file);
CompletableFuture<Path> downloadToPath(Path path);
}// Message types
enum MessageType {
DEFAULT, RECIPIENT_ADD, RECIPIENT_REMOVE, CALL, CHANNEL_NAME_CHANGE,
CHANNEL_ICON_CHANGE, CHANNEL_PINNED_MESSAGE, GUILD_MEMBER_JOIN,
USER_PREMIUM_GUILD_SUBSCRIPTION, USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_1,
USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_2, USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_3,
CHANNEL_FOLLOW_ADD, GUILD_DISCOVERY_DISQUALIFIED, GUILD_DISCOVERY_REQUALIFIED,
GUILD_DISCOVERY_GRACE_PERIOD_INITIAL_WARNING, GUILD_DISCOVERY_GRACE_PERIOD_FINAL_WARNING,
THREAD_CREATED, REPLY, CHAT_INPUT_COMMAND, THREAD_STARTER_MESSAGE,
GUILD_INVITE_REMINDER, CONTEXT_MENU_COMMAND, AUTO_MODERATION_ACTION,
ROLE_SUBSCRIPTION_PURCHASE, INTERACTION_PREMIUM_UPSELL, STAGE_START, STAGE_END,
STAGE_SPEAKER, STAGE_RAISE_HAND, STAGE_TOPIC, GUILD_APPLICATION_PREMIUM_SUBSCRIPTION
}
// Message flags
enum MessageFlag {
CROSSPOSTED, IS_CROSSPOST, SUPPRESS_EMBEDS, SOURCE_MESSAGE_DELETED,
URGENT, HAS_THREAD, EPHEMERAL, LOADING, FAILED_TO_MENTION_SOME_ROLES_IN_THREAD,
SUPPRESS_NOTIFICATIONS, IS_VOICE_MESSAGE
}
// Mention types
enum MentionType {
USER, ROLE, CHANNEL, EVERYONE, HERE, SLASH_COMMAND
}
// Button styles
enum ButtonStyle {
PRIMARY, SECONDARY, SUCCESS, DANGER, LINK
}
// Embed types
enum EmbedType {
RICH, IMAGE, VIDEO, GIFV, ARTICLE, LINK, AUTO_MODERATION_MESSAGE
}Install with Tessl CLI
npx tessl i tessl/maven-net-dv8tion--jda