Skip to main content

Migrating from v3.2 to v3.3

This article should help you update your bot from Discord4J v3.2.x to v3.3.0. This new major release is over a year in the making and has lots of changes.

Before you start

note

If you encounter an issue while following this guide or discover something missing, feel free to suggest changes or discuss them in our server. Thanks!

Updating dependencies

Discord4J v3.3 depends on Reactor 2023 release train (Reactor Core 3.4.x and Reactor Netty 1.0.x). It maintains the JDK 8 baseline and includes other dependency upgrades like:

  • discord-json 1.6 (from 1.5)
  • jackson-databind 2.17 (from 2.12)
  • jackson-datatype 2.17 (from 2.12)
  • caffeine 2.9 (from 2.8)
  • immutables 2.10 (from 2.9)
  • jsr305 from com.google.code.findbugs 3.0 (new dependency)

Gradle

repositories {
mavenCentral()
}

dependencies {
implementation 'com.discord4j:discord4j-core:3.3.0'
}

Maven

<dependencies>
<dependency>
<groupId>com.discord4j</groupId>
<artifactId>discord4j-core</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>

Changes in discord-json

Class rename

  • PositionModifyRequest: This class has been split into two classes, ChannelPositionModifyRequest and RolePositionModifyRequest

Class hierarchy changed

  • OnboardingData: This interface now extends BaseOnboardingData. The defaultChannelIds and enabled methods were moved to the parent.
  • OnboardingPromptData: This interface now extends BaseOnboardingPromptData. The type, title, singleSelect, required, and inOnboarding methods were moved to the parent.
  • OnboardingPromptOptionData: This interface now extends BaseOnboardingPromptOptionData. The channelsIds, rolesIds, title, and description methods were moved to the parent.

Deprecation

  • ApplicationInfoData#summary: This field is deprecated and will be removed in Discord API v11. This field always returns an empty string.
  • ApplicationCommandData#dmPermission: Use ApplicationCommandData#contexts instead

Field type change

  • ResolvedChannelData:

    • name: String -> Possible<Optional<String>>
    • permissions: String -> Possible<Optional<String>>
  • OnboardingPromptOptionData:

    • emoji: EmojiData -> Possible<EmojiData>
  • ApplicationInfoData:

    • owner: UserData -> Possible<PartialUserData>
  • ApplicationTeamMemberData:

    • role: String -> Possible<String>
  • PositionModifyRequest (now ChannelPositionModifyRequest):

    • position: int -> Possible<Optional<Integer>>

Changes in discord4j-core

Notable changes

  • Update gateway API version to 10
  • Calling any method that retrieves restricted data (message content, embeds, etc.) without enabling the MESSAGE_CONTENT will raise an UnsupportedOperationException
  • Created a new interface, TopLevelGuildMessageWithThreadsChannel that extends TopLevelGuildMessageChannel, used for TextChannel and NewsChannel. This interface represents text channels that can have threads (A VoiceChannel is also a TopLevelGuildMessageChannel but cannot have threads).

