開発したDiscordBotが起動しているのに返信がないのは権限設定をしていないからかも

当時のversion

"discord.js": "11.5.1"

起こったこと

会社で使用しているDiscordボットが動かなくなった。最後に動いていたのを確認したのは2022年6月ごろである。

正しくは特定の文字に反応するはずのDiscordボットが何も返信しなくなった。

権限回りに変更があった

どうもDiscordのボットについて権限回りの変更があったようだ。2022/8/31からmessage contentを取得するには権限を追加しないといけない。

support-dev.discord.com

また、この変更に対応するにはdiscord.jsをver13以降にしないといけない。そしてそのためにはNodeのVersionを16以上にしないといけない。typescriptのversionにも注意する必要がありそうだ。

権限の変更

ここで変更する。 discord.com

該当するアプリケーションを選びbotをクリックする。Privileged Gateway Intentsの項目にあるラジオボタンのうち、MESSAGE CONTENT INTENTをONにした。

コードの修正

ver13になる過程でClientクラスを作るときのコンストラクタにoptionが必要になったっぽい。また、イベントリスナとしてmessageだったものがmessageCreateになったのも変更点になる。

  const client = new Discord.Client({
    // この辺りが追加された要素。必要そうな権限だけを選んだ(と思う)ので、適宜変更してほしい
    intents: [
      GatewayIntentBits.MessageContent,
      GatewayIntentBits.GuildMessages,
      GatewayIntentBits.Guilds,
    ],
  });
  client.on("ready", (cli) => {
    console.log("ready");
  });
  // ここのmessageイベントからmessageClientイベントに変更。型もついているのでVersionを上げたらわかると思う。
  // client.on("message", (msg) => {
  client.on("messageCreate", (msg) => {
    if (msg.content === "ping") {
      msg.reply("pong");
    }
  });
  await client.login("login");

こっちも要確認

可能ならスラッシュコマンドに変更することも検討したほうがよさそうだ。

support-dev.discord.com