Skip to content

Releases: discord-jda/JDA

v5.0.0-alpha.4 | Member Timeouts

10 Jan 04:38
406d49d
Compare
Choose a tag to compare

Changelog

New Features

  • Added support for member timeouts by @caneleex in #1902

Changes

  • Fixed parsing pagination of private archived threads by @Sanduhr32 in #1979
  • Only update CommandData limiting booleans for non-empty additions by @Sanduhr32 in #1963

Removed

  • N/A

Full Changelog: v5.0.0-alpha.3...v5.0.0-alpha.4

Installation

Gradle

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

Maven

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

v5.0.0-alpha.3

24 Dec 22:02
Compare
Choose a tag to compare

Changelog

New Features

Changes

  • Fix parsing of the nullable presence field on Thread Members Update by @caneleex in #1948
  • Transform SelectionMenu magic values into constants by @caneleex in #1944
  • Fix IllegalStateException for OptionType.MENTIONABLE by @averen in #1964
  • Hardcode gateway url by @Xirado in #1957
  • Use bitshifts instead of hexcodes in managers by @caneleex in #1953

Removed

  • N/A

Full Changelog: v5.0.0-alpha.2...v5.0.0-alpha.3

Installation

Gradle

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

Maven

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

v5.0.0-alpha.2

03 Dec 21:03
ae1fabf
Compare
Choose a tag to compare

Changelog

New Contributors

New Features

  • Add missing ErrorResponse values by @Xirado in #1892
  • Add GenericMessageEvent#getThreadChannel() by @rtm516 in #1924
  • Make Guild#moveVoiceMember support AudioChannel instead by @caneleex in #1928
  • add Message.Attachment#getDescription by @caneleex in #1930

Changes

  • Implement parent channel fetching when checking thread permissions by @rtm516 in #1925
  • fix wrong check in GenericMessageEvent#getGuildChannel by @caneleex in #1927
  • Make SelectionMenu#getOptions return an unmodifiable list by @freya022 in #1922
  • Rename ThreadAction to ThreadChannelAction by @caneleex in #1931

Removed

  • Remove GuildManager#setVanityCode by @caneleex in #1933

Full Changelog: v5.0.0-alpha.1...v5.0.0-alpha.2

Installation

Gradle

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

Maven

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

v5.0.0-alpha.1 | Thread Support, Channel Hierarchy Rework

29 Nov 23:07
Compare
Choose a tag to compare

Welcome to the v5 alpha

While we are working through the alpha stage it is expected that things will not be completely hardened yet. Functionality may contain bugs. Docs will be may be missing for new features. Code is still subject to breaking changes. This is the edge of the edge, but this is where the new fun features are to play with. What life without a little danger? 😎

As such, we encourage you to jump in, update your bots, and play with the new feature, but also recognize that v5 is still very much a work-in-progress. We'll do our best to provide a bug free space, but there are additional breaking changes planned for v5, so keep an eye out! 🛠️

Branch Changes

In v4 we had 3 branches:

  • development - In-progress work for v4 releases went here. All PRs were pointed at this.
  • docs/development - Documentation only changes went here. This would get merged into development to keep development history cleaner
  • release - When a new release was made a merge commit was made from development to release. release always showed the code at the time of release for the latest release.

In v5 we are simplifying this:

  • development - This branch is being removed.
  • docs/development - This branch is being removed
  • release - This branch is being removed
  • master - This will be the primary and only branch. It will serve the same purpose that development did in v4, but with a more consistent naming expected by the community. All changes (PRs), regardless of their content, are to be made against this branch.

Additionally, just like with all major-revisions of JDA, the legacy code will be maintained.
As such, the contents of development are currently available on legacy/v4 and will be available there even after development is deleted. Any critical bug fixes that we backport to v4 will be made to legacy/v4.

Version Schema changes:

Starting with v5, we are changing how we handle versions.
The new version schema: <major>.<minor>.<revision>[-<classification>.<classificationRevision>]
Examples:

  • 5.0.0-alpha.1
  • 5.0.0-beta.14
  • 5.1.2

