Skip to content

Instantly share code, notes, and snippets.

@CyberRex0
Last active June 1, 2021 13:08
Show Gist options
  • Save CyberRex0/eb546faea3fe5c55f41cc7b4a447a2a8 to your computer and use it in GitHub Desktop.
Save CyberRex0/eb546faea3fe5c55f41cc7b4a447a2a8 to your computer and use it in GitHub Desktop.

discord-ia-button-module for Discord.js

もくじ

モジュールのインポート
コンテキストの作成
ボタンの追加
注意点
備考
親オブジェクトでのボタン追加・削除・取得
備考
送信前の準備
備考
送信
編集と削除
イベント受信から応答まで
データモデルの仕様
サンプルコード

使い方

モジュールのインポート

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()

データモデルの仕様

InteractionButton

プロパティ名 内容
bot Discord.Client クライアント
json Object 送信用内部辞書
buttons Array ボタンの格納先
メソッド名 内容
add_button ボタン追加
add_buttons 複数ボタン追加
remove_button ボタン削除
get_button ボタン取得
build データ生成
await send 送信

備考

bot、jsonを直接編集することは望ましくない。

InteractionButtonParts

プロパティ名 内容
name String ボタンのID
type Number Component Type
label String ボタンに表示させる文字列
emoji Discord.GuildEmoji 絵文字
style Number ボタンのスタイル
url String ボタンに結びつけるURL
disabled Boolean 無効にするかどうか
メソッド名 内容
to_dict JSON変換用

備考

typeは常に2で固定。

InteractionButtonRemoteObject

プロパティ名 内容
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を直接編集することは望ましくない。

InteractionButtonEventResponse

プロパティ名 内容
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});

Webサイトに飛ぶボタン

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();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment