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.