toranoana.deno #12の登壇資料です。 https://yumenosora.connpass.com/event/281120/
WBC観戦のためにdiscordenoというライブラリを使ってDiscordBodをDenoで開発した話です。
ライブの録画はこちら https://www.youtube.com/watch?v=iHj72BvgoZY
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.WBC観戦に向けてDeno で DiscordBot作成〜Discordeno〜虎の穴ラボ 新規開発チーム河野 裕隆T O R A N O A N A L a b
View Slide
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.自己紹介河野裕隆● 2019/08入社● 新規開発チーム○ クリエイティア他虎の穴ラボへの入社理由● スキルを高めあえる仲間がほしい● ユーザーに近い仕事がしたい2好きなもの● VOCALOID(初音ミク)● 謎解き、クイズ今期イチオシアニメ● 江戸前エルフ● 推しの子関係ないですが →この子も目が「☆」です
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.みなさんWBC⚾見ましたか?3
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.虎の穴ラボでは・・・● 観戦会を実施○ ラボでは業務外(趣味)の参加者を募る仕組みがある■ 一緒にボードゲーム■ 近くに住んでいる人とご飯会4
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.とは言っても野球詳しくないメンバーも多い(オタク企業だし・・・)5
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.● 野球に詳しくない人と楽しくWBC観戦したい!○ 選手の特性がわかりにくい■ ドメイン知識が必要■ 数値化してあるデータを観戦時に出せれば良い選手情報を返してくれるDiscord Botを作ろう作ったもの6
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.● Discord Bot(※今日はBotの実装側の話のみします)○ 特定ワードに反応する(テスト用)○ スラッシュコマンドで特定の反応を返す作ったもの7
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.作ったもの8
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.● Deno で書き● Discordeno を使い● GitHub で管理し● Deno Deploy にあげ● Discord で利用技術構成9実装pushdeployコマンド生成コマンド実行レスポンスコマンド送信botコメント
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.Discordeno10● https://github.com/discordeno/discordeno○ 良い点■ 基本なんでもできる■ 型情報でなんとなく実装できる■ コードコメントは充実している■ Deno Deployとの親和性○ 少し不便な点■ ドキュメントが少ない■ Python等のライブラリと扱いがちょっと違う
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.● 全体構成実装概要11←送信する画像(選手に対応する某野球ゲームの画像)←外部依存関係の管理←メイン実装←メンバー配列(ほぼJSON、背番号をキーに選手情報)←環境変数や.envファイルの読み込み
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.const bot = discordeno.createBot({token: Secret.DISCORD_TOKEN,intents:discordeno.Intents.Guilds |discordeno.Intents.GuildMessages |discordeno.Intents.MessageContent,events: {ready: (_bot, payload) => {console.log(`${payload.user.username} is ready!`);},},});● Botを作るDISCORD_TOKENはBotに割り振られたキー情報実装概要12
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.● スラッシュコマンドを作るGUILD_IDはサーバーに割り振られたキー情報// コマンドの定義作成const listCommand: discordeno.CreateSlashApplicationCommand = {name: "member_list",description: "代表メンバーを返します",};// コマンドの登録処理await bot.helpers.createGuildApplicationCommand(listCommand, Secret.GUILD_ID);// コマンド受信時の処理bot.events.interactionCreate = async (b, interaction) => {switch (interaction.data?.name) {case "member_list": {b.helpers.sendInteractionResponse(interaction.id, interaction.token, {// レスポンス});break;}}実装概要13
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.// レスポンスのところの抜粋{content: "メッセージ",file: member.imageName ?{ blob: await fileToBlob(member.imageName), name: member.imageName } :undefined,}● 画像を送るfileに{ blob: Blob, name: string }(interface FileContent)を渡す実装概要14
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.● Blob型への変換に悩んだ(TypeScript的な話)● Switchからの画像取得○ スマホ経由で画像送ってた○ SDカード経由でやればよかった■ SDカードリーダー持ってないけど・・・苦労した点15const fileToBlob = async (path: string): Promise => {return new Blob([(await Deno.readFile(`./images/${path}`)).buffer]);};
Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved.● Deno Deployで無料でできるのは良い○ なんの工夫もしていないので定期的に停止しちゃうのが悲しみ● ドキュメントが充実していなくても型情報で補完されるメリット○ それはそれとしてドキュメントほしい○ ソース内のコメントは充実している● みんなで野球が見れて楽しかった(K◯NAMI感)参考(Platさんのブログ)https://zenn.dev/platina/articles/b57817025d08deまとめ16