ボットの中にはユーザーのメッセージに反応するものもありますが、プライバシー上の懸念が生じますので、よく検討した上で採用してください。

ユーザーメッセージを解析することによって、特定の処理を実行することは、柔軟性がある機能を提供することができますが、ユーザーの入力には個人情報や機密情報が含まれる可能性があるため、その取扱いに対しては慎重になる必要があります。

そのため、万が一メッセージの取扱いに不備があり、重要な情報が流出した際には、開発者の責任が問われかねない事態となります。

ユーザーメッセージに反応することの是非について

Discordではユーザーのメッセージを読み取ることに対して懸念を示しています。メッセージのプライバシーが守られることが前提であり、メッセージの読み取りはボットのコア機能として必要なときに限られるべきとしています。

つまり、ユーザーのメッセージを読み取るようなボットを作成したときは、プライバシーポリシーでその目的とメッセージの管理について、ユーザーに明示しなければなりません。

スラッシュコマンドの実装を検討してください

スラッシュコマンドはユーザー実装のコマンドとは異なり、Discordに統合されており、入力値の検証や説明文の表示といった支援を受けられます。また、コマンド実行時に入力したデータしか取得されることはなく、権限も要求しないので、プライバシー保護の観点からも推奨されています。

ボットに権限を追加する

ユーザーのメッセージに反応するにはDiscordの開発ダッシュボードで追加の設定が必要です。

  1. ダッシュボード上でアプリケーションを選択します。
  2. Installationのページを開いて、Guild Install の項目のSCOPEに bot を追加します。
  3. Botのページを開いて、Message Content Indent」のスイッチをONにします。
  4. すでにボットを導入している場合には、サーバーのApp連携から一度連携を解除してから再度ボットをサーバーに導入します。
  5. 次にコード上でClientオブジェクトを作成する際の intents を次のように変更します。
const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent
    ]
})

発言を受け取る

誰かが発言したときにメッセージを受信するためには、そのためのイベントハンドラを追加します。

client.on(Events.MessageCreate, async message => {
    if (message.author.bot || message.author.system) {
        // ボットとシステムメッセージは無視する
        return
    }
    await message.channel.send(`${message.author} 「${message.content}」って言いました?`)
})

必ずボットのメッセージは無視するようにしてください。でないと、自分自身のメッセージやほかのボットのメッセージに反応して、無限にメッセージが投稿され続けてしまい、サーバー参加者に対して非常に迷惑がかかります。

ボットに応答(≠ 反応)することは絶対にやめてください!

これはDiscordに限った話ではなく、あらゆるアプリケーションで開発者が守るべきルールです。古くはFrequently Asked Questions about IRC bot, Internet Relay Chat roBOTs1で説明されているように、ボットの発言の応酬にならないようにしてください。

第8回 法律を遵守する

Footnotes

  1. IRC: Discordの登場以前から存在するテキストベースのチャットシステムのこと