Skip to content

@hibiki-js/discord ​

Discord Interactions 用の Hibiki プロバイダーです。Web Crypto を使って Discord の Ed25519 リクエスト署名を検証し、実行時依存を持ちません。

インストール ​

bash
pnpm add @hibiki-js/core @hibiki-js/discord

discord(options) ​

ts
const provider = discord({
  publicKey: string,
})

HibikiProvider<"discord", DiscordEvents> を返します。

オプション型説明
publicKeystringDiscord Developer Portal に表示される64文字の16進数公開鍵
tolerancenumber受け付ける署名の最大経過秒数。デフォルトは 300

Discord のエンドポイント検証には、discord.ping から { type: 1 } を返す必要があります。コマンドやコンポーネントのハンドラでは、たとえば { type: 4, data: { content: "Hello" } } のような Interaction Response JSON を返してください。

Hibiki Coreは処理に成功したInteraction IDをデフォルトで24時間保持し、重複処理を抑止します。複数インスタンスでは永続化した共有のID保存先を使ってください。

メッセージの送信 ​

createDiscordWebhook(url) を使うと、Discord の受信Webhookへ メッセージを送れます。URL には Discord のチャンネル連携設定で発行したものを指定します。

ts
import { createDiscordWebhook } from "@hibiki-js/discord"

const webhook = createDiscordWebhook(process.env.DISCORD_WEBHOOK_URL!)
const message = await webhook.send({
  content: "デプロイが完了しました。",
  embeds: [{ title: "Production", color: 0x5865f2 }],
  allowed_mentions: { parse: [] },
})

send はデフォルトで Discord の送信確認を待ち、作成されたメッセージを返します。スレッドへ送る場合は { threadId }、送信確認を待たない場合は { wait: false } を指定します(戻り値は undefined)。components を含む場合は、Discord が処理できるよう with_components=true を設定します。HTTP エラー時は、取得できれば Discord のエラーメッセージを含む例外を投げます。

Export説明
createDiscordWebhook受信Webhook用の送信クライアントを作成
DiscordWebhookPayloadJSON メッセージの型
DiscordEmbedリッチEmbedの型
DiscordWebhookMessageDiscord が返すメッセージの型
DiscordWebhookSendOptions送信ごとの files / threadId / wait オプション
DiscordWebhookFile添付ファイルの型 { filename: string, data: Blob }
DiscordWebhookOptionsクライアントのオプション

ファイルの添付 ​

第2引数の files 配列に添付ファイルを指定します。DiscordWebhookFile の必須項目は filename: string と data: Blob です。data にはWeb標準の File も渡せます。アップロード時の名前には、明示した filename が使われます。

ts
await webhook.send({
  content: "デプロイのレポート",
  embeds: [{ image: { url: "attachment://preview.png" } }],
}, {
  threadId: "123456789",
  wait: true,
  files: [
    { filename: "preview.png", data: new Blob([imageBytes], { type: "image/png" }) },
    { filename: "report.txt", data: new Blob(["デプロイ成功"], { type: "text/plain" }) },
  ],
})

ファイルがある場合は multipart/form-data で送信し、メッセージを payload_json、ファイルを0始まりの files[n] フィールドに格納します。ファイルを省略するか files: [] を指定するとJSON形式で送信します。どちらの形式でも、テキスト、Embed、components、threadId、wait を併用できます。ファイルだけを送る場合はメッセージに {} を指定できます。

実行環境にはWeb標準の Blob、FormData、fetch が必要です(Node.js 22以降では利用できます)。独自の fetch を指定する場合も FormData を受け付け、Content-Type と境界文字列の生成をランタイムに任せてください。ファイルパス、ストリーム、バイト配列は直接渡せません。バイト列は Blob に包んでください。添付数やサイズの制限はDiscord側で適用されます。Execute Webhook と Uploading Files を参照してください。

説明文を付ける場合は、メッセージの attachments にファイルの0始まりの添字と一致する id を指定します。例: { id: 0, filename: "preview.png", description: "デプロイのプレビュー" }。クライアントはこのメタデータをそのまま送信します。EmbedのURLからは attachment://filename で添付ファイルを参照できます。

イベント名 ​

Discord Interaction typeHibiki イベント名
1 PINGdiscord.ping
2 APPLICATION_COMMANDdiscord.application_command
3 MESSAGE_COMPONENTdiscord.message_component
4 APPLICATION_COMMAND_AUTOCOMPLETEdiscord.application_command_autocomplete
5 MODAL_SUBMITdiscord.modal_submit

エクスポートする型 ​

エクスポート説明
discordプロバイダーファクトリ
DiscordEvents対応イベント名 → Interaction payload のマップ
DiscordInteraction型付けされた Discord Interaction payload
DiscordInteractionType対応する数値の Interaction type
DiscordOptions{ publicKey: string }

本文サイズ制限、署名で確認したイベントID、共有保存先での重複防止、再試行時の動作はWebhookを安全に処理するを参照してください。