Historically, we versioned JDA as <major>.<minor>.<revision>_<buildVersion> where buildVersion was a continuously incremented number. This led us to have situations where we didn't make an actual release for a long time because developers could just update to the latest <buildVersion>, effectively rendering the normal versioning meaningless. As such, in v5 we have decided to create releases much more often and in doing so we are dropping the <buildVersion> identifier. As a note, these builds where the only part of the version that changed was the buildVersion were JDA's snapshot builds.

Going forward, we are no longer going to be publishing our snapshot builds. This means that not every commit will lead to a repository-published version. The only version that will be published are releases. Releases are when the actual version of JDA has been changed. Anything that is not a release is a snapshot.

Snapshot builds will still be available in 2 ways:

  1. Jitpack
  2. Jenkins CI via JAR downloads

Additionally, the snapshot builds have a slight variant on the new versioning scheme in terms of build assets. For snapshot builds the assets are versioned as <major>.<minor>.<revision>[-<classification>.<classificationRevision>]_<git-commit-7-char-hash>
Examples:

  • 5.0.0-alpha.1_d3fac3k
  • 5.0.0-beta.14_67ylgde
  • 5.1.2_fl1opac

Changelog

New Contributors

New Features

  • JDA now supports threads via the new ThreadChannel construct.
  • StageChannel is now its own type, not an extension of VoiceChannel
  • NewsChannel is now a full-fledge type, not just a subset of TextChannel via isNews()
  • AudioChannel now exist as an interface that contains the shared parts of VoiceChannel and StageChannel. The various parts of the audio system that dealt with channels now deal with AudioChannel instead of explicitly VoiceChannel
  • Introduced "attribute" interfaces that allow interop between concrete channel types:
    • IInviteContainer
    • IPositionableChannel
    • IPermissionContainer
    • ICategorizableChannel
    • etc
  • Introduced GuildChannel#getPermissionContainer to easily get access to an instance of IPermissionContainer for the current channel. In the majority of cases this method will simply return the same channel but cast to IPermissionContainer, but it can return other channels instead, like with ThreadChannel as ThreadChannel doesn't support IPermissionContainer and relies on its parent channel to determine permissions.
    • Additionally, you don't have to use this method. If you know the current GuildChannel instance you have implements IPermissionContainer you can just cast to it. No big deal. This getter is just here for simplicity without casting.
  • Unified channel events:
    We've simplified detecting and handling events for channels by replacing the type-specific events (like TextChannelCreateEvent) with unified events that fire for every channel. You can differentiate between the specific channel types as needed via event.getChannelType()
    • ChannelCreateEvent
    • ChannelUpdateXEvent (e.g: ChannelUpdateNameEvent)
    • ChannelDeleteEvent
  • Type-trimmed Channel Managers
    • ChannelManager
    • attributes
      • IPermissionContainerManager
      • IPositionableChannelManager
      • ICategorizableChannelManager
    • middleman
      • AudioChannelManager
      • BaseGuildMessageChannelManager
    • concrete
      • CategoryManager
      • NewsChannelManager
      • StageChannelManager
      • TextChannelManager
      • ThreadChannelManager
      • VoiceChannelManager

Changed

  • ActivityType.DEFAULT renamed to ActivityType.PLAYING
  • Many permissions were renamed or removed
    • MESSAGE_READ -> Removed. Use VIEW_CHANNEL instead.
    • MESSAGE_WRITE -> MESSAGE_SEND
    • USE_SLASH_COMMANDS -> USE_APPLICATION_COMMANDS
    • MANAGE_EMOTES -> MANAGE_EMOTES_AND_STICKERS
    • USE_PUBLIC_THREADS -> CREATE_PUBLIC_THREADS
    • USE_PRIVATE_THREADS -> CREATE_PRIVATE_THREADS
  • OptionData#addChoice(String, int) -> OptionData#addChoice(String, long)
  • MessageBulkDeleteEvent#getChannel now returns GuildMessageChannel instead of TextChannel
  • WebhookClient#getChannel and WebhookManager#getChannel now both return BaseGuildMessageChannel instead of TextChannel

