discord.js v14へのアップデート

2023/08/18に公開

2022/07/18, Discord.js v14がリリースされました。
いつも通り破壊的変更がいっぱいなので、そのまま yarn upgrade しても動きません。注意しましょう。

変更内容

変更内容は公式リポジトリの CHANGELOG を確認してください。(メジャーアップデートなので膨大です)

始める前に

Discord.js は Node.js v16.9以上を要求します。

ターミナルにて node -v を実行して今自分がどのNodeを使用しているかを確認し、 v16.9以下だったらアップデートを行いましょう。

image.png


Builderがdiscord.js v14と統合された

スラッシュコマンドなどの登録に使用した @discordjs/builder はdiscord.js v14に統合されました。もし、単体の @discordjs/builder がプロジェクトにある場合はパッケージ名の衝突を回避するため、パッケージをアンインストールしましょう。

image.png

## npm
npm uninstall @discordjs/builders

## yarn
yarn remove @discordjs/builders

## pnpm
pnpm remove @discordjs/builders

破壊的変更

API バージョン

discord.js v14はDiscord API v10に切り替わっています。

列挙型値

enumパラメータに文字列または数値型を受け入れていた全ての領域は排他的に数値を受け入れるようになっています。

discord.js v13以下でエクスポートされるenumは discord-api-types の新しいenumに置き換わります。

新しいenumの違い

discord.jsのenumとdiscord-api-typesの違いは次の通り

  1. 列挙型は単数形で表現されるようになります。つまり ApplicationCommandOptionTypesApplicationCommandOptionType となります。
  2. Message の接頭辞を持つ列挙型はMessageの列挙型を持たなくなりました。つまり MessageButtonStylesButtonStyle となります。
  3. Enumの値は SCREAMING_SNAKE_CASE ではなく PascalCase になっています。つまり CHAT_INPUTChatInput となります。

一般的な列挙型の破壊

クライアント初期化、JSONスラッシュコマンド、JSONメッセージコンポーネントなどの領域はこれらの変更に対応するため、修正が必要になる可能性があります。

クライアントの初期化

- const { Client, Intents } = require('discord.js');
+ const { Client, GatewayIntentBits, Partials } = require('discord.js');

- const client = new Client({ intents: [Intents.FLAGS.GUILDS], partials: ['CHANNEL'] });
+ const client = new Client({ intents: [GatewayIntentBits.Guilds], partials: [Partials.Channel] });

(Intentの指定に新たに GatewayIntentBits が参加しています。)

アプリケーションコマンドのデータ変更

+ const { ApplicationCommandType, ApplicationCommandOptionType } = require('discord.js');

const command = {
  name: 'ping',
- type: 'CHAT_INPUT',
+ type: ApplicationCommandType.ChatInput,
  options: [
    name: 'option',
    description: 'A sample option',
-   type: 'STRING',
+   type: ApplicationCommandOptionType.String,
  ],
};

メッセージボタンのデータ変更

+ const { ButtonStyle } = require('discord.js');

const button = {
  label: 'test',
- style: 'PRIMARY',
+ style: ButtonStyle.Primary,
  customId: '1234'
}

メソッドベースの型保護の削除

Channel

いくつかのチャンネルタイプガードメソッドは一つのチャンネルタイプを絞り込むように削除されました。

かわりにチャンネルを絞り込むためにタイププロパティーを ChannelType と比較します。

-channel.isText()
+channel.type === ChannelType.GuildText

-channel.isVoice()
+channel.type === ChannelType.GuildVoice

-channel.isDM()
+channel.type === ChannelType.DM

Interaction

チャンネルと同様にいくつかインタラクションタイプガードが削除されました。

-interaction.isCommand();
+interaction.type === InteractionType.ApplicationCommand;

-interaction.isAutocomplete();
+interaction.type === InteractionType.ApplicationCommandAutocomplete;

-interaction.isMessageComponent();
+interaction.type === InteractionType.MessageComponent;

-interaction.isModalSubmit();
+interaction.type === InteractionType.ModalSubmit;

Builder

ビルダーは以前のようにDiscord APIから返されなくなりました。

例えばDiscord APIに EmbedBuilder を送るとDiscord APIから同じデータのEmbedが帰ってきます。これは受け取ったコンポーネントなどの構造をコードで処理する方法に影響を与えます。

create(), edit() パラメータの統合