Signature changes

  • RestGuild#modifyChannelPositions now takes a List<ChannelPositionModifyRequest> as parameter

  • RestGuild#modifyRolePositions now takes a List<RolePositionModifyRequest> as parameter

  • GuildService#modifyGuildChannelPositions now takes a ChannelPositionModifyRequest[] as parameter

  • GuildService#modifyGuildRolePositions now takes a RolePositionModifyRequest[] as parameter

  • MessageCreateSpec#messageReference now takes a Possible<MessageReferenceData> as parameter

  • MessageCreateMono#withMessageReference now takes a Possible<MessageReferenceData> as parameter

  • ApplicationTeamMember#getRole no longer returns null for the team owner, but TeamMemberRole.ADMIN

  • ApplicationInfo#getOwnerId now returns an Optional<Snowflake>

  • RestGuild#modifyChannelPositions now returns a Flux<Void>

  • GuildService#modifyGuildChannelPositions now returns a Flux<Void>

  • MessageBulkDeleteEvent#getChannel now returns a Mono<MessageChannel>

  • VoiceState#getChannel now returns a Mono<AudioChannel>

  • ResolvedChannel#getName now returns an Optional<String>

  • ResolvedChannel#getEffectivePermissions now returns an Optional<PermissionSet>

  • MessageChannel#getPinnedMessages now returns a PinnedMessagesQueryFlux with a reference pinned message

  • The GuildEmoji class now extends Emoji

  • The Category class now extends BaseTopLevelGuildChannel

  • The GuildMessageChannel class now extends GuildChannel, MessageChannel

  • The PrivateChannel class now extends BaseChannel and implements MessageChannel

  • The StoreChannel class now extends BaseTopLevelGuildChannel and implements CategorizableChannel

  • The NewsChannel class now extends BaseTopLevelGuildChannel and implements TopLevelGuildMessageWithThreadsChannel

  • The TextChannel class now extends BaseTopLevelGuildChannel and implements TopLevelGuildMessageWithThreadsChannel

  • The VoiceChannel class now extends BaseTopLevelGuildChannel and implements AudioChannel, TopLevelGuildMessageChannel

  • The method User#equals is no longer final

  • Renamed method Guild#getGuildEmojiById to getEmojiById

  • Renamed VoiceChannelJoinSpec to AudioChannelJoinSpec

  • Renamed VoiceChannelJoinMono to AudioChannelJoinMono

  • Renamed ReactionEmoji to Emoji

  • Removed field Routes#NITRO_STICKER_PACKS_GET; use Routes#STICKER_PACK_GET

Removed methods and classes

  • Removed method AutoModRule#edit(String name, EventType eventType, boolean enabled)
  • Removed method ClientException#isRetryContextStatusCode
  • Removed deprecated method Message#suppressEmbeds
  • Removed deprecated method RestGuild#modifyOwnNickname
  • Removed deprecated method ChannelService#suppressEmbeds
  • Removed com.iwebpp.crypto classes
  • Removed class BaseCategorizableChannel
  • Removed class BaseGuildChannel
  • Removed class BaseGuildMessageChannel
  • Removed class BaseMessageChannel
  • Removed class BaseTopLevelGuildMessageChannel
  • Removed deprecated field Routes#MESSAGE_SUPPRESS_EMBEDS
  • Removed deprecated field Routes#NICKNAME_MODIFY_OWN

Deprecations

  • Deprecated method IntegrationApplication#getSummary
  • Deprecated method Guild#getFeatures (use Guild#getGuildFeatures)
  • Deprecated method ApplicationInfo#isPublic (use ApplicationInfo#isBotPublic)
  • Deprecated method ApplicationInfo#requireCodeGrant (use ApplicationInfo#botRequiresCodeGrant)
  • Deprecated method ResolvedMember#getNicknameMention (This type of ping has been deprecated in the Discord API)

Other changes

  • Using an AutoModRuleEditMono or AutoModRuleEditSpec no longer requires all fields to be set
  • Remove Reactor dependency as it is unused in this repo, replaced reactor.util.annotation.* with javax.annotation.* from jsr305
  • Move classes in the encoding module to their own package (discord4j.discordjson.encoding) due to package name clashing with api module (issue when linking both modules in a project declaring a module-info.java)

Internal validation when retrieving restricted data in Messages

Calling any method that retrieves restricted data (message content, embeds, etc.) without enabling the MESSAGE_CONTENT will raise an UnsupportedOperationException.

Make sure to enable the MESSAGE_CONTENT intent in the developer portal and in the client initialization.

info

For more information you can check the discord docs.

New Emoji structure

The ReactionEmoji class has been replaced by the Emoji class to handle the new emoji structure. An emoji with an id is now a CustomEmoji, and can be one of two types:

  • GuildEmoji, for emojis created in a guild
  • ApplicationEmoji, for emojis created in an application via the api or the developer portal
note

Check more details about the API and behavior changes in What's new in v3.3.