コンテンツにスキップ

Tips

npm run register でエラー

コマンド登録の成否とは関係なく、 register.js を実行できない場合のエラー。

次の修正を検討してみてください。(いずれか、または複合)

  • package.json
    • "type": "module",
  • tsconfig.json
    • "moduleResolution": "Node",
    • "moduleResolution": "Bundler",
  • register.ts
    • 他のファイルからインポートするときに .js を付ける
      import { commands } from './commands.js'
  • 環境のアップデート

どうしてもエラーを解決できないとき

  • ファイル分割を諦める
    • register.tscommands.ts 等に分割しない
  • コマンド登録用のURLエンドポイントを生やす
    • Hono 等を使いルーティングし、登録用URLを作成する
    • 念のため、ベーシック認証等をかける

npm run dev で開発したい時

本番は、 Cloudflare Workers などのプラットフォームにデプロイするが、開発をローカルで行いたい場合、こちらを参考にしてください。

ライブラリの開発者としては、 npm run dev はおすすめしていません。(明確な意図があれば問題ありません)
代わりに次のいずれかを検討してください。

  • 開発用の Bot アカウントを作成する
  • 本番用 Bot に、開発サーバーだけ利用可能な、開発用コマンドを登録する

wrangler dev でエラー

開発環境で、コマンド登録用のURLエンドポイントにアクセスしたときに発生するエラー。

次の修正をしてみてください。

  • .env ファイルを .dev.vars ファイルにリネーム
  • .gitignore.dev.vars を追加(なければ)

URL 登録時の Validation error

Discord ダッシュボードの INTERACTIONS ENDPOINT URL に URL を登録する際のエラー。

次の修正をしてみてください。

  • 登録する URL の _ (アンダーバー)を - (ハイフン)に変更
    • aaa_bbb.user.workers.dev -> aaa-bbb.user.workers.dev

参考

絵文字(emoji)に関する注意点

new Button('button-1', 'ボタン').emoji('🔄')

絵文字を設定し Discord へ送信したとき、何も応答しない事があります。
おそらく Discord 側で絵文字ユニコードの字形選択子を適切に認識できてないかもしれません。
字形選択子を排除したと思われる絵文字一覧

いくつかの環境による tips (β)

Hono

const discord = new DiscordHono()
discord.command('hello', c => c.res('Discord World'))
const hono = new Hono()
hono.get('/', c => c.text('Hono World'))
hono.mount('/interaction', discord.fetch)
  • ブラウザ
    • https://YOUER_DOMAIN.com -> Hono World が表示される
  • Discord Bot
    • /hello -> Discord World が返答される
  • Discord Interaction Endpoint
    • https://YOUER_DOMAIN.com/interaction を登録

Deno Deploy

import { DiscordHono } from 'npm:discord-hono'
const app = new DiscordHono()
app.command('ping', c => c.res('Pong!!'))
Deno.serve(app.fetch)

Fastly Compute

import { env } from 'fastly:env'
import { DiscordHono } from 'discord-hono'
const app = new DiscordHono({
discordEnv: () => ({
APPLICATION_ID: env('DISCORD_APPLICATION_ID'),
PUBLIC_KEY: env('DISCORD_PUBLIC_KEY'),
TOKEN: env('DISCORD_TOKEN'),
}),
}).command('ping', c => c.res('Pong!!'))
addEventListener('fetch', event =>
event.respondWith(app.fetch(event.request, undefined, event)),
)