v13の主な変更箇所
Webpackビルドはサポートされない。
API v9に接続する。
音声関連
discord.js本体からdiscordjs/voiceへ分割された
よく使われるメソッドやオプションについて
Client
new Client(options)
messageイベントが非推奨に
messageCreateイベントを代わりに使用する
code:diff
- client.on("message", message => { /*do stuff*/ })
+ client.on("messageCreate", message => { /*do stuff*/ })
現時点では一回だけ警告が出力される
また、DMでのメッセージの受信にはCHANNELpartialの指定が必要になった タイマー関連のメソッド(Client#setTimeout, Client#setIntervalなど)が削除
application
code:diff
- const application = await client.fetchApplication();
+ const application = client.application;
+ // const application = await client.application.fetch();
ClientOptions
ClientOptions#disableMentions
ClientOptions#allowedMentionsに置き換えられた
ClientOptions#fetchAllMembers
廃止
ClientOptions#messageEditHistoryMaxSize
編集履歴の保存を行う機能は廃止
***ID
***Idに置き換えられた。
code:diff
- console.log(guild.ownerID);
+ console.log(guild.ownerId);
- console.log(message.webhookID);
+ console.log(message.webhookId);
send/edit
1引数しか取らなくなった。
code:diff
- channel.send('content', { embed: new MessageEmbed().setDescription("desc") });
stringは依然としてそのまま送れる
code:js
channel.send('hello!');
MessageEmbed/MessageAttachmentのインスタンスもしくはその配列を直接取らなくなった。
code:diff
- channel.send(new MessageEmbed().setDescription("desc"));
MessageOptions#embed
MessageOptions#embedsに置き換えられた。
Discord APIが通常のメッセージの送信においても複数のembedを送信することに対応したため。
code:diff
- channel.send({ embed: { description: "desc" } });
MessageOptions#codeおよび、MessageOptions#splitは削除
今後は、Foramtters.codeBlockおよび、Util.splitを使用する
StringResolvable
StringResolvableはなくなり、今までStringResolvableを受け取っていたものは単なるstringのみを受け取るようになる。
code:diff
- new MessageEmbed().setDescription(new Date());
+ new MessageEmbed().setDescription(String(new Date()));
- new MessageEmbed().setDescription(guild.description);//nullの場合にnullという文字列が送信されていた
// エラーになるため適当な代替テキストを用意する
+ new MessageEmbed().setDescription(guild.description ?? "altanative text");
// 存在する場合のみ設定する
+ const embed = new MessageEmbed();
+ if(guild.description != null) embed.setDescription(guild.description);
MessageEmbed#attachFiles、MessageEmbed#files
削除
code:diff
- channel.send(embed);
+ const embed = new Discord.MessageEmbed().setTitle('Attachments');
Reply関連
Message#reply
いままでこれはメッセージを作成したユーザーへのメンションを含むメッセージを作成する振る舞いをしていたが、Discordの返信機能を使用するようになる。 MessageOptions#reply
code:diff
- channel.send('content', { reply: '123456789012345678' }); // User ID
+ channel.send({ content: 'content', reply: { messageReference: '765432109876543219' }}); // Message ID or MessageResolvable
MessageOptions#allowedMentions.repliedUser
MessageOptions#allowedMentions.repliedUserオプションにより、Reply先のメッセージの作成者にメンションをするか指定できる。
code:diff
- message.reply('content');
+ message.reply({ content: 'content', allowedMentions: { repliedUser: false }});
Chennel#type
Discord APIの名前と同じ名前に変更された。
code:diff
// news channel
- channel.type === 'news'
+ channel.type === 'GUILD_NEWS'
// text channel
- channel.type === 'text'
+ channel.type === 'GUILD_TEXT'
// direct mail
- channel.type === 'dm'
+ channel.type === 'DM'
// voice channel
- channel.type === 'voice'
+ channel.type === 'GUILD_VOICE'
Intents
ALL、PRIVILEGED、NON_PRIVILEGEDは削除
使うIntentsを個別に列挙しなければならない
Object.values(Intents.FLAGS)とすることで、ALLを再現できる
typing関連
Channel#startTyping、stopTyping等は削除
sendTypingが追加されたがこれは一度だけAPIにtypingを送るもので、startTypingを直接置き換えるものではない。
この変更で140MB/100万チャンネルだけ軽くなったらしい
Guild
Guild#member()
直接cacheから取得するよう改められた。
code:diff
- guild.member(user);
+ guild.members.cache.get(user.id);
+ // guild.members.resolve(user);
Guild#voice
meを経由するよう改められた
code:diff
- guild.voice
+ guild.me.voice
Guild#owner
Guild#fetchOwner()で置き換えられる
あるいはownerIdを用いることもできる
code:diff
- guild.owner;
+ await guild.fetchOwner();
+ guild.fetchOwner().then(owner => { /* do stuff */ });
code:diff
- guild.owner.id
- guild.ownerID
+ guild.ownerId
Guild#fetchInvites()
Guild#invitesのfetchメソッドになる
これに伴いGuildInviteManagerというものが追加された
Guild#fetchBans()
Guild#bansのfetchメソッドになる
Guild#bansにはキャッシュもあるが、fetchしないと空のコレクションが返ってきたsuzuneu.icon
GuildMember
GuildMember#hasPermission
削除
DMChannel
DMでのメッセージを受け取るためにはCHANNEL partialが必ず必要になる。
discord apiはv8以降では、DMについてchannelCreateイベントを送信しない。
そのためキャッシュが作られない
Message/ MessageManager
Message#delete
timeoutオプションは削除される
代わりにグローバルなsetTimeout()を使う
code:diff
- const m = await message.channel.send("5秒後に削除されます");
- m.delete({ timeout: 5000 });
+ const m = await message.channel.send("5秒後に削除されます");
+ setTimeout(() => m.delete(), 5000);
Collector/awaitXXX関連
1つの引数を取るように変更された。
code:diff
- const collector = message.createReactionCollector(filter, { time: 15000 });
+ const collector = message.createReactionCollector({ filter, time: 15000 });
- message.channel.awaitMessages(msg => !msg.author.bot, { max: 1, time: 15000});
+ message.channel.awaitMessages({ filter: msg => !msg.author.bot, max: 1, time: 15000})
maxで指定した条件を達成できなかった場合、エラーを出力するようにもできるようになった?
Message#awaitReactions()は例外みたいsuzuneu.icon
この記述自体違くない?tig.icon
code:diff
- message.channel.awaitMessages(msg => !msg.author.bot, { max: 1, time: 15000})
- .then(collected => {
- if (!collected.size) return message.reply("何も送信されませんでした");
- message.reply("あなたは" + collected.first().content + "を送信しました");
- });
+ message.channel.awaitMessages({ filter: msg => !msg.author.bot, max: 1, time: 15000})
+ .then(collected => {
+ message.reply("あなたは" + collected.first().content + "を送信しました");
+ })
+ .catch(collected => {
+ message.reply("何も送信されませんでした");
+ });
User
User#locale
OAuth2を使用してユーザーの認可を得ない限りlocaleの取得は不可能になった。 そのため、このフィールドは削除される。
User#presence
廃止
代わりに以前もあったGuildMember#presenceを使用することになる
Snowflake
SnowflakeUtilを使用する。
エクスポートされなくなる
これまでもドキュメント上では存在しなかったものの実際には利用できた
ts/jsdocユーザーへ
型としてのSnowflakeはエクスポートされています。
型がstringからSnowflakeへ変更されている部分がかなりあります。
Structures
削除
フレームワークに対してはインパクトの大きい変更
なんか消さないように揉めてたけどまぁ筋の悪い機能だったし仕方ないtig.icon
Activity
Activity#type
CUSTOM_STATUSがCUSTOMに変更された
majorではないけど言及する価値があると思われるもの
Instance#fetch系のメソッドがデフォルトでDiscord APIへリクエストを行うようになる
対象はChannel、DMChannel、GuildBan、GuildMember、User、Messageでマネージャーは対象とはなっていない
こういうものをminorで出すのは正直どうかと思うtig.icon
コードの変更ではないもの
discord.js自体ではないもの
Collection
Collection#array()
廃止
Collection#toJSON()
廃止