Site cover image

Site icon imageMOMOPARK

🦕Deno でつくる Discord Bot

Deno は、JavaScript/TypeScript ランタイム環境です。

Deno で Discord Bot を実装するにあたりやったことを文章として書き起こしました。

Deno で Bot を開発する参考になればうれしいです。

モチベーション

趣味で『クトゥルフ神話TRPG』というゲームを遊んでいます。進行役となる「キーパー」と「プレイヤー」がともに会話して物語を進める遊びです。

プレイヤーは、ルールブックをもとにゲームに参加するキャラクターの設定値を書き込む「キャラクターシート」を作成します。

キャラクターシートを作成したあとは、ゲームが始まる前にキーパーさんにキャラクターの設定値に気になるところがないかなどをチェックしてもらうのが慣例になっています。文脈が異なりますが、アプリケーション開発でいうところのPull Request に対してレビューをもらうようなイメージですかね。

さて自分がプレイヤーとしてよくやらかしてしまうミスに、「技能値の振り忘れ」があります。

🥲
〜よくあるやりとり〜

自分「キャラクターシートを作成しました!確認お願いします!」

キーパー「確認しました!ちなみに回避技能が初期値(注: 技能値ポイントを振り分けていない状態)になっていますが大丈夫ですか?」

自分「ごめんなさい、振り忘れているので修正します…」

キャラクターシートを提出する前に頑張ってチェックすれば防げるミスではあるのですが、
せっかくプログラミングに慣れ親しんでいるので、仕組みで解決してみようと思いました。

そこで、キャラクターシートの技能値をチェックする Discord bot を実装しました。

できたもの

詳しい実装はリポジトリを参照してください。

オンラインでキャラクターシートを保管できるサービスがいくつか公開されていて、私はCharaeno(キャラエノ)を利用しています。Charaeno の API を使って、キャラクターシートのURLをもとにキャラクターシートのデータを取得しています。

使い方
  1. ユーザーが Discord Bot にスラッシュコマンド、条件値、キャラクターシートのURLを渡す
    • /check こぶし>=70,回避>=30 https://charaeno.com/6th/{id}
  2. 条件値にしたがって評価する
  3. Discord Bot がユーザーに評価結果を返す

Image in a image block

オンラインでクトゥルフ神話TRPGを遊ぶときは、ツールとして Discord を使うことが多いです。自分もDiscordを多用していることと、Deno を使って Bot を作った経験がなく触ってみたかったことから、今回は Discord Bot として実装しました。Botを作成し、テストを書いて、デプロイするところまでやりました。

技術要素

Denoでアプリケーションを作るのは初めてだったので、Denoの公式ドキュメントのQuick Startから始め、必要に応じて参照しつつ実装を進めていきました。Deno で Discord Bot を構築するにあたり、Discord APIライブラリの Discordeno を使用しています。

JavaScript、TypeScriptについても普段業務では触っておらずあまり知識がなかったので、基本的な文法についてはJavaScript PrimerプログラミングTypeScriptなどの書籍を参照しました。

ユーザー入力を受け取って何かしらの返答を返すような簡単なBotを作った経験が何度かあり、言語が違ったとしても実装の流れは大まかに把握できていたので、あまりつまづくことなく進められたかなと思います。

良かったこと

Denoでは、ビルトインでリンター、コードフォーマッター、テストの仕組みが入っていて、やりたいことに即座にとりかかれたのがたいへん開発体験が良かったです。

deno taskコマンドを使用して任意の定義したタスクを実行できます。

環境変数の定義は Deno.env APIが提供されています。

デプロイには Deno Deploy を使いました。デプロイに利用するための GitHub Actions テンプレートをデフォルトで作成してくれたのが便利でした。

つまづいたこと

Discordeno のリポジトリには example テンプレートがあるのですが、内容がやや古いところがあります。example をベースに、Discordeno の公式ドキュメントや Discordeno 本体の実装を読みながら調整していく必要がありました。

所感

ちょっとした Bot をつくるのに Deno はとても便利でした。JavaScript や TypeScript は入門した程度、Deno はほぼ触ったことがない状態でしたが、ドキュメントのおかげで実装しやすかったです。今後も Bot をつくることになったら、Deno を利用すると思います。

参考にしたもの