コマンドビルダーイベント

イベントビルダー(カスタムイベント)

「イベントビルダー」は、Discord サーバー上で起きた出来事(メンバーの参加、メッセージの編集、リアクションなど)や、決まった時刻をきっかけに Bot を自動で動かすための機能です。処理はブロックを線でつないで作り、組み立て方はコマンドビルダーと同じです。

コマンドビルダーとの違い

項目カスタムコマンドカスタムイベント
起点のブロック「スラッシュコマンド」「イベントトリガー」
オプション(引数)使えますありません
実行者コマンドを実行した人トリガーによって決まります(いないこともあります)
文脈の変数{Command.*}{Event.*}

エラーハンドラーとコマンド内関数は、カスタムコマンドと同じように使えます。

イベントでは使えないブロック

次のブロックはブロックパネルに並びません。

ブロック理由
「モーダルを送信」イベントにはモーダルを開く起点となる操作がないためです。ボタン・選択メニューのクリック後でも開けません。
オプション 8 種(テキスト / 数値 / 真偽値 / ユーザー / ロール / チャンネル / 添付ファイル / 選択)イベントには引数がないためです。

カスタムコマンドから複製した定義にこれらが残っている場合は、「イベントでは動かないブロックが N 個あります」と警告が出ます。保存はできますが、実行時にはそのブロックが読み飛ばされます。

イベントでの制限

置けるブロックでも、イベントでは動きが変わるものがあります。

設定イベントでの動き
永続パネル作成できません。一過性のボタン・選択メニューとして送られます。
エフェメラル(実行者のみ表示)ボタン・選択メニューのクリック後に送るメッセージは、クリックした人にだけ表示されます。クリック前は無視され、全員に見えるメッセージとして送られます。
「メッセージの消去」巻き込み防止のフィルタが効きません。直前に自分が送ったメッセージも削除対象になります。

チャンネルの指定

「メッセージを送信」の送信先「イベントの発生元チャンネル」は、トリガーが対象チャンネルを持つ場合にだけ使えます。持たないトリガーでは「特定のチャンネル」を選び、チャンネル ID か {Event.channel} {BSVAR_…} などの変数で指定してください。「イベントの対象ユーザーのDM」も同じで、対象ユーザーを特定できるトリガーでのみ届きます。

「インスタント招待の作成」「メッセージの消去」「チャンネルを編集」や、チャンネルを選ぶ欄が無い「メッセージを編集」「メッセージを削除」も、同じく発生元チャンネルに依存します。

対象ユーザーの指定

「ロールを付与」「メンバーのBAN」「メンバーのKick」「メンバーのTimeout」など、既定で実行者を対象にとるブロックは、対象がサーバーメンバーとして解決できないと何もせずに終わります。イベントで実行者が確実に決まるのは次のトリガーだけです。

  • 「メンバーが参加」「メンバーが退出」「メッセージが送信された」「スレッドが作成された」
  • ボイスの 3 種
  • Bot の機能のうち、「抽選が終了した」「抽選をやり直した」「ロールパネルが削除された」「認証が時間切れになった」以外
  • 保護機能のうち、「詐欺リンクを検知した」「ブラックホールが作動した」「Ghost Ping に対処した」「招待リンクをブロックした」「大量メンションを検知した」「NG ワードを検知した」
  • 経済・自動応答・バックアップのすべて

それ以外のトリガーでは、対象ユーザーを {User.id} などの変数か ID で明示的に指定してください。

操作するメッセージ・ロールの既定

トリガーがメッセージやロールを持つ場合、新しく置いた次のブロックの対象は、最初からトリガーのメッセージ({Message.id})・ロール({Role.id})になります。すでに置いてあるブロックや、あとからトリガーを変えた場合は変わりません。

ブロック既定にならないトリガー
「メッセージを編集」「メッセージを削除」「メッセージをピン止めする」「メッセージにリアクションをする」リアクション系のトリガー
「ロールを編集」「ロールを削除」「監査ログが記録された」