Removed

  • All deprecated code from v4
  • ChannelManager#getType(). Use ChannelManager#getChannel()#getType()
  • ChannelManager#setNews. Use TextChannelManager#setType or NewsChannelManager#setType
  • ChannelAction#setNews. Use Guild#createNewsChannel
  • NewsChannel related methods removed from TextChannel as NewsChannel is a full-fledged entity now
    • TextChannel#follow -> NewsChannel#follow
    • TextChannel#crosspostMessage -> NewsChannel#crosspostMessage
  • Removed all <Type> specific channel events. Use the new Unified Channel events mentioned above.
    This includes:
    • <Type>ChannelCreateEvent (ex: TextChannelCreateEvent)
    • <Type>ChannelUpdate<Field>Event (ex: TextChannelUpdateNameEvent)
    • <Type>ChannelDeleteEvent (ex: TextChannelDeleteEvent)
  • Removed all <Context>Message<X>Events (ex: GuildMessageReceivedEvent)
    This includes:
    • Generic<Context>MessageEvent (ex: GenericGuildMessageEvent)
    • <Context>MessageReceivedEvent (ex: GuildMessageReceivedEvent)
    • <Context>MessageUpdateEvent (ex: GuildMessageUpdateEvent)
    • <Context>MessageDeleteEvent (ex: GuildMessageDeleteEvent)
    • <Context>MessageEmbedEvent (ex: GuildMessageEmbedEvent)
    • <Context>MessageReaction<X>Event (ex: GuildMessageReactionAddEvent)
    • etc

Full Changelog: v4.4.0...v5.0.0-alpha.1

Installation

With v5 we are finally moving back to Maven Central for our releases. m2.dv8tion.net will continue to host our v4 artifacts until the v4 LTS concludes, but going forward we will be publishing releases to Maven Central. For snapshot builds, please use jitpack.

Gradle

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

Maven

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

v4.4.0 | Long Term Support (LTS)

26 Nov 19:27
Compare
Choose a tag to compare

This release is long overdue, but with it comes the decision to place v4 into LTS status.

Support for v4 will consist only of bug fixes from this point forward as development focus turns to v5. No additional features, documentation changes, or enhancements will be accepted for v4. Additionally, No changes to support the new GuildIntents.MESSAGE_CONTENT will be backported into v4. This shouldn't be a problem, as v4 handles things well, but it bares mentioning.

The LTS support timer will start once v5 reaches a level of maturity that we feel confident enough in, such that we would recommend transition to it for all developers. It will likely start once v5 hits beta and 6 months after that we will drop support for v4.

Going forward, we will be working on getting the v5.0.0 alpha builds out.

Also, Please take a moment to look at the deprecated features as they will all be removed in v5

New Features

Deprecation

All deprecated features in v4 will be removed in v5!
Detailed javadoc can be found in the deprecated tab of the docs

Installation

The release version is: 4.4.0_350

The latest version is: latest version

Gradle

