Skip to content

Releases: discord-jda/JDA

v5.0.0-alpha.19 | Channel Package, OrderAction, and Ban Precision

13 Sep 16:24
cb23a72
Compare
Choose a tag to compare

Overview

With this release, we are changing a few packages, so you will have to update your imports. There are also a few more breaking changes, some of which are only relevant at runtime!

Seconds precision on bans (#2229)

Discord now supports deleting messages with seconds precision. Allowing you to delete messages which are less than a day old. To update your code, simply add a TimeUnit.DAYS.

Old:

guild.ban(member, 7, reason).queue();

New:

guild.ban(member, 7, TimeUnit.DAYS).reason(reason).queue();

Role Ordering (#2136)

The default ordering of guild.modifyRolePositions() has been reversed to align with the order of guild.getRoles() (descending position). We also added moveBelow and moveAbove to allow moving relative to a pivot element.

guild.modifyRolePositions()
  .selectPosition(guild.getRoleByBot(guild.getSelfMember())) // select bot role
  .moveAbove(modRole) // move it above the mod role
  .queue();

You can also now set the parent category of a channel using this feature:

guild.modifyTextChannelPositions()
  .selectPosition(channel)
  .setCategory(category)
  .moveBelow(otherChannel)
  .queue();

Channel Packages (#2180)

The new channel package layout is introduced to help reduce clutter of the entities package. You can find the updated package at net.dv8tion.jda.api.entities.channel. I've written a shell script to help rename packages in your sources:

Usage

To update packages of all .java source files in the src directory, you can use find and apply the script on each file:

find src -iname "*.java" -exec ./rename.sh {} \; -print

New Features

Changes

Bug Fixes

Full Changelog: v5.0.0-alpha.18...v5.0.0-alpha.19

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.19")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.19</version> 
</dependency>

v5.0.0-alpha.18 | Message Rework

21 Aug 19:57
3889412
Compare
Choose a tag to compare

Overview

With this release, we are getting very close to the beta release. The big and long awaited message rework introduces a high consistency between all message create and edit endpoints, which means you no longer have to decide between setActionRow and addActionRow depending on the specific flavor of endpoint you are using!

Message Rework (#2187)

The message rework introduces a consistent interface for message requests. We are splitting message edit requests and message create requests into 2 interfaces with different functionality. The new type hierarchy can be seen in this figure:

image

This results in a few breaking changes.

Renames

  • setActionRows/addActionRows -> setComponents/addComponents
  • MessageAction -> MessageCreateAction
  • MessageAction#tts -> MessageCreateAction#setTTS
  • allowedMentions(...) -> setAllowedMentions(...)
  • addFile -> setFiles/addFiles/setAttachments
  • sendFile/replyFile -> sendFiles/replyFiles
  • override(true) -> setReplace(true)

Code Migration

You will likely only have to adjust code if you used MessageBuilder. In this rework, we split this into MessageCreateBuilder and MessageEditBuilder, which produce either MessageCreateData or MessageEditData. And you will have to provide these data instances instead of Message instances from now on.

The old approach of having a MessageBuilder which returns a Message instance was flawed, in that it would offer a lot of methods which are unusable. Instead, we now separate this by making data classes for each request. Now the types are consistently representing a specific feature set:

Type Meaning
Message Existing messages on discord with an ID
MessageCreateData The data used for a message creation request (HTTP POST)
MessageEditData The data used for a message edit request (HTTP PATCH)

This allows for a higher level of consistency and clarity. The edit builder by default will only update the fields which are explicitly set. For example, doing new MessageEditBuilder().setContent("hello").build() will only update the content and leave any embeds or files untouched.

More details are provided in #2187. You can also ask questions in the release discussion.

Gateway Resume URL Handling (#2203)

In an upcoming change to the gateway logic (which is used to receive events), Discord is introducing a new gateway resume url. This new resume URL will be used to move your bot connection to a new zone, allowing for less reconnects and potentially lower ping.

Bots on older version of JDA may run into more reconnects due to the missing handling of this new resume url. Anyone using some kind of proxy gateway, should make sure to also handle this accordingly.

New Features

Changes

Bug Fixes

Full Changelog: v5.0.0-alpha.17...v5.0.0-alpha.18

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.18")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.18</version> 
</dependency>

v5.0.0-alpha.17 | Hotfix for some file sending issues

22 Jul 15:47
13194f3
Compare
Choose a tag to compare

Fixes some issues regarding the handling of file attachments on messages.

  • Fix to properly clean up resources in MessageAction, which would otherwise cause unwanted warnings
  • Fix issue with interaction replies that make use of files
  • Fix issue with retainFiles on interaction message edits

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.17")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.17</version> 
</dependency>

v5.0.0-alpha.16 | Hotfix editMessage on components

18 Jul 14:01
66ec4dc
Compare
Choose a tag to compare

This fixes an issue where IMessageEditCallback#editMessage would not properly send the request to edit the message, and instead defer the edit.

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.16")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.16</version> 
</dependency>

v5.0.0-alpha.15 | Hotfix for cast exception in ChannelUpdateHandler

17 Jul 19:02
ac3a9a6
Compare
Choose a tag to compare

This fixes the ClassCastException when a voice channel updated.

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.15")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.15</version> 
</dependency>

v5.0.0-alpha.14 | Text in Voice and Upgrade to API v10

17 Jul 15:13
bc8c2c7
Compare
Choose a tag to compare

Overview

Breaking changes and text messages in voice channels!

Text in Voice (#2072)

This release introduces the long awaited Text in Voice feature. Now you can use all your message related features in voice channels as well! Automatically works with interactions, messages, reactions, and all other features you could want!

Command Localization (#2090)

Using command localization, you can provide customized translations for all your commands. Check the example: LocalizationExample

API v10 (#2165)

Since the v9 API will be discontinued at the end of 2022, we have upgraded to the newer version 10. This comes with a few breaking changes:

  • All edit requests with addFile calls (such as message.editMessage(...).addFile(...)), will now remove all current attachments on the message. To retain existing attachments, you are now required to also use retainFiles(...) with the existing attachments on the message.
  • The introduction of GatewayIntent.MESSAGE_CONTENT. In order to use certain user-generated content in messages, you will now be required to explicitly enable this privileged intent. This includes:
    • getContentRaw, getContentDisplay, getContentStripped, and getMentions().getCustomEmojis()
    • getActionRows, and getButtons
    • getAttachments
    • getEmbeds

You will be presented with a warning, if you try using any of those methods without having the required intent enabled.

Attempting to access message content without GatewayIntent.MESSAGE_CONTENT.
Discord now requires to explicitly enable access to this using the MESSAGE_CONTENT intent.
Useful resources to learn more:
	- https://support-dev.discord.com/hc/en-us/articles/4404772028055-Message-Content-Privileged-Intent-FAQ
	- https://jda.wiki/using-jda/gateway-intents-and-member-cache-policy/
	- https://jda.wiki/using-jda/troubleshooting/#im-getting-closecode4014-disallowed-intents
Or suppress this warning if this is intentional with Message.suppressContentIntentWarning()

Channel Unions (#2138)

We had a lot of repeated concrete type specializations, such as getTextChannel(), all over library. To address this duplication and to make the interface more consitent, we are introducing the concept of channel unions.

These channel unions, are abstracted types, which provide the same features as their respective name would suggest, while also allowing simple specialization using conversion methods.

An example union would be MessageChannelUnion, which is used by Message.getChannel(). This type provides all the methods a normal MessageChannel would, but also allows you to convert it to a more concrete type:

public void onMessageReceived(MessageReceivedEvent event) {
  MessageChannelUnion channel = event.getChannel();
  // Use normal message channel features
  channel.sendMessage("Hello, I received your message!").queue();
  // Specialized handling on concrete types
  if (channel.getType() == ChannelType.VOICE) {
    VoiceChannel vc = channel.asVoiceChannel(); // easy type conversion, just like casting, but with clear type information
    vc.getGuild().getAudioManager().openAudioConnection(vc);
  }
}

New Features

Changes

Bug Fixes

Full Changelog: v5.0.0-alpha.13...v5.0.0-alpha.14

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.14")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.14</version> 
</dependency>

v5.0.0-alpha.13

28 Jun 15:28
244199d
Compare
Choose a tag to compare

Overview

In this release, we have taken some time to rework the handling of Emoji and Stickers! This comes with a lot of breaking changes.

Guild Emote Renamed (#2117)

Previously, all custom emoji were called Emote in JDA. This has been changed to be more consistent with the API naming convention of Custom Emoji. In that sense, we renamed Emote to RichCustomEmoji and made various changes all over the API to rename all occurrences of Emote with Emoji.

This also comes with some compatibility improvements! With this change, we now have a uniform representation of all emoji in the library. Every emoji now implements the Emoji interface and can be used interchangeably as such. For instance, the reactions used to have a specific type called ReactionEmote, which is now just replaced with Emoji allowing you to use them in buttons!

public void onMessageReactionAdd(MessageReactionAddEvent event) {
  event.getChannel().sendMessage("User reacted")
    .setActionRow(Button.primary("buttonid", event.getEmoji())) // <- replacement for getReactionEmote()
    .queue();
}

Stickers (#2104)

In addition to the changes for emoji, we now have a full support for stickers! Bots can send up to 3 guild stickers in a message (but not in interactions). However, this is limited to only stickers from the same guild, so likely not useful to most bots.

This comes with support for:

  • Creating/Updating/Deleting guild stickers
  • Getting and sending stickers with messages
  • Access to nitro sticker packs (not sending though)
  • Full sticker event support

ChunkingFilter Breaking Change (#2053)

Previously, when you did setChunkingFilter(ChunkingFilter.ALL), we would always cache every member of the guild for the full runtime. This has been changed now, allowing you to further configure the member cache policy in addition to chunking. Now, to chunk and cache all members of a guild, you can use setChunkingFilter(ChunkingFilter.ALL).setMemberCachePolicy(MemberCachePolicy.ALL).

This is a breaking change and affects anyone using ChunkingFilter.

Command Permissions (#2113)

Discord made breaking changes to command permissions (aka Privileges). This means you can no longer configure the privileges of a command on a guild, without using oauth. Consequently, we updated our interface with breaking changes to address this.

Instead of using setDefaultEnabled(..) on your command and configuring a whitelist/blacklist of roles and users, you now have the ability to configure allowed permissions using setDefaultPermissions(...) and you can tell discord that a command is guild only with setGuildOnly(true).

However, you cannot configure this for individual subcommands, due to the way discord designed them.

Check out the SlashBotExample for some useful examples on how this works!

New Features

Changes

Bug Fixes

Full Changelog: v5.0.0-alpha.12...v5.0.0-alpha.13

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.13")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.13</version> 
</dependency>

v5.0.0-alpha.12

18 May 14:56
edbc423
Compare
Choose a tag to compare

Overview

This release contains a few tiny changes to improve the codebase, such as:

  • FileProxy for downloading images and files from discord (replacing Message.Attachments#download)
  • FileUpload for uploading images and files to discord (will be used for Message and Sticker creation)
  • Message#getMentions to replace all the mention handling in message and interactions. (Such as Message#getMentionedUsers)

Example Mentions Changes

Old:

List<TextChannel> channels = message.getMentionedChannels(); // only handles TextChannel mentions
List<User> users = message.getMentionedUsers();

New:

List<GuildChannel> channels = message.getMentions().getChannels(); // handles all channel mentions
List<MessageChannel> messageChannels = message.getMentions().getChannels(MessageChannel.class); // filter by class type
List<User> users = message.getMentions().getUsers();

New Features

Changes

Bug Fixes

Full Changelog: v5.0.0-alpha.11...v5.0.0-alpha.12

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.12")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.12</version> 
</dependency>

v5.0.0-alpha.11 | Modals

25 Apr 19:46
e8dc87f
Compare
Choose a tag to compare

Overview

This release finally brings out modals! This includes a variety of constructs, but the key ones to be immediately aware of are:

  • Modal
  • TextInput
  • ModalInteraction
  • ModalInteractionEvent
  • IModalCallback (replyModal(modal))

Modal Example

@Override
public void onSlashCommandInteraction(@Nonnull SlashCommandInteractionEvent event) {
    if (event.getName().equals("support")) {
        TextInput email = TextInput.create("email", "Email", TextInputStyle.SHORT)
                .setPlaceholder("Enter your E-mail")
                .setMinLength(10)
                .setMaxLength(100) // or setRequiredRange(10, 100)
                .build();

        TextInput body = TextInput.create("body", "Body", TextInputStyle.PARAGRAPH)
                .setPlaceholder("Your concerns go here")
                .setMinLength(30)
                .setMaxLength(1000)
                .build();

        Modal modal = Modal.create("support", "Support")
                .addActionRows(ActionRow.of(email), ActionRow.of(body))
                .build();

        event.replyModal(modal).queue();
    }
}
@Override
public void onModalInteraction(@Nonnull ModalInteractionEvent event) {
    if (event.getModalId().equals("support")) {
        String email = event.getValue("email").getAsString();
        String body = event.getValue("body").getAsString();

        createSupportTicket(email, body);

        event.reply("Thanks for your request!").setEphemeral(true).queue();
    }
}

New Features

Changes

  • Fix typos in GatewayIntent Javadoc and contributing guidelines by @CheesyGamer77 in #2098
  • prevent creating OptionData with OptionType#UNKNOWN by @caneleex in #2101

Bug Fixes

Removed

Full Changelog: v5.0.0-alpha.10...v5.0.0-alpha.11

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.11")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.11</version> 
</dependency>

v5.0.0-alpha.10

18 Apr 19:26
24b0553
Compare
Choose a tag to compare

Overview

UserSnowflake

We changed User.fromId to now return UserSnowflake instead of User. This is done to prevent users from attempting code such as User.fromId(123).openPrivateChannel() which would never work.

With this we also changed some methods to no longer accept raw IDs as long and String. Instead you can now use method(User.fromId(long/String)), ie. ban(User.fromId(1234)).

Removed Methods:

  • Guild#ban(long/String), Guild#ban(long/String, int), Guild#ban(long/String, int, String)
  • Guild#kick(long/String), Guild#kick(long/String, String)
  • Guild#unban(long/String)
  • Guild#retrieveBanById(long/String)
  • Guild#addMember(String, long/String)
  • Guild#timeoutForById(long/String, Duration)
  • Guild#timeoutUntilById(long/String, TemporalAccessor)
  • Guild#removeTimeoutById(long/String)
  • Guild#addRoleToMember(long/String, Role)
  • Guild#removeRoleFromMember(long/String, Role)
  • AuditLogPaginationAction#user(long/String)

New Features

Changes

Bug Fixes

  • Fix NPE when cloning guild role with null icon (v5) by @Tais993 in #2063
  • Build the User from data in the Interaction if the User was not cached. by @oliver276 in #2060
  • Fix possible ClassCastException when removing reactions in threads by @RoanH in #2069
  • Fix rate limiter not shutting down if there is an empty bucket at shutdown by @Vankka in #2080

Removed

  • Remove mentioning members with ! by @Tais993 in #2081
  • A variety of overloads that accepted string/long/User/Member. Refer to UserSnowflake details above.

Full Changelog: v5.0.0-alpha.9...v5.0.0-alpha.10

Installation

Gradle

repositories {
    mavenCentral()
}
dependencies {
    implementation("net.dv8tion:JDA:5.0.0-alpha.10")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-alpha.10</version> 
</dependency>