削除済みの対象のトリガーでは、どちらも既定になりません。

削除済みの対象

「ロールが削除された」「メッセージが削除された」「メッセージが一括削除された」「スレッドが削除された」「絵文字が削除された」「スタンプが削除された」では、発火した時点で対象がすでに消えています。名前や ID は変数で読めますが、その対象を編集・削除・ピン留め・リアクションしたり、そのロールを付与・剥奪したりするブロックは実行時に失敗します。ロール・メッセージ・スレッドを対象にしたブロックには「削除済みの対象を操作しています」と警告が出ますが、保存はできます。

ボタン・選択メニュー

イベントで送ったボタン・選択メニューは、誰でも押せます。押せる人を絞るには、クリック後に「ロールによる条件分岐」「ユーザーによる条件分岐」「権限による条件分岐」を置き、判定対象を「ボタンをクリックしたユーザー」(既定)にしてください。

クリック後に実行されるブロックでは、次のように扱いが変わります。

  • {Command.user} / {Command.channel} / {Command.guild} が、クリックした人とクリックのあった場所を指します。{Command.name} などほかの {Command.*} は使えません。{Event.*} の内容は変わりません。
  • 「イベントの対象ユーザーのDM」や、実行者・発生元チャンネルを対象にとるブロックは、クリックした人・クリックのあったチャンネルを対象にします。

クリックを待てるのは約 5 分間です。クリック待ちは Bot ごとに 20 件までで、それを超える分のボタン・選択メニューは押せない状態で送信されます。

イベントの中で使える変数

{Bot.*} {Now.*} {Guild.*} と、次の変数を使えます。{Command.*} は、ボタン・選択メニューのクリック後に user / channel / guild を使える場合と、カスタムコマンドのトリガーで {Command.name}(対象のカスタムコマンドの名前)を使える場合を除き、使えません。

常に使える変数

変数内容
{Event.id}このイベント定義の ID
{Event.name}イベント名
{Event.trigger}トリガーの種別(例: memberJoin)
{Event.firedAt}発火した時刻。時刻の型なので {Event.firedAt.short} のように書けます
{Event.guild}イベントが発火したサーバー

トリガー次第で使える変数

変数内容
{Event.channel}対象チャンネル。対象チャンネルを持つトリガーでのみ登録されます
{Event.user}対象ユーザー。実行者を特定できるトリガーでのみ登録されます

トリガーが提供する名前空間

トリガーごとに、次の名前空間のうち使えるものだけが変数一覧と入力補完に並びます。