repositories {
    mavenCentral()
    maven {
        name 'm2-dv8tion'
        url 'https://m2.dv8tion.net/releases'
    }
}
dependencies {
    implementation("net.dv8tion:JDA:4.4.0_350")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>4.4.0_350</version>
</dependency>
<repository>
    <id>dv8tion</id>
    <name>m2-dv8tion</name>
    <url>https://m2.dv8tion.net/releases</url>
</repository>

Changelog

Read more

v4.3.0 | Interactions, Slash-Commands, and Buttons

11 Jun 10:25
24aed48
Compare
Choose a tag to compare

In this release, we are adding support for the new interactions API for bots. You can now use slash-commands and buttons with your bot to enhance the integration into the Discord interface.

Some useful resources:

Keep in mind that Slash-Commands are a lot more limited and always require a response. You should make sure you understand the restrictions implied by slash-commands before converting your existing implementations. I wrote some guidelines you should be aware of in this gist: Slash Command Limitations

Support for stage channels will be added in the next release. In the meantime, just imagine a place where it's implemented!

New Features

  • Interactions (Slash-Commands and Buttons) #1501
  • Voice Channel Regions #1622
  • Guild Templates #1465

You can check the full list of pull requests for more details:
4.3.0 Milestone

Thank you all for your contributions!

Deprecation

Detailed javadoc can be found in the deprecated tab of the docs

Installation

The release version is: 4.3.0_277

The latest version is: latest version

Gradle

repositories {
    mavenCentral()
    maven {
        name 'm2-dv8tion'
        url 'https://m2.dv8tion.net/releases'
    }
}
dependencies {
    implementation("net.dv8tion:JDA:4.3.0_277")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>4.3.0_277</version>
</dependency>
<repository>
    <id>dv8tion</id>
    <name>m2-dv8tion</name>
    <url>https://m2.dv8tion.net/releases</url>
</repository>

v4.2.1 | New Maven Repository, Replies, News Channels

02 Apr 08:33
fa8a40a
Compare
Choose a tag to compare

With this release, we are addressing the sunset of the jcenter repository. (Read More)
We switched our release to a custom solution which is now hosted on https://m2.dv8tion.net/releases
See below in the Installation section for further details on the new repository.

Slash Commands, Stage Channels, and API v8 are going to be addressed in 4.3.0.

New Features

  • Message Replies (#1408)
  • RestAction#and and RestAction.allOf (#1320)
  • News Channels and Crossposting (#1362)
  • GuildMemberUpdateEvent (#1422)
  • RoleTags (#1343)

You can check the full list of pull requests for more details:
4.2.1 Milestone

Thank you all for your contributions!

Deprecation

Detailed javadoc can be found in the deprecated tab of the docs

Installation

The release version is: 4.2.1_253

The latest version is: latest version

Gradle

repositories {
    mavenCentral()
    maven {
        name 'm2-dv8tion'
        url 'https://m2.dv8tion.net/releases'
    }
}
dependencies {
    implementation("net.dv8tion:JDA:4.2.1_253")
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>4.2.1_253</version>
</dependency>
<repository>
    <id>dv8tion</id>
    <name>m2-dv8tion</name>
    <url>https://m2.dv8tion.net/releases</url>
</repository>

v4.2.0 | Gateway Intents

29 Jun 11:36
3a9fcd0
Compare
Choose a tag to compare

All support for AccountType.CLIENT has been removed. We can no longer support this API as it has diverged too much from the bot API.

In this release, we have to take a look at the new Discord API changes. As of late discord has been putting a lot of work into the privacy protection of their users. Unfortunately, that also includes limiting the data available to bots.
Bots are now required to explicitly state which features they intend to use by providing a set of GatewayIntents.

Additionally, bots should no longer directly depend on the cache of users/members with methods like getUserById() and getMembers(). You should now use lazy loading and load members through methods like retrieveMemberById or retrieveMembersByPrefix.

The old default behavior was to perform chunking on startup (explained in wiki article below). However, chunking is now a privileged feature which bots should not depend on. For this reason, we deprecated the old JDABuilder (and DefaultShardManagerBuilder) constructors in favor of new factory methods:

I've added a new wiki page that explains this in more detail: Gateway Intents and Member Cache Policy.

We have switched to the new domain discord.com. This will be required as of November 7, 2020.

New Features

  • GatewayIntents
  • MemberCachePolicy
  • Invite events
  • Mention Whitelist
  • RestAction timeout/deadline

You can check the full list of pull requests for more details:
4.2.0 Milestone

Thank you all for your contributions!

Deprecation

Detailed javadoc can be found in the deprecated tab of the docs

Installation

The release version is: 4.2.0_168

The latest version is: version

Gradle

repositories {
    jcenter()
}
dependencies {
    compile("net.dv8tion:JDA:4.2.0_168")
}

Maven

The jcenter repository now only works with https! Please change your URL from http to https

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>4.2.0_168</version>
</dependency>
<repository>
    <id>jcenter</id>
    <name>jcenter-bintray</name>
    <url>https://jcenter.bintray.com</url>
</repository>

v4.1.1 | Avoid callback hell and rate limits

24 Jan 13:23
d472d98
Compare
Choose a tag to compare

A lot of people use nested callbacks for things like sending private messages or adding reactions:

@Override
public void onMessageReceived(MessageReceivedEvent event) {
  if (event.getMessage().getContentRaw().equals("!hello")) {
    user.openPrivateChannel().queue(
      channel -> channel.sendMessage("Hello Friend").queue(null,
        error -> event.getChannel().sendMessage("Failed to send message!").queue()));
  }
}

This gets very hard to read and maintain. Instead you can use something like submit() which returns a CompletableFuture to allow using continuations such as thenCompose and similar. This is great and all but that API is rather bad as it will swallow any errors by default and the error handling methods are not very nice.
We added a few new operators for common actions on RestAction:

  • map
    Convert the result of the RestAction to a different value
  • flatMap
    Chain another RestAction on the result
  • delay
    Delay the element of the previous step

Let's look at the same example using the new flatMap operator:

@Override
public void onMessageReceived(MessageReceivedEvent event) {
  if (event.getMessage().getContentRaw().equals("!hello")) {
    user.openPrivateChannel()
           .flatMap(channel -> channel.sendMessage("Hello Friend"))
           .queue(null, error -> event.getChannel().sendMessage("Failed to send message!").queue()));
  }
}

This can be expanded to even more complicated chains:

@Override
public void onMessageReceived(MessageReceivedEvent event) {
  if (event.getMessage().getContentRaw().equals("!hello")) {
    event.getChannel().sendMessage("I'll contact you in 10 seconds") // MessageAction
      .delay(Duration.ofSeconds(10)) // delay next flatMap by 10 seconds
      .flatMap(m -> user.openPrivateChannel()) // RestAction<PrivateChannel>
      .flatMap(channel -> channel.sendMessage("Hello Friend, this will self destruct in 30 seconds")) // RestAction<Message>
      .delay(Duration.ofSeconds(30)) // delay next flatMap by 30 seconds
      .flatMap(Message::delete) // RestAction<Void>
      .queue(null, error -> event.getChannel().sendMessage("Failed to send message!").queue()));
  }
}

You can imagine how this would look with just queue/queueAfter:

@Override
public void onMessageReceived(MessageReceivedEvent event) {
  if (event.getMessage().getContentRaw().equals("!hello")) {
    event.getChannel().sendMessage("I'll contact you in 10 seconds").queue(m ->
      user.openPrivateChannel().queueAfter(10, TimeUnit.SECONDS, channel -> 
        channel.sendMessage("Hello Friend, this will self descruct in 30 seconds").queueAfter(30, TimeUnit.SECONDS,
          message -> message.delete().queue(),
          error -> event.getChannel().sendMessage("Failed to send message!").queue()
        )
      )
    );
  }
}

We also changed the implementation for the Rate Limiter in JDA which will now properly keep track of the "new" X-RateLimit-Bucket header to track which endpoints share the same rate-limit. This also means that JDA will now allow multiple requests to the same path while they follow different HTTP methods. For the user this just means, JDA now has a better understanding of how discord will limit your requests.

The new rate-limiter also has improved logging. You can now see which routes have what rate-limit by setting the logging level of net.dv8tion.jda.internal.requests.RateLimiter to trace. This will log messages such as this:

Updated bucket 80c17d2f203122d936070c88c8d10f33:guild_id:125227483518861312:webhook_id to (4/5, 4408)

The numbers at the end have this meaning (remaining requests/allowed requests in the reset time, milliseconds until reset).
The long bucket id is composed of the hash and the major parameters of the request. You can figure out which hash is for which bucket fairly quickly by looking for the corresponding cache log:

Caching bucket hash POST/channels/{channel_id}/messages -> 80c17d2f203122d936070c88c8d10f33

New Features

  • RestAction operators (flatMap, map, delay)
  • JDABuilder#setMaxBufferSize (same for shard manager)
  • Message#suppressEmbeds and Message#getFlags

Deprecation

Detailed javadoc can be found in the deprecated tab of the docs

Installation

The release version is: 4.1.1_101

The latest version is: version

Gradle

repositories {
    jcenter()
}
dependencies {
    compile "net.dv8tion:JDA:4.1.1_101"
}

Maven

The jcenter repository now only works with https! Please change your URL from http to https

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>4.1.1_101</version>
</dependency>
<repository>
    <id>jcenter</id>
    <name>jcenter-bintray</name>
    <url>https://jcenter.bintray.com</url>
</repository>

Pull Requests

You can view the 4.1.1 Milestone for a list of accepted pull requests for this release. Thank you to everyone who contributed!

v4.1.0 | Be More Lazy

23 Dec 05:57
6d5db0f
Compare
Choose a tag to compare

We added support for lazy loading and now allow to disable guild subscriptions!

To enable lazy loading you have to configure a ChunkingFilter on your builder of choice [1]. Lazy loading means that JDA will not attempt to request the entire member list of a guild before starting to send events. Instead, members will be loaded on their first activity and members who are never active will never be loaded into cache.

new JDABuilder(TOKEN)
    .setChunkingFilter(ChunkingFilter.NONE) // don't chunk any guilds
    .build();

1) Example how to enable lazy loading

The more extreme choice is to disable guild subscriptions [2]. This feature completely disables member and user cache for the shard/jda session. Note that if you need methods like Guild#getMembers or similar things that require knowledge of the entire member list this is not something you should be using. JDA cannot determine the size of a guild or member join/leave with this disabled. The benefit of this is a greatly reduced memory footprint with the disadvantage of losing member state tracking.

new JDABuilder(TOKEN)
    .setGuildSubscriptionsEnabled(false)
    .build();

2) Example how to disable guild subscriptions

A footnote is that CacheFlag.VOICE_STATE can still be tracked and users in voice channels will still be loaded into cache when this cache flag is enabled. This is useful for music bots that want to leave a voice channel if they are alone.

You can now ignore specific ErrorResponse failures more easily. With ErroResponseException.ignore(...) you can create a failure consumer that drops any ErrorResponseException for the specified set of responses. [3]

import static net.dv8tion.jda.api.exceptions.ErrorResponseException.ignore;
import static net.dv8tion.jda.api.requests.ErrorResponse.*;

message.delete().queue(null, ignore(UNKNOWN_MESSAGE)); // ignore if message doesn't exist anymore
message.delete().queue(null, ignore(Logger::error, UNKNOWN_MESSAGE)); // ignore otherwise log

3) Example how to ignore UNKNOWN_MESSAGE errors

New Features

  • Lazy Loading and disable guild subscriptions
  • Readonly support for custom status
  • Member#getActiveClients
  • ErrorResponseException.ignore(...)

Deprecation

Detailed javadoc can be found in the deprecated tab of the docs

  • GuildUnavailableException, Guild#isAvailable this is no longer used, unavailable guilds are no longer in the guild cache. You can check if a guild is unavailable with JDA#getUnavailableGuilds
  • Guild#retrieveVanityUrl replace with Guild#getVanityUrl
  • Invite#getCreationTime replace with Invite#getTimeCreated
  • JDA#getVoiceChannelByName replace with JDA#getVoiceChannelsByName
  • ShardManager#setGame replace with ShardManager#setActivity
  • SessionController#getGatewayBot replace with SessionController#getShardedGateway

Incubating

  • AccountType#CLIENT this is most likely going to break soon with impending changes to the gateway
  • JDABuilder(AccountType) this will be removed when AccountType#CLIENT breaks in the future
  • Activity#watching, ActivityType#WATCHING this is not officially supported by the API but currently usable
  • ActivityType#CUSTOM_STATUS this is currently not usable for bots and can only be seen on other users
  • AudioManager#getSpeakingMode, AudioManager#setSpeakingMode this is not a confident implementation and should be used with care

Installation

The release version is: 4.1.0_81

The latest version is: version

Gradle

repositories {
    jcenter()
}
dependencies {
    compile "net.dv8tion:JDA:4.1.0_81"
}

Maven

<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>4.1.0_81</version>
</dependency>
<repository>
    <id>jcenter</id>
    <name>jcenter-bintray</name>
    <url>https://jcenter.bintray.com</url>
</repository>

Pull Requests

You can view the 4.1.0 Milestone for a list of accepted pull requests for this release. Thank you to everyone who contributed!