コンテンツにスキップ

DiscordHono

import { DiscordHono } from 'discord-hono'
const app = new DiscordHono()
app.command('ping', c => c.res('Pong!!'))
export default app

.command()

const commands = [
new Command('ping', 'Pong を返答'),
new Command('image', 'Image を返答'),
]
const app = new DiscordHono()
.command('ping', c => c.res('Pong!!'))
.command('image', c => c.res('Image!!'))

Command() の第1引数と .command() の第1引数を一致させてください。
一致した .command() の第2引数が実行されます。

第1引数に '' を指定すると、キャッチオールパターンとして機能します。

.component()

const app = new DiscordHono()
.command('components', c =>
c.res({
content: 'まだボタンはクリックされていない',
components: new Components().row(
new Button('button-1', 'ボタン'),
new Button('button-2', '2つ目'),
),
}),
)
.component('button-1', c => c.update().res('ボタン がクリックされた'))
.component('button-2', c => c.update().res('2つ目 がクリックされた'))

コンポーネント要素 Button() の第1引数と .component() の第1引数を一致させてください。
一致した .component() の第2引数が実行されます。

第1引数に '' を指定すると、キャッチオールパターンとして機能します。

.autocomplete()

const commands = [
new Command('hello', 'command').options(
new Option('option', 'selector').autocomplete().required(),
),
]
const app = new DiscordHono().autocomplete(
'hello',
c =>
c.resAutocomplete(
new Autocomplete(c.focused?.value).choices(
{ name: 'world', value: 'world!!!' },
{ name: 'hi', value: 'hi!' },
),
),
c => c.res(c.var.option),
)

コマンドの Option().autocomplete() を付与してください。
Command() の第1引数と .autocomplete() の第1引数を一致させてください。
一致した .autocomplete() の第2引数が選択肢生成用のハンドラ、第3引数が実行用のハンドラです。

.autocomplete() の第3引数は .command() の第2引数と同じです。

const app = new DiscordHono()
.command('modal', c =>
c.resModal(
new Modal('modal-1', 'モーダル タイトル')
.row(new TextInput('text-1', 'テキスト'))
.row(new TextInput('text-2', '2つ目')),
),
)
.modal('modal-1', c => c.res('モーダルが送信された'))

Modal() の第1引数と .modal() の第1引数を一致させてください。
一致した .modal() の第2引数が実行されます。

第1引数に '' を指定すると、キャッチオールパターンとして機能します。

.cron()

const app = new DiscordHono()
.cron('0 0 * * *', async c => {
await c.rest('POST', _channels_$_messages, ['CHANNEL_ID'], {
content: '毎日投稿',
})
})
.cron('', async c => {
await c.rest('POST', _channels_$_messages, ['CHANNEL_ID'], {
content: '他のCronトリガーの投稿',
})
})
wrangler.toml
name = "example"
main = "src/index.ts"
compatibility_date = "2024-02-08"
[triggers]
crons = [ "0 * * * *", "0 0 * * *" ]

.cron() の第1引数と wrangler.toml の crons を一致させてください。
一致した .cron() の第2引数が実行されます。

第1引数に '' を指定すると、キャッチオールパターンとして機能します。

.fetch()

こちらを参照してください。
できるだけ Hono の fetch() と同じようになるようにしています。

.scheduled()

export default app を使っていれば、.scheduled() は含まれています。

初期オプション

verify

Cloudflare の環境であれば、使う必要はありません。

discord-interactions

import { verifyKey } from 'discord-interactions'
const app = new DiscordHono({ verify: verifyKey })

discord-verify

import { verify, PlatformAlgorithm } from 'discord-verify'
const app = new DiscordHono({
verify: (...args) =>
verify(...args, crypto.webcrypto.subtle, PlatformAlgorithm.OldNode),
})

discordEnv

Example と同じような環境変数であれば、使う必要はありません。
環境変数を別の名前で保存したときや、Cloudflare 以外の環境の時に利用します。

const app = new DiscordHono({
discordEnv: env => ({
APPLICATION_ID: env.DISCORD_APPLICATION_ID,
PUBLIC_KEY: env.DISCORD_PUBLIC_KEY,
TOKEN: env.DISCORD_TOKEN,
}),
})