Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WorkersでDiscord botを試してみた / 20250822workers-tec...

WorkersでDiscord botを試してみた / 20250822workers-tech-talk-niigata

2025/08/22 (金) Cloudflare Workers Tech Talk in Niigata #1 にて発表した資料

イベントページ:
https://workers-tech.connpass.com/event/363848/

Avatar for kasacchiful

kasacchiful

August 22, 2025
Tweet

More Decks by kasacchiful

Other Decks in Programming

Transcript

  1. 笠原 宏 (@kasacchiful) クラスメソッド株式会社 データ事業本部 ソリューションアーキテクト 新潟市在住 JAWS-UG新潟 / Python機械学習勉強会

    in 新潟 / JaSST Niigata / ASTER / SWANII / Cloudflare Meetup Niigata / AI CRAFT Hacks Niigata / KomeKaigi AWS Community Builder (Serverless) 2025 Japan AWS Top Engineer / 2025 Japan All AWS Certifications Engineer 自己紹介 2
  2. Cloudflare Workers の利用 Discord Hono の利用 スラッシュコマンドを扱うDiscord Botの作成 Discord ロールの付与

    登壇直前に付与できるようになりました できたこと・できなかったこと 11
  3. Discord Developers PortalにてApplication作 成 Settings「OAuth2」の「OAuth2 URL Generator」にて、ScopeとBot Permissions を設定して、Integration Typeを「Guild

    Install」として生成されたURLをコピーしてブ ラウザで開く。 管理者となっているDiscordサーバ (Guild) を選 択して、Botをサーバにインストール Discord Bot アプリケーション設定 14
  4. import { Command, Option, register } from 'discord-hono'; const commands

    = [ new Command( "mogiri", "チケットもぎりを行います。これにより適切なDiscordロールを付与します。" ).options( new Option( "ticket_no", "申込者IDを入力してください。", "String").required(), new Option( "discord_password", "参加者の方は、案内メールに記載のDiscordパスワードを入力してください", "String").required(), ), ]; register( commands, process.env.DISCORD_APPLICATION_ID, process.env.DISCORD_TOKEN, process.env.DISCORD_GUILD_ID, ); コマンド登録は tsc && node --env-file=.env.local dist/register.js とローカル実行で対応 src/register.ts 16
  5. import { DiscordHono, createRest, _guilds_$_members_$_roles_$ } from 'discord-hono'; import {

    Hono } from "hono"; // <省略> const bot = new DiscordHono() .command('mogiri', async (c) => { const params = c.var as { ticket_no: String; discord_password: String; }; const result = mogiri(c.interaction.member, params); let msg = ""; switch (result) { case Status.ADD: const res = await c.rest("PUT", _guilds_$_members_$_roles_$, [ c.interaction.guild?.id!, c.interaction.member?.user.id!, env.DISCORD_ROLE_ID, ]); msg = `参加者のロール付与が完了しました。`; break; default: msg = "エラーが発生しました。" break; } return c.res(`${msg}`) }); const app = new Hono(); app.mount("/bot", bot.fetch); app.get("*", (c) => { return c.text("Hello, Hono!"); }); export default app src/server.ts 17
  6. ロールが付与できなかった原因は「Discordロー ルの階層」だった Add Guild Member Role を利用 Discord Honoの c.rest()

    で実行 必要な権限 MANAGE_ROLES は付与している Response Codeは 403 Forbidden Discord botのロールが、付与したいロールの 下に設定されていた Discord botのロールを付与したいロールの 上にドラッグ&ドロップして設定し直した ら、スラッシュコマンドでロール付与できま した! 原因考察 21