マネージャーやオブジェクトの様々な create(), edit() メソッドのパラメータが統合されました。

  • Guild#edit() のデータ・パラメーターに reason が追加されました。
  • GuildChannel#edit() のデータ・パラメータに reason が追加されました。
  • GuildEmoji#edit() のデータパラメータに reason が追加されました。
  • Role#edit() がデータパラメータに reason が追加されました。
  • Sticker#edit() がデータパラメータに reason が追加されました。
  • ThreadChannel#edit() がデータパラメータ reason が追加されました。
  • GuildChannelManager#create() でオプションパラメータに name を指定するように変更
  • GuildChannelManager#createWebhook() (およびその他のテキストベースのチャネル) はオプションパラメータにチャネルと名前を取るようになった。
  • GuildChannelManager#edit() がデータの一部として reason を受け取るようになった。
  • GuildEmojiManager#edit() はデータの一部として reason を受け取るようになりました。
  • GuildManager#create() でオプションの一部として name を受け取るように変更
  • GuildMemberManager#edit()reason をデータの一部として受け取るように変更
  • GuildMember#edit()reason をデータの一部として受け取るように。
  • GuildStickerManager#edit() がデータの一部として reason を取るように。
  • RoleManager#edit() がオプションの一部として reason を取るようになった。
  • Webhook#edit() がオプションの一部として reason を取るようになった。
  • GuildEmojiManager#create() がオプションの一部として添付ファイルと名前を取るようになった。
  • GuildStickerManager#create() がオプションの一部としてファイル、名前、タグを取るようになりました。

Activity

以下のプロパティーはDiscord Developer Documentationに記載されていないため、削除されました。

  • Activity#id
  • Activity#platform
  • Activity#sessionId
  • Activity#syncId

Application

Application#fetchAssets() は、Discord APIでサポートされなくなったため、削除されました。

BitField

BitField 構成要素に BitField サフィックスが追加され、enumとの命名衝突を回避できるようになりました。

- new Permissions()
+ new PermissionsBitField()

- new MessageFlags()
+ new MessageFlagsBitField()

- new ThreadMemberFlags()
+ new ThreadMemberFlagsBitField()

- new UserFlags()
+ new UserFlagsBitField()

- new SystemChannelFlags()
+ new SystemChannelFlagsBitField()

- new ApplicationFlags()
+ new ApplicationFlagsBitField()

- new Intents()
+ new IntentsBitField()

- new ActivityFlags()
+ new ActivityFlagsBitField()
  • #FLAGS#Flags に名称変更されました。

CDN

CDNのURLを返すメソッドは動的な画像のURLを返すようになりました。(利用可能な場合のみ)

この動作は ImageURLOptions パラメータで forceStatictrue に設定することでオーバーライドできます。

CategoryChannel

CategoryChannel#children はカテゴリーが含むチャンネルのCollectionではなくなりました。

v14からはManagerとなります。(CategoryChannelChildManager)

これは、 CategoryChannel#createChannel()CategoryChannelChildManager に移動したことも意味します。

Channel

以下のタイプガードが削除されました。

  • Channel#isText()
  • Channel#isVoice()
  • Channel#isDirectory()
  • Channel#isDM()
  • Channel#isGroupDM()
  • Channel#isCategory()
  • Channel#isNews()

CommandInteractionOptionResolver

CommandInteractionOptionResolver#getMember()required (必須)のパラメータを持たなくなりました。

詳細は以下のプルリクエストを確認してください。

discordjs/discord.js - refactor: remove required from getMember #7188

Constants

  • 多くの定数オブジェクトやキー配列がトップレベルのエクスポートになりました。
- const { Constants } = require('discord.js');
- const { Colors } = Constants;
+ const { Colors } = require('discord.js');
  • リファクタリングされた定数構造体は、SCREAMING_SNAKE_CASE のメンバ名ではなく、PascalCase のメンバ名を持っています。
  • エクスポートされた定数構造体の多くが置換され、名前が変更されました。
- Opcodes
+ GatewayOpcodes

- WSEvents
+ GatewayDispatchEvents

- WSCodes
+ GatewayCloseCodes

- InviteScopes
+ OAuth2Scopes

Event

(not GuildEvents.)

  • message, interaction イベントは削除されました。今後は messageCreate, interactionCreate イベントを使用しましょう。
  • applicationCommandCreate, applicationCommandDelete, applicationCommandUpdate は、すべて削除されました。

GuildBanManager

ユーザーをBANする際の日数オプションは、Discord APIに合わせ、 deleteMessageDays に名称が変更されました。

Guild

  • Guild#setRolePositions()Guild#setChannelPositions() が削除されました。
    • RoleManager#setPositions()GuildChannelManager#setPositions() をそれぞれ使用してください。
  • Guild#maximumPresences のデフォルト値が 25,000 でなくなりました。
  • Guild#meGuildMemberManager#me に移動されました。

GuildAuditLogs & GuildAuditLogsEntry

  • GuildAuditLogs.build() は廃止されたと判断されたため、削除されました。
  • 以下のプロパティとメソッドは、GuildAuditLogsEntry クラスに移動されました。
    • GuildAuditLogs.Targets
    • GuildAuditLogs.actionType()
    • GuildAuditLogs.targetType()

GuildMember

GuildMember#pendingnull に指定できるようになり、ギルドメンバーが部分的であることを考慮するようになりました。

詳しくは以下のIssueを確認してください。

discordjs/discord.js - Misleading GuildMember#pending boolean on partial guild members #6546

IntegrationApplication

IntegrationApplication#summary は、APIでサポートされなくなったため削除されました。

Interaction

以下のタイプガードは削除されました。

- interaction.isCommand()
- interaction.isContextMenu()
- interaction.isAutocomplete()
- interaction.isModalSubmit()
- interaction.isMessageComponent()

また、インタラクションに応答する際、ギルドがキャッシュされていないとAPI Messageが返されることがありましたが、インタラクションの返信は常にdiscord.jsのMessageオブジェクトが返るようになりました。

Invite

Invite#channelInvite#inviter がゲッターになり、キャッシュから構造体を解決するようになった

MessageComponent

  • MessageComponents の名前も変更されました。Message という接頭辞はなくなり、Builder という接尾辞がつくようになりました。
- const button = new MessageButton();
+ const button = new ButtonBuilder();

- const selectMenu = new MessageSelectMenu();
+ const selectMenu = new SelectMenuBuilder();

- const actionRow = new MessageActionRow();
+ const actionRow = new ActionRowBuilder();

- const textInput = new TextInputComponent();
+ const textInput = new TextInputBuilder();
  • APIから受け取ったコンポーネントは直接改変させることは出来ません。APIからコンポーネントを改変させたい場合は ComponentBuilder#from を使用します。例えばボタンを Mutable にしたい場合は以下のような変更を行います。
- const editedButton = receivedButton
-   .setDisabled(true);

+ const { ButtonBuilder } = require('discord.js');
+ const editedButton = ButtonBuilder.from(receivedButton)
+   .setDisabled(true);

MesssageManager

MessageManager#fetch() の第2パラメータが削除されました。

第2パラメータであった BaseFetchOptions は最初のパラメーターに統合されています。

- messageManager.fetch('1234567890', { cache: false, force: true });
+ messageManager.fetch({ message: '1234567890', cache: false, force: true });

MessageSelectMenu

  • MessageSelectMenuSelectMenuBuilder に名称変更されました。
  • SelectMenuBuilder#addOption() が削除されました。
    • 代替として SelectMenuBuilder#addOptions() を使います。

MessageEmbed

  • MessageEmbedEmbedBuilder に名称変更されました。
  • EmbedBuilder#setAuthor() は、単独の EmbedAuthorOptions オブジェクトを受け入れるようになりました。
  • EmbedBuilder#setFooter() は、新しい唯一の FooterOptions を受け入れるようになりました。
  • EmbedBuilder#addField() が削除されました。
    • 代替として EmbedBuilder#addFields() を使います。
- new MessageEmbed().addField('Inline field title', 'Some value here', true);

+ new EmbedBuilder().addFields([
+  { name: 'one', value: 'one' },
+  { name: 'two', value: 'two' },
+]);
Example
const { Client, Intents, EmbedBuilder } = require("discord.js");

const client = new Client({ intents: [ Intents.Flags.GUILDS ] });

const embed = new EmbedBuilder()
    .setTitle('Test')
    .setDescription('Test')
    .setColor('#0099ff')

client.on('messageCreate', (message) => {
    message.reply({ embeds: [embed] })
})

client.login('token');

PartialTypes

PartialTypes 文字列配列は削除されました。代わりに Partials 列挙型を使用します。

これに加えて、新しいパーシャル Partials.ThreadMember が追加されました。

PermissionOverwritesManager

上書きは SCREAMING_SNAKE_CASE パーミッションキーではなく、PascalCase パーミッションキーで行われるようになりました。

REST Events

以下のイベントは Client から削除されました。

  • apiRequest
  • apiResponse
  • invalidRequestWarning
  • rateLimit

これらのイベントには,Client#rest からアクセスする必要があります。

また、これらの apiRequest, apiResponse, rateLimit のイベント名が変更されています。

- client.on('apiRequest', ...);
+ client.rest.on('request', ...);

- client.on('apiResponse', ...);
+ client.rest.on('response', ...);

- client.on('rateLimit', ...);
+ client.rest.on('rateLimited', ...);

RoleManager

Role.comparePositions() が削除されました。代わりに
RoleManager#comparePositions() を使ってください。

Sticker

Sticker#tags は null 可能な文字列 (string | null) になりました。

discordjs/discord.js - refact: Sticker's tags property #8010

ThreadChannel

ThreadAutoArchiveDuration で使われていた MAX ヘルパーは削除されました。

ThreadMemberManager

  • ThreadMemberManager#fetch() の第二パラメータが削除された。かつて第2パラメータであった BaseFetchOptions は、現在、第1パラメータに統合されています。
  • キャッシュを指定するための boolean ヘルパーが削除されました。
// The second parameter is merged into the first parameter.
- threadMemberManager.fetch('1234567890', { cache: false, force: true });
+ threadMemberManager.fetch({ member: '1234567890', cache: false, force: true });

// The lone boolean has been removed. One must be explicit here.
- threadMemberManager.fetch(false);
+ threadMemberManager.fetch({ cache: false });

Util

  • Util.removeMentions() は削除されました。メンションを制御するには、代わりに MessageOptionsallowedMentions を使う必要があります。
  • Util.splitMessage() は削除されました。
  • Util.resolveAutoArchiveMaxLimit() は削除されました。

.deleted Field(s)

.deleted Field(s) が削除されました。

deleted プロパティは、構造体が削除されたかどうかを確認するために使用できなくなります。

詳細については、このIssueを参照してください。

discordjs/discord.js - Removal of .deleted in structures #7091

VoiceChannel

VoiceChannel#editable は削除されました。代わりに GuildChannel#manageable を使ってください。

類似の列挙型の多くは discord-api-types のドキュメントで見ることができます

VoiceRegion

VoiceRegion#vip は削除されました。(Discord APIから削除されたため)

Webhook

Webhook#fetchMessage() は、WebhookFetchMessageOptions タイプの唯一のオブジェクトを受け取るようになりました。

Features

AutocompleteInteraction

呼び出されたアプリケーションコマンドが登録されているギルドのIDである AutocompleteInteraction#commandGuildId が追加されました。

Channel

  • ストアチャンネルは削除されました。(Discord APIから削除されたため)
  • Channel#url が追加され、クライアントと同じようにチャンネルへのリンクになりました。
  • 新しいタイプガードも追加されました。
    • Channel#isDMBased()
    • Channel#isTextBased()
    • Channel#isVoiceBased()

Collection

  • Collection#merge(), Collection#combineEntries() を追加されました。。
  • イミュータブルコレクションを示すReadonlyCollectionが追加されました。

Collector

コレクターによって収集されない要素があるときに発行される新しい ignore イベントが追加されました。

CommandInteraction

呼び出されたアプリケーションコマンドが登録されているギルドの ID である CommandInteraction#commandGuildId が追加されました。

Guild

ギルドのMFAレベル(管理レベル)を設定する Guild#setMFALevel() が追加されました。

client.on('guildCreate', (guild) => {
    guild.setMFALevel(0, 'not request 2fa')
    guild.setMFALevel(1, 'request 2fa')
})

GuildChannelManager

チャンネル作成時に videoQualityMode を使用して、カメラのビデオ品質モードを初期設定することができます。

GuildMemberManager

GuildMemberManager#fetchMe() が追加され、ギルド内のクライアントユーザーを取得するようになりました。

GuildEmojiManager

既存のギルド絵文字を管理するために GuildEmojiManager#delete()GuildEmojiManager#edit() が追加されました。

Interaction

与えられたインタラクションに返信できるかどうかを確認できる Interaction#isRepliable() が追加されました。

client.on('interactionCreate', async (interaction) => {
    interaction.isRepliable()
})

MessageReaction

クラスが属するリアクションでクライアントユーザーを反応できるように MessageReaction#react() を追加されました、

Unsafe Builders

Unsafe ビルダーは、入力のバリデーションを行わないことを除いて、通常のビルダーと全く同じように動作します。Unsafe ビルダーは、通常のビルダーに Unsafe というプレフィックスを付けることで命名されます。

Webhook

Webhook#applicationId を追加しました。

GitHubで編集を提案

Discussion