スラッシュコマンドをDiscordに登録する
注意!
このページの内容は後に大きく書き換えられる可能性が高いです。
内容は後でまとめる。
Python上でって書いたけどPythonで実装する方法書くの忘れてた。
Python要素少ないし登録と実装を分けることにしたので
どんなことをすればいいのかは書いたので、それを元にrequestsモジュールをつけばいけるはず。
(詳細な方法はそのうちまとめる)
discord.pyはスラッシュコマンドに対応しないで開発中止してしまったので、スラッシュコマンドのソースに関しては自力で書く必要がある。 ギルドとはDiscordのサーバーのこと。Developer Portal内ではGuildと表記されている。
前提
アプリケーション詳細を開く。
General InformationからAPPLICATION IDをコピーしておく。
BotからTOKENをコピーしておく。
Botを自分のテストサーバーに加入させる。
OAuth2を開く。
SCOPESはbotとapplications.commandsを選択。BOT PERMISSIONSはBotの用途に合わせて適当に設定する。
https://scrapbox.io/files/615c78758fd62f001d726298.png
生成された招待リンクをコピーする。
ID>&permissions=515500265024&scope=bot%20applications.commands`
※ <APPLICATION ID>は自分のBotのもので置き換える。
※permissionの値はBot Permissionsを使って自分で生成したものでも可
https://scrapbox.io/files/614abda7d7f88a001d434495.png
未分類メモ
ヘッダーにAuthorizationの値Bot <BOT TOKEN>を設定しておく。
URLの頭はhttps://discord.com/api/v8で始まる。
例) グローバルコマンドの送信先: https://discord.com/api/v8/applications/<APP ID>/commands
Gateway v8を使用している(デフォルトはv6)
最新はv9らしい。
グローバルコマンド
作成
POST: /applications/<APP ID>/commands
編集
PATCH: /applications/<APP ID>/commands/<COMMAND ID>
削除
DELETE: /applications/<APP ID>/commands/<COMMAND ID>
204 No Contentが返ってくる。
登録した全コマンドの情報を取得
GET: /applications/<APP ID>/commands
全コマンドの上書き
PUT: /applications/<APP ID>/commands
ギルドコマンド
作成
POST: /applications/<APP ID>/guilds/<GUILD ID>/commands
編集
PATCH: /applications/<APP ID>/guilds/<GUILD ID>/commands/<COMMAND ID>
削除
POST: /applications/<APP ID>/guilds/<guild_id>/commands/<COMMAND ID>
取得
GET: /applications/<APP ID>/guilds/<GUILD ID>/commands
全上書き
PUT: /applications/<APP ID>/guilds/<GUILD ID>/commands
コマンドについて
コマンドの作成ルール
コマンドを作成するアプリ・タイプ・スコープのどれかが違えば同じ名前のコマンドでも作成できる。
逆に言うと、アプリ・タイプ・スコープ・名前、すべてが一致する場合はコマンドを作成できない。
(登録しようとすると上書きされる)
下は公式Document内で紹介されていた例
同じ名前のグローバルCHAT_INPUTコマンドは作成できない。
同じギルド内で同じ名前のギルドCHAT_INPUTコマンドは作成できない。
同じ名前のグローバルUSERコマンドは作成できない。
グローバルCHAT_INPUTコマンドとギルドCHAT_INPUTコマンドで同じ名前のコマンドは作成できる。
グローバルCHAT_INPUTコマンドとグローバルUSERコマンドで同じ名前のコマンドは作成できる。
他のアプリのコマンドと同じ名前でも作成可能。
コマンド名は正規表現[\w-]{1,32}$と一致する必要がある。
つまり、半角英数字(大文字小文字は問わない)と_と-しか使えない。
文字数も1~32文字に収める必要がある。
今見たら大文字も使えないっぽい(?)
コマンドの種類
ギルドコマンドでは各ギルドごとに総数上限がある。
table:command-types
名前 TYPE 総数 詳細
CHAT_INPUT 1 100 スラッシュコマンド。ユーザーが / を入力したときに表示されるテキストベースのコマンドのこと。
USER 2 5 ユーザーをタップまたは右クリックした時に表示されるUIベースのコマンドのこと。
MESSAGE 3 3 メッセージをタップまたは右クリックした時に表示されるUIベースのコマンドのこと。
コマンドのスコープ
グローバルコマンド
Botがいるすべてのサーバーが対象。
条件次第ではDMも対象(条件は知らない)。
作成が完了するまでに最大で1時間かかる。
ギルドコマンド
特定のギルドが対象。
作成後即座に有効になる。
ギルドごとに1日に200件まで作成できる。
コマンドオプション
コマンドにつける引数(パラメータ)のこと。
https://scrapbox.io/files/614abe5152f7ec00210327c7.png
コマンドオプションタイプ
table:command-option-types
名前 値 意味・仕様 選択肢フィールド
SUB_COMMAND 1 サブコマンド(下記参照) 不可
SUB_COMMAND_GROUP 2 サブコマンドグループ(下記参照) 不可
STRING 3 文字列 可
INTEGER 4 整数、範囲は -2^53 ~ 2^53 可
BOOLEAN 5 True または False のみ 不可
USER 6 チャンネル閲覧権限のある全ユーザー 不可
CHANNEL 7 全てのチャンネルタイプとカテゴリ 不可
ROLE 8 全ロール 不可
MENTIONABLE 9 閲覧権限のある全ユーザーと全ロール 不可
NUMBER 10 -2^53 ~ 2^53の倍精度浮動小数点 可
SUB_COMMANDとはこんな感じのやつ。
https://scrapbox.io/files/614ac44dd63c4b001dc36cb6.png
これは4つのコマンドをそれぞれ作っているのではなく、permissionsコマンドの中にuserとroleというSUB_COMMAND_GROUPを作成し、さらにそれぞれのGROUPの中にgetとeditというサブコマンドを作成している。
ちなみに、options配列の中にSUB_COMMANDかSUB_COMMAND_GROUPが入っている場合、他のタイプの値は入っていても使えなかった記憶。
SUB_COMMANDはルートコマンドかSUB_COMMAND_GROUPのoptions内にしか記述できない。
SUB_COMMAND_GROUPはSUB_COMMANDとほぼ同じ機能を持つが、以下の特徴がある。
ルートコマンドのoptions内でしか機能しない。
別の言い方をすると、ルートコマンドのサブコマンドでなければならないといった感じ(伝わりにくそうだけど)。
choicesフィールド
選択肢フィールド
あらかじめ入力値の候補を作っておいてコマンドを実行するユーザーに選ばせることができる。
STRING, INTEGER, NUMBER タイプの3種類で使用可能。
最大で25まで。
TYPE全部盛りJSON
code:zenbumori.json
{
"name": "testcommand",
"description": "スラッシュコマンドのテストです。",
"options": [
{
"name": "2-sub-command-group",
"description": "SUB_COMMAND_GROUPのテスト",
"type": 2,
"options": [
{
"name": "1-sub-command",
"description": "SUB_COMMANDのテスト",
"type": 1,
"options": [
{
"name": "option-test",
"description": "SUB_COMMANDのオプションのテスト。選択肢のテストでもある。",
"type": 3,
"choices":[
{
"name": "value",
"value": "sub-command-option"
},
{
"name": "value2",
"value": "sub-command-option-2"
}
]
}
]
}
]
},
{
"name": "sample",
"description": "コマンドタイプのサンプル",
"type": 1,
"options":[
{
"name": "3-string",
"description": "STRINGテスト",
"type": 3
},
{
"name": "4-integer",
"description": "INTEGERテスト",
"type": 4
},
{
"name": "5-boolean",
"description": "BOOLEANテスト",
"type": 5
},
{
"name": "6-user",
"description": "USERテスト",
"type": 6
},
{
"name": "7-channel",
"description": "CHANNELテスト",
"type": 7
},
{
"name": "8-role",
"description": "ROLEテスト",
"type": 8
},
{
"name": "9-mentionable",
"description": "MENTIONABLEテスト",
"type": 9
},
{
"name": "10-number",
"description": "NUMBERテスト",
"type": 10
}
]
}
]
}