- モジュールのインポート
- コンテキストの作成
- ボタンの追加
- 注意点
- 備考
- 親オブジェクトでのボタン追加・削除・取得
- 備考
- 送信前の準備
- 備考
- 送信
- 編集と削除
- イベント受信から応答まで
- データモデルの仕様
- サンプルコード
const iab = require('./interactionbuttonmodule.js');
これが親オブジェクトになる。これにボタンを追加していく土台。
new iab.InteractionButton(bot: Discord.Client)
var context = new iab.InteractionButton(bot);
引数botにはクライアントを指定。
InteractionButtonPartsでボタンを作る。
var btn = new iab.InteractionButtonParts({
name: String,
label: String,
style: Number,
url: String,
emoji: Discord.GuildEmoji | String,
disabled: Boolean
});
引数名 | 省略可能 | 名前付き引数か | 意味 |
---|---|---|---|
name | 場合による | Yes | ボタンのID。重複しないこと |
label | No | Yes | ボタンに表示させる文字列 |
url | 場合による | Yes | ボタンにリンクさせるURL |
style | Yes | Yes | ボタンのスタイル(備考を参照すること) |
emoji | Yes | Yes | ボタン横に表示させる絵文字 |
disabled | Yes | Yes | 押せなくするかどうか |
var button = new iab.InteractionButtonParts({
name: 'sample1',
label: 'ボタンだよ',
style: 1
});
- styleに5を指定した場合、urlパラメータが必須となる。それ以外の場合は、nameが必須となる。
- labelの最大文字数は50
- ボタンのスタイルはいくつかある。
↓表(InteractionButtonStyles.は省略)
種類 | 色の名前 | 別名 | ID |
---|---|---|---|
通常 | blurple | primary | 1 |
サブ | grey | secondary | 2 |
完了 | green | success | 3 |
キャンセル | red | danger | 4 |
URL用 | - | url | 5 |
context.add_button(button); # 追加
context.add_buttons([button, button2]); # まとめて追加
context.remove_button(button); # 削除
context.get_button(0); # 1個目のボタン取得
- 追加したボタンは内部プロパティ
buttons
に格納される。 - remove_buttonに指定したボタンがなくてもエラーにはならない。
- 追加できるボタンは5つまで(でもこれ、たぶん間違ってるから後で調べ直す)
context.build();
送信に必要なデータを生成する。
build()を呼び出さないと送信時にエラーになる。
内部プロパティjson
に辞書で保存される。
引数はなくても良い(はず)
- add_buttonまたはremove_buttonした後は必ずbuild()を呼び出すこと。
await context.send({
channel: Discord.TextChannel,
content: String,
embed: Discord.MessageEmbed
}, callback);
引数名 | 省略可能 | 名前付き引数か | 意味 |
---|---|---|---|
channel | No | Yes | 送信先チャンネル |
content | Yes | Yes | テキストメッセージ |
embed | Yes | Yes | 表示させたいEmbed |
callback | Yes | No | オブジェクトを受け取るコールバック関数 |
指定チャンネルに送信する。 channelにはDiscord.jsのTextChannelを渡すこと。
コールバック関数にはInteractionButtonRemoteObjectが渡される。
送信したボタンはあとから編集することができる。
await obj.edit(new_context: InteractionButton)
引数名 | 省略可能 | 名前付き引数か | 意味 |
---|---|---|---|
new_context | No | No | 置き換える新しいオブジェクト |
削除もできる。
await obj.delete()
送信で得たオブジェクトは、InteractionButtonRemoteObjectがベース。
obj.set_callback(async (event) => {
await event.reply('押されました');
});
obj.start_receive();
set_callbackで受け取る関数を指定、start_receive()で開始。
停止する場合はstop_receive()、コールバック関数を外す場合はclear_callback()を呼び出す。
obj.set_callback(func)
引数名 | 名前付き引数か | 意味 |
---|---|---|
func | No | イベントを受信する関数(awaitable) |
イベント受信時はawait func(event)
の形で内部から呼び出される。
eventの型はInteractionButtonEventResponseである。
obj.start_receive()
特に引数はない。これを実行するとクライアントのイベントハンドラに登録される。
返り値として得られたものを使って、応答メッセージを送信できる。
await event.reply(text: str, {
embed: Discord.MessageEmbed,
hidden: Boolean
});
引数名 | 省略可能 | 名前付き引数か | 意味 |
---|---|---|---|
text | No | No | テキストメッセージ |
embed | Yes | Yes | 埋め込み |
hidden | Yes | Yes | メッセージ送信者にのみ表示するか |
embedにはDiscord.MessageEmbedを指定できる。
hiddenはBoolean。
ack()で、メッセージの送信はしないが、受信したということだけ通知できる。
await event.ack()
プロパティ名 | 型 | 内容 |
---|---|---|
bot | Discord.Client | クライアント |
json | Object | 送信用内部辞書 |
buttons | Array | ボタンの格納先 |
メソッド名 | 内容 |
---|---|
add_button | ボタン追加 |
add_buttons | 複数ボタン追加 |
remove_button | ボタン削除 |
get_button | ボタン取得 |
build | データ生成 |
await send | 送信 |
bot、jsonを直接編集することは望ましくない。
プロパティ名 | 型 | 内容 |
---|---|---|
name | String | ボタンのID |
type | Number | Component Type |
label | String | ボタンに表示させる文字列 |
emoji | Discord.GuildEmoji | 絵文字 |
style | Number | ボタンのスタイル |
url | String | ボタンに結びつけるURL |
disabled | Boolean | 無効にするかどうか |
メソッド名 | 内容 |
---|---|
to_dict | JSON変換用 |
typeは常に2で固定。
プロパティ名 | 型 | 内容 |
---|---|---|
bot | Discord.Client | クライアント |
payload | Object | RAWメッセージオブジェクト |
id | String | メッセージID |
channel | Discord.TextChannel | チャンネルオブジェクト |
message | Discord.Message | メッセージオブジェクト |
メソッド名 | 内容 |
---|---|
set_callback | コールバック設定 |
clear_callback | コールバック解除 |
start_receive | イベント受信開始 |
stop_receive | イベント受信停止 |
bot, payload, id, channel, messageを直接編集することは望ましくない。
プロパティ名 | 型 | 内容 |
---|---|---|
bot | Discord.Client | クライアント |
data | Object | イベントデータ |
REPLY_TOKEN | String | コールバック用ワンタイムトークン |
name | String | ボタンのID |
message | Discord.Message | ボタンが置かれているメッセージオブジェクト |
channel_id | String | チャンネルID |
guild_id | String | サーバーID |
user | Object | RAWユーザーオブジェクト |
channel | Discord.TextChannel | チャンネルオブジェクト |
メソッド名 | 内容 |
---|---|
await reply | メッセージ返信 |
await ack | 受信確認通知 |
await custom_response | 手動でレスポンス送信 |
bot, data, REPLY_TOKEN, name, message, user, guild_id, channel_id, channelを直接編集することは望ましくない。
クライアントの変数名はbot
、チャンネルオブジェクトが入った変数をchannel
としている。
const iab = require('./interactionbuttonmodule.js');
var context = new iab.InteractionButton(bot);
var button = new iab.InteractionButtonParts({name:'sample1', label:'ボタンだよ'});
context.add_button(button);
context.build();
await context.send({content: 'ただのボタン', channel: channel});
const iab = require('./interactionbuttonmodule.js');
var context = new iab.InteractionButton(bot);
var button = new iab.InteractionButtonParts({name:'sample2', label:'操作を取り消す', style: 4});
context.add_button(button);
context.build();
await context.send({content: 'ただのボタン', channel: channel});
const iab = require('./interactionbuttonmodule.js');
var context = new iab.InteractionButton(bot);
var button = new iab.InteractionButtonParts({name: 'sample2', label: '再生', emoji: '\U000025b6\U0000fe0f'});
context.add_button(button);
context.build();
await context.send({content: '再生パネル', channel: channel});
const iab = require('./interactionbuttonmodule.js');
var context = new iab.InteractionButton(bot);
var button = new iab.InteractionButtonParts({name: 'sample3', label: '検索結果を表示', url: 'https://www.google.com/', style: 5});
context.add_button(button);
context.build();
await context.send({content: 'Googleで調べる', channel: channel});
const iab = require('./interactionbuttonmodule.js');
var context = new iab.InteractionButton(bot);
var button = new iab.InteractionButtonParts({name: 'sample4', label: 'ここをクリック'});
context.add_button(button);
context.build();
await context.send({content: '押してね↓', channel: channel}, (obj) => {
obj.set_callback(async (event) => {
await event.reply('押されました');
});
obj.start_receive();
});
const iab = require('./interactionbuttonmodule.js');
var context = new iab.InteractionButton(bot);
var button1 = new iab.InteractionButtonParts({name: 'sleep', label: '寝る', style: 1});
var button2 = new iab.InteractionButtonParts({name: 'cancel', label: '夜ふかしする', style: 2});
var button3 = new iab.InteractionButtonParts({name: 'noact', label: 'なにもしない', style: 2});
context.add_buttons([button1, button2, button3]);
context.build();
await context.send({content: '寝ることができます', channel: channel}, (obj) => {
obj.set_callback(async (ev) => {
if (ev.name == 'sleep') await ev.reply('(つ∀-)オヤスミー');
if (ev.name == 'cancel') await ev.reply('発狂(は');
if (ev.name == 'noact') await ev.ack();
});
obj.start_receive();
});