名前空間内容
{Member.*}対象メンバー(ユーザー型)
{Role.*}対象ロール(ロール型)
{Thread.*}対象スレッド(チャンネル型)
{Message.*}id / content / url / createdAt(createdAt は「メッセージが送信された」のみ)。本文はメッセージコンテンツ インテントが無いと空になります。「メッセージが一括削除された」では count(削除された件数)を使えます
{Invite.*}code / url / uses / maxUses / maxAge / temporary
{Stage.*}id / topic / privacyLevel
{Reaction.*}emoji / emojiId / emojiName
{Poll.*}messageId / answerId
{Emoji.*} / {Sticker.*}id / name / url / animated
{AutoMod.*}ruleId / action / matchedKeyword / matchedContent / content
{AutoModRule.*}id / name / enabled
{Audit.*}id / action / reason / changed
{Target.*}監査ログの操作対象(id / name / mention)
{Nickname.before} / {Nickname.after}ニックネームの変更前後
{Before.*} / {After.*}サーバー設定の変更前後(name / ownerId / boostLevel)。「ボイスチャンネルを移動した」では移動元・移動先チャンネルの id / mention、「サーバーイベントが変更された」では変更前後のサーバーイベント({ScheduledEvent.*} と同じ項目)
{Ticket.*}トリガーごとに入る項目が異なります。「チケットが開かれた」は configName / channelId / channelMention / openerId、「チケットが閉じられた」は configName / channelId / channelName / openerId / openerMention / reason / deleted、「チケットが削除された」は channelId / channelName、「チケットが再開された」は configName / openerId / openerName、「チケットの上限に達した」は configName / limit / opened
{Giveaway.*}prize / participatorNum / messageId / messageUrl(トリガーによって入らない項目があります)。「抽選が作成された」「抽選が編集された」「抽選が終了した」では winnerCount(設定した当選者数)、「抽選が終了した」「抽選をやり直した」では winnerNum(実際に当選した人数)、「抽選が編集された」では changes(変更した項目)も使えます。winners は「抽選が終了した」では当選者のメンションですが、作成・編集では互換のため当選者数が入ります
{Level.new} / {Level.old}到達したレベルと、その 1 つ前のレベル
{RolePanel.*}name / panelId / action(added か removed)。「ロールパネルが作成された」では type、「ロールパネルの上限に達した」では maxRoles も使えます
{Verification.type}認証方式(button か calculation)
{Leveling.*}「XP が手動で変更された」の totalXp / oldLevel / newLevel
{RoleGrant.*}「レベル報酬ロールを付けられなかった」で付けられなかったロールの ids / names
{RoleRestore.count}「ロールが復元された」で戻したロールの数
{AntiNuke.*}actionType / count / windowSeconds / attribution(実行者の特定方法)
{AntiRaid.*}count / windowSeconds / action / punished(処罰できた人数)/ targets(処罰の対象になった人数)
{CoordinatedSpam.*}users / messages / channels(それぞれ関与した数)
{AntiScam.*}domain / url_count
{MassMention.mentions}メッセージに含まれていたメンションの数
{NgWord.matched.ids}一致した NG ワード登録の ID。語句そのものは含まれません
{InviteFilter.*}matched.codes / reasons / fail_soft(招待先を確認できず削除だけ行ったとき true)
{GhostPing.*}mentions / action
{Blackhole.channelName}投稿されたブラックホールのチャンネル名
{Escalation.*}source(検知した保護機能)/ count / fromAction / toAction
{Protection.*}source / action / status / caseId / reason / count / escalated
{Economy.*}トリガーごとに入る項目が異なります。amount / receiverId / receiverName / senderBalance / clearedDebt / penaltyDays / penaltyRate / bankruptcyCount / interestRate / loanBalance / reason / requestedAmount / maxLoan / requiredScore / creditScore / repaidAmount / collectedAmount / reducedAmount / interest / bank / cycles
{Responder.*}name(ルール名)。「自動応答が反応した」では matchType、「自動応答を送れなかった」では kind(static か ai)も使えます
{Error.*}「コマンドの実行に失敗した」の type / message(先頭 200 文字)。type にはエラーハンドラーの種別とは別の値が入ります
{Function.*}「関数呼び出しの上限に達した」の id / reason(深さか回数か)
{Reminder.*}id。「リマインダーが通知された」では creatorId、「リマインダーを送れなかった」では error も使えます
{Backup.*}id。「バックアップが作成された」では name と保存した件数(roles / text_channels / voice_channels / categories / emojis / stickers / bans)、「バックアップが復元された」では hasFailures も使えます
{ScheduledEvent.*}id / name / description / entityType / status / location / userCount / startTime / endTime(終了日時が未設定なら使えません)
{Integration.*}id。「連携が追加された」では name / type / accountName / enabled、「連携が削除された」では applicationId も使えます

各モジュールのメッセージで使う変数({Ticket.ticketUser.mention} など)は、イベントでは使えません。

プラン別の上限

項目FreePlusProMax
有効にできるカスタムイベント数31030100
1 イベントに置けるブロック数150200300500
1 分あたりの発火回数3060120300
同時に実行できるイベント数251020
イベント連鎖の深さ3355
スケジュールの最短間隔(秒)1206030制限なし

「イベント連鎖の深さ」は、イベントの処理が起こした変更がさらに別のイベントを呼ぶ、という連鎖を何段まで許すかの上限です。ユーザーの操作から直接起きた発火は 0 段目として数えます。

次のステップ / 関連ページ

最終更新:

目次