Releases: discord-jda/JDA
v5.0.0-alpha.22
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 choicesEntitySelectMenu
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
- Add GuildManager#setFeatures by @MinnDevelopment in #2222
- Add support for guild scheduled events v2 by @Mitmocc in #2047
- Implement new select menus by @MinnDevelopment in #2287
Changes
- Retain sort order for ThreadChannel#getAppliedTags by @MinnDevelopment in #2278
- FileProxy: additional checks on existing files by @freya022 in #2293
- Put "options" between command path and options, same for choices by @freya022 in #2261
- Move ModalInteraction into correct package by @Xirado in #2282
- Improve
toString
methods by @freya022 in #2273 - Check for empty token in AuthorizationConfig, instead of JDAImpl by @freya022 in #2230
- Improve channel update handling by @MinnDevelopment in #2255
Bug Fixes
- Make ForumTag extend ForumTagSnowflake by @MinnDevelopment in #2276
- Handle emoji_id sometimes being 0 instead of null by @MinnDevelopment in #2279
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
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
- Update event hierarchy by @MinnDevelopment in #1952
- Make annotation dependencies compileOnly by @MinnDevelopment in #2249
Bug Fixes
- Fix check for ChannelAction#setCategory by @MinnDevelopment in #2259
- Fix some checks not throwing the intended exception by @MinnDevelopment in #2260
- fix: Use correct "flags" field for message create action by @RedDaedalus in #2272
- Handle newly_created gracefully by @MinnDevelopment in #2254
- Fix manager docs by @freya022 in #2271
- Add missing annotations on ThreadChannel by @MinnDevelopment in #2274
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
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
- Add support for forum channels by @MinnDevelopment in #2184
- Added RestAction#onSuccess by @Zabuzard in #2227
Changes
- Improve usability of AudioChannel by @MinnDevelopment in #2252
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
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
- Add support for ban deletion with seconds precision by @MinnDevelopment in #2229
- Add support for component-only messages by @MinnDevelopment in #2241
- Add support for string option bounds by @caneleex in #2169
- Add DataPath util by @MinnDevelopment in #2212
- Add category feature to ChannelOrderAction by @MinnDevelopment in #2136
Changes
- Return immutable reconstructed interaction object lists by @freya022 in #2220
- Renamed MessageCreateBuilder#fromEdit() to fromEditData by @lilmayu in #2225
- Invalid token exception by @java-coding-prodigy in #2025
- Update to gateway version 10 by @freyacodes in #2228
- Use String#intern for guild features and atoms by @MinnDevelopment in #2235
- Move channels to separate package and cleanup code by @MinnDevelopment in #2180
- Remove ChannelAction#setType by @MinnDevelopment in #2218
Bug Fixes
- Use toAbsolutePath in FileProxy#downloadToPath by @MinnDevelopment in #2239
- Improve handling of server errors and fix some code duplication by @MinnDevelopment in #2237
- Change handling of query parameters for websocket connections by @MinnDevelopment in #2248
- Properly handle MANAGE_THREAD permission for managing threads by @DV8FromTheWorld in #2247
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
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:
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
- Add support for setting voice region on channel creation/copy by @CheesyGamer77 in #2209
- Implement gateway resume url handling by @MinnDevelopment in #2203
- Implement
GuildChannel#getJumpUrl
by @DynxstyGIT in #2204 - Add ApplicationInfo#getFlags by @MinnDevelopment in #2202
- Add sticker features for audit logs by @DxsSucuk in #2198
- Add some missing interaction features by @MinnDevelopment in #2195
Changes
- Message Rework by @MinnDevelopment in #2187
- Improve usage of cache in Guild#retrieveMemberById by @MinnDevelopment in #2200
Bug Fixes
- Fix CommandAutoCompleteInteraction#getChannel by @MinnDevelopment in #2211
- Fix ban pagination by @MinnDevelopment in #2201
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
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
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
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
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 asmessage.editMessage(...).addFile(...)
), will now remove all current attachments on the message. To retain existing attachments, you are now required to also useretainFiles(...)
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
, andgetMentions().getCustomEmojis()
getActionRows
, andgetButtons
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
- Add JDABuilder#setEventPassthrough by @freya022 in #2014
- Application command localization by @freya022 in #2090
- Handle text in voice channels by @MinnDevelopment in #2072
Changes
- Introduce Channel Unions by @DV8FromTheWorld in #2138
- Add EmojiUnion by @MinnDevelopment in #2167
- Update to API version 10 by @MinnDevelopment in #2165
Bug Fixes
- Fix handling of empty emoji names by @MinnDevelopment in #2176
- Return ThreadChannelAction instead of RestAction on Message#createThreadChannel by @Mitmocc in #2171
- Make MessageType#deletable return an accurate value. by @RedDaedalus in #2160
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
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
- Rework stickers by @MinnDevelopment in #2104
- Uniform representation of emoji by @MinnDevelopment in #2117
- Add Support for Application-Command Permissions V2 by @Xirado in #2113
Changes
- Changed addField String name and String Value to Nonnull by @RealYusufIsmail in #2133
- Do not ignore member cache policy when chunking is enabled by @MinnDevelopment in #2053
Bug Fixes
- Fix Message.Attachment#getProxy() by @Xirado in #2139
- Fix missing guild id when deleting guild stickers by @CheesyGamer77 in #2144
- Fix filterHidden in GuildImpl#getChannels by @MineKing9534 in #2151
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>