スラッシュコマンドへのシンプルな返答、じゃんけん、ダイス、ガチャ機能を備えたDiscordボットです
- Discordアカウント
- Cloudflareアカウント
- Node.jsのインストール
- wranglerのインストール
- ローカル環境で動作確認する場合、cloudflaredのインストール
- 1.1 Discordボット用のアプリケーションの作成・ボットのサーバーへ追加
- 公式ドキュメントの
Creating an app on Discord、Adding bot permissionsに従い、ボット用のアプリケーションを作成、ボットをサーバーへ追加する
- 公式ドキュメントの
- 1.2
.dev.varsにsecrets(機密情報)を保存- 1.2.1 プロジェクトのルート(
package.jsonや.gitignoreと同じ階層)に.dev.varsという名前のファイルを作成 - 1.2.2
.dev.varsに以下の形式でsecretsを保存
- 1.2.1 プロジェクトのルート(
DISCORD_TOKEN="{手順1.1で取得したトークン}"
DISCORD_PUBLIC_KEY="{手順1.1で取得したパブリックキー}"
DISCORD_APPLICATION_ID="{手順1.1で取得したアプリケーションID}"例:
DISCORD_TOKEN="YBNJRT3brLJM_VLiGkT46QkJDxhxu.YKVpl6R2Lc01_pVOgJhMVxF6KK0ext"
DISCORD_PUBLIC_KEY="8ad013a56d5b1225675dad1a6ecc72ed2c8788465e4fa3bb8555e"
DISCORD_APPLICATION_ID="141320486770036847239"- 2.1 依存関係のインストールのため、以下のコマンドを実行 (初回のみ)
npm install
- 2.2 サーバーを起動
npm run start
- 2.3 HTTPトンネルを起動
- ローカルで動いているボットサーバーにDiscordからアクセスできるようにするため、HTTPトンネルを使用
- 2.2とは別のシェルで
npm run tunnelを実行 - 表示されるURLをコピーしておく
- 2.4 DiscordアプリケーションにURLを登録
- 2.4.1 My Applications | Discord Developer Portalから、1.1で作成したアプリケーションを選択
- 2.4.2
Interactions Endpoint URLに2.3で表示されたURLをコピペする Save Changesを押し、URLが正常に保存され、緑色でAll your edits have been carefully recorded.と表示されることを確認
- 2.5 Discordでスラッシュコマンドなどを使用し、ボットが正常に動作することを確認
- 参考: 公式ドキュメント
- 3.1 wranglerでDiscordのsecretsを保存
- 1.1で取得したトークン、パブリックキー、アプリケーションIDをそれぞれ以下のコマンドでwranglerに登録
- (
wranglerの初回実行時はブラウザを使った認証が行われる)- トークン:
wrangler secret put DISCORD_TOKEN - パブリックキー:
wrangler secret put DISCORD_PUBLIC_KEY - アプリケーションID:
wrangler secret put DISCORD_APPLICATION_ID
- トークン:
- 参考: 公式ドキュメント
- 3.2 Discordへのスラッシュコマンドの登録とCloudflare Workersへのデプロイ
- 以下のコマンドを実行
npm run deploy:full- Workersを新規作成するか問われるため、作成を承認する (初回のみ)
- 以下のコマンドを実行
- 3.3 表示されたURL(
https://{Worker名}.{アカウント名}.workers.devという形式)を、2.4の手順でDiscordアプリケーションに登録 (初回のみ) - 3.4 Discordでスラッシュコマンドなどを使用し、ボットが正常に動作することを確認
- 参考: 公式ドキュメント
-
4.1 Cloudflare Account ID の取得
- 公式ドキュメント に従う
- 取得したIDは安全な場所に保存
- 公式ドキュメント に従う
-
4.2 APIトークンの取得
- 4.2.1 API Tokens | Cloudflare dashboard から、
Create Token→Create Custom Token - 4.2.2 適当な
Token nameを入力 (例:zirconia-github-actions) - 4.2.3
Permissionsを設定Account - Workers Scripts - Edit
- 4.2.4 トークンを生成
Continue to summary→Create Token
- 4.2.5 トークンをコピーし、安全な場所に保存
- 参考: Create API token · Cloudflare Fundamentals docs
- 4.2.1 API Tokens | Cloudflare dashboard から、
-
4.3 GitHubレポジトリにSecretsを登録
- 4.3.1 ブラウザでGitHubリポジトリを開く
- 4.3.2
Settings→Security and qualityカテゴリのSecrets and variables→Actionsに移動 - 4.3.3
Repository secretを作成- 4.3.3.1 Cloudflare Account ID
- Name:
CF_ACCOUNT_ID - Secret: 4.1で取得したCloudflare Account ID
- Name:
- 4.3.3.2 APIトークン
- Name:
CF_API_TOKEN - Secret: 4.2で取得したAPIトークン
- Name:
- 4.3.3.3 Discordトークン
- Name:
DISCORD_TOKEN - Secret:
.dev.varsのDISCORD_TOKENをコピペ
- Name:
- 4.3.3.4 DiscordアプリケーションID
- Name:
DISCORD_APPLICATION_ID - Secret:
.dev.varsのDISCORD_APPLICATION_IDをコピペ
- Name:
- 4.3.3.1 Cloudflare Account ID
-
4.4 GitHub Actionsを実行
- 4.4.1 GitHub Actionsによりワークフローが実行されることで、Cloudflare Workersにボットがデプロイされる
- 方法1: GitHubのmainブランチに新たなコミットをする
- (mainブランチへのコミットごとに、ワークフローが実行される)
- 方法2: ブラウザでGitHubリポジトリを開き、
Actionsから最新のワークフローを選択し、再実行(Re-run)をする
- 方法1: GitHubのmainブランチに新たなコミットをする
- 4.4.2 ワークフローが正常に実行されたかを確認
- ブラウザでGitHubリポジトリを開き、
Actionsから最新のワークフローが正常に完了しチェックマーク✔が付いているか確認
- ブラウザでGitHubリポジトリを開き、
- 4.4.1 GitHub Actionsによりワークフローが実行されることで、Cloudflare Workersにボットがデプロイされる
-
4.5 WorkerのURL(
https://{Worker名}.{アカウント名}.workers.devという形式)を、2.4の手順でDiscordアプリケーションに登録 -
4.6 Discordでスラッシュコマンドなどを使用し、ボットが正常に動作することを確認
-
参考: 公式ドキュメント
各機能の設定はsrc/config.jsで変更できます。各設定のenableをfalseにすると、その機能を無効化できます。
表示メッセージには、テキスト、配列、関数を指定できます。これらの値はgenerateMessage(formatter, props)で次のように処理されます。
| 指定する値 | 挙動 |
|---|---|
| テキスト | 指定したテキストをそのまま表示 |
| 配列 | 配列内の要素を1つランダムに選んで表示。要素にはテキスト、配列、関数を指定可能 |
| 関数 | メッセージ生成時の値を引数として受け取り、関数が返したテキストを表示 |
たとえば、固定メッセージはmessage: 'hallo'、ランダムなメッセージはmessage: ['表', '裏']のように設定します。関数を使うと、実行結果に応じたメッセージを生成できます。
message: ({ interaction }) => {
return `${interaction.member.user.username}さん、こんにちは`;
},ユーザーにメンションする場合は、Discordのメンション形式<@ユーザーID>を返します。コマンドを実行したユーザーにメンションする例は次のとおりです。
message: ({ interaction }) => {
return `こんにちは <@${interaction.member.user.id}>`;
},サーバーのカスタム絵文字やアプリケーションのカスタム絵文字は、Discordのカスタム絵文字形式<:絵文字名:絵文字ID>をメッセージに含めます。アニメーション絵文字の場合は<a:絵文字名:絵文字ID>です。
message: 'こんにちは <:icon:123456789012345678>',テキスト、配列、関数を指定できる設定項目は次のとおりです。
| 設定 | 対応する項目 |
|---|---|
SIMPLE_REPLY_CONFIG |
replies[].message |
JANKEN_CONFIG |
messages.start、messages.result、messages.draw、messages.botWin、messages.userWin、messages.notGameOwner、messages.invalidButton |
DICE_CONFIG |
messages.result、messages.invalidOption |
GACHA_CONFIG |
gachas[].choices[].message、messages.invalidWeight |
関数を指定した場合、項目ごとに次の値を引数のオブジェクトから参照できます。
| 対応する項目 | 参照できる値 |
|---|---|
SIMPLE_REPLY_CONFIG.replies[].message |
interaction |
JANKEN_CONFIG.messages.start、messages.invalidButton、messages.notGameOwner |
interaction |
JANKEN_CONFIG.messages.result、messages.draw、messages.botWin、messages.userWin |
userHand、botHand、interaction |
DICE_CONFIG.messages.result |
rolls、areRollsTruncated、total、diceCount、diceSides、rollsRaw、interaction |
DICE_CONFIG.messages.invalidOption |
interaction |
GACHA_CONFIG.gachas[].choices[].message |
interaction、gacha、drawnChoice |
GACHA_CONFIG.messages.invalidWeight |
interaction |
スラッシュコマンドに対して、固定メッセージまたはランダムなメッセージを返す機能の設定です。
| 項目 | 説明 |
|---|---|
| enable | 機能の有効・無効 |
| replies | コマンドと返答の定義 |
repliesの各要素には、以下の項目を設定します。
| 項目 | 説明 |
|---|---|
| name | コマンド名 |
| description | コマンドの説明 |
| message | 表示メッセージ。テキスト、配列、関数を指定可能 |
じゃんけん機能の設定です。
| 項目 | 説明 |
|---|---|
| enable | 機能の有効・無効 |
| commandName | コマンド名 |
| description | コマンドの説明 |
| hands | 手の定義 |
| messages | 表示メッセージ。各項目にはテキスト、配列、関数を指定可能 |
| maxRound | 最大ラウンド数 |
さいころ機能の設定です。
| 項目 | 説明 |
|---|---|
| enable | 機能の有効・無効 |
| commandName | コマンド名 |
| description | コマンドの説明 |
| countOption | さいころの個数を指定するオプション名 |
| countOptionDescription | さいころの個数を指定するオプションの説明 |
| maxDiceCount | 一度に振れるさいころの最大個数 |
| sidesOption | さいころの面数を指定するオプション名 |
| sidesOptionDescription | さいころの面数を指定するオプションの説明 |
| maxDiceSides | 指定できるさいころの最大面数 |
| maxVisibleRolls | メッセージに表示する出目の最大数 |
| messages | 表示メッセージ。各項目にはテキスト、配列、関数を指定可能 |
ガチャ機能の設定です。
| 項目 | 説明 |
|---|---|
| enable | 機能の有効・無効 |
| gachas | ガチャの定義 |
| messages | 表示メッセージ。各項目にはテキスト、配列、関数を指定可能 |
gachasの各要素には、以下の項目を設定します。
| 項目 | 説明 |
|---|---|
| name | コマンド名 |
| description | コマンドの説明 |
| choices | 抽選する選択肢の定義 |
choicesの各要素には、表示するmessageと抽選時の重みとなる正の整数weightを設定します。weightが大きいほど出やすくなります。例えばweight: 10はweight: 2の5倍出やすくなります。
messageにはテキスト、配列、関数を指定できます。
- Hosting a Reddit API Discord app on Cloudflare Workers - Documentation - Discord
- discord/cloudflare-sample-appの公式ドキュメント
- Cloudflare WorkersでDiscordボットを動かす手順について解説されている
- セットアップ手順はこのページの内容に沿って作成した
- discord/cloudflare-sample-app
- Cloudflare WorkersベースのDiscordボットのサンプル
- これをベースに開発
- exteoi/MiniPotato
- じゃんけん、ダイス、ガチャ機能の参考にしました