Skip to content

Releases: discord-jda/JDA

v5.0.0-alpha.22

23 Oct 20:29
5d13c14
Compare
Choose a tag to compare

Overview

This is most likely the final alpha release. The current plan is to merge a few more breaking changes, and address some remaining TODOs before finally bumping to beta! Stay tuned.

Implement new select menus (#2287)

Discord has introduced new select menu component types, which support selecting mentionable entities like User/Role/Channel. With this release we are introducing a small breaking change to the SelectMenu type:

  • StringSelectMenu is the old select menu, used for custom string choices
  • EntitySelectMenu is the new select menu, used for mentionable entities

And you use the StringSelectInteractionEvent and EntitySelectInteractionEvent to handle them.

Ability to disable/pause invites of a guild (#2222)

Recently, Discord added a new moderation feature to pause the invites of a guild, including vanity invites. This is usually done using the Pause Invites button in the guild settings.

You can now do this using the GuildManager via setInvitesDisabled(true).

Scheduled Events (#2047)

This is rather late, but you can now handle and create scheduled events. To create a scheduled event you can use one of the createScheduledEvent overloads in Guild:

  • Use createScheduledEvent(name, channel, time) to create a local event to take place in a specific voice or stage channel
  • Use createScheduledEvent(name, location, startTime, endTime) to create an external event, such as a concert or similar

New Features

Changes

Bug Fixes

Full Changelog: v5.0.0-alpha.21...v5.0.0-alpha.22

Installation

Gradle

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

Maven

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

v5.0.0-alpha.21 | Small Event Changes

07 Oct 20:25
4fe2065
Compare
Choose a tag to compare

Overview

Almost ready for beta. This release changes a few event names and introduces a new interface GenericSessionEvent. With this, almost every breaking change that we had planned is completed. There will likely only be one more alpha release before bumping to beta.

Event Changes (#1952)

Events related to the active gateway session / main socket now have a common abstraction called GenericSessionEvent. We also changed a few event names for better clarity:

Old New
DisconnectEvent SessionDisconnectEvent
ReconnectedEvent SessionRecreateEvent
ResumedEvent SessionResumeEvent

All the session related events are now in a common package at net.dv8tion.jda.api.events.session, this also includes some breaking package changes for a few commonly used events like ReadyEvent.

Additionally, events for voice channels of guild members have been changed slightly. Previously, we provided 3 separate voice channel update events:

  • GuildVoiceJoinEvent
  • GuildVoiceLeaveEvent
  • GuildVoiceMoveEvent

Due to the confusing nature of these events, we have decided to instead only provide a single GuildVoiceUpdateEvent. This new event provides the old and new channel, which can each be null to indicate either a leave (null new channel) or join (null old channel).

Changes

Bug Fixes

Full Changelog: v5.0.0-alpha.20...v5.0.0-alpha.21

Installation

Gradle

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

Maven

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

v5.0.0-alpha.20 | Forum channel support

21 Sep 13:59
1f6fca2
Compare
Choose a tag to compare

Overview

Discord is currently rolling out forums to all community guilds. This release adds support for these channels in JDA.

Forum support (#2184)

To use a forum channel, you must create a forum post. Posts are simply public ThreadChannels with a starter message. To create a post, instead of using the usual createThreadChannel, you must use createForumPost:

forum.createForumPost("Post Title Here", new MessageCreateBuilder()
  .addContent("# Header\n")
  .addContent("This is my first forum post!")
  .build()
).queue(post -> {
  Message message = post.getMessage();
  ThreadChannel thread = post.getThreadChannel();
  thread.sendMessage("Followup message").queue();
});

To create such a post, the bot must have Permission.MESSAGE_SEND in the forum channel. The client refers to this permission as Create Posts.

AudioChannel improvements (#2252)

As of this release, AudioChannel extends StandardGuildChannel instead of GuildChannel. This allows for a lot more features directly on the abstract interface, rather than having to cast down to voice or stage channels.

  • Invites
  • Category getter
  • Permissions
  • Positions
  • Copying

New Features

Changes

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

Installation

Gradle

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

Maven

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

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>