Discord向けクトゥルフ神話TRPG用ダイスボットを作りました
最近ふと思い立ち、Discordで利用できるダイスボット「TDiceBot」を公開しました。現行では主にクトゥルフ神話TRPG用に特化した忌まわしきダイスボットとして利用できます。
あまりあちこちに情報がちらばってもよくないので、pixivFANBOXのリンクを張っておきます。詳細についてはそちらをご覧ください。
きっかけ
数年前に身内からDiscord用のダイスボットを作って欲しいと言われ、作ったものがありました。このボットはただひとつのスラッシュコマンドである /dice を持ち、計算式を入力するとロール結果を計算して表示してくれるものです。
ボットの名称は当時話題になっていた「タコピーの原罪」からタコボットと命名されました(表記上は這い寄るDiceBotですが)。
高機能だからいいというわけではない
ただ、このボットには欠点がありました。それはどんなコマンドが使えるのかを把握しないといけないことです。help コマンドでどんな機能があるか確認できるようになってはいましたが、実際これを見せられたところでなにができるのか分からないということが問題でした。
タコボットの敗因
help の内容を見てピンとくるのはプログラマか数学者かあるいはExcelの操作に長けた会社員だけではないでしょうか。そもそもダイスロールをしたいユーザーは簡単にダイスロールをしたいのであって、こういう式や関数を組み合わせて自分の目的となる処理をしたいわけではありません。
さらに言えば、MAX(2d6 + 1, 5) というダイスロールを見せられたとして、まわりの人間がそれが意味するところを正しい理解できないといけません。ユーザーが欲しがっているのは高機能な関数電卓ではなく、ダイスローラーであることを失念していました。
新しいボットを作りたい
正直言えばタコボットは失敗でした。端的に言えば不必要な高機能が備わっていたのです。業務ならまだしも娯楽で関数式を組み立てるほどのことはしたくありません。いくら柔軟で数式が書けても利用者にとっては響かないのです。
タコボットを作ってからちょうど1年ほど経ち、ある程度時間的余裕も生まれたのでこれを機にボットを再設計することにしました。とはいえ、単純に作り直すだけでは前回となんら変わらないので、身内だけでなく不特定多数に対しても展開できるサービスを狙いました。
ただ不特定多数に対してサービスを提供することは簡単ですが、そもそも使われなければボットを作り直すだけの価値がありません。そのために次の三点を再確認して明確にしました。
競合の調査
失敗作といえど、タコボットの開発経験は無駄ではありませんでした。敗因を分析してそれが解消できた結果、新しいボットがいいサービスとなりうるならば、身内だけに留まらず不特定多数に提供できないかと考え、まずは競合となりうるサービスを調査することにしました。
結果としてTRPG用のダイスローラーは基本的にセッション用ツールと統合されていることが多く、Discord向けのものは国内でも数えるほどしかないことがわかりました。これであれば参入できる余地はありそうです。
既存サービスに対する優位性
私のサービスは後発なので、既存サービスよりも優位性がなければ採用されません。ですが、既存サービスのすべての機能を上回る必要もないと考えています。これはコピー商品を作ってしまう(作られてしまう)と行き着く先は価格面での戦いになってしまうからです。
サービス同士が価格で戦い始めるとユーザー視点では安く使えて嬉しいですが、提供価格が安くなることによりサービスが維持できなくなると、やがてサービス自体が消滅してしまいます。これはお互いに不利益な状況になるので、こういったことは避けるべきです。
そのために既存サービスにない優位性を提供することで価値を示すことが必要と感じています。TDiceBotにおいては後述の哲学の項で細かく説明していますが、やることとやらないことをあらかじめ決めて、ユーザーにとって期待されたとおりの洗練されたサービスを提供することを第一の目標としています。
小さく素早く始める
インターネット文化が成熟してSNSが浸透した現代では情報が氾濫し、ユーザーがとれる選択肢は多岐に渡ります。一般論として使われないものを時間をかけて作っても意味がありません(私のこれは趣味ですが)。そのため、最低限必要とされる機能を決めてサービスを構築することに注力しました。
タコボットは当初見込んでいた1週間程度でTDiceBotに転生を果たし、サービスを開始しました。今はまだ利用者が少ないのですが、私がnoteで書いた別の記事のいいね数を参考にすると徐々に閲覧数が増えていく傾向にあるので、同じように少しずつ利用者が増えていくのではないかと考えています。
既存の仕組みを使わない
Discordでボットを作成する際に discord.js や discrod.py といったライブラリを使うことは十分に考えられることでしょう。DiscordのAPIを隠蔽してコードファーストで手軽に機能を実装できることは魅力的と言えます。
しかし、こういったライブラリを使うことは、ボットの主機能がライブラリに強く依存することになります。現代の一般的なアプリケーションはある程度の規模になると、まったくライブラリに依存しないことはまずあり得ないことですが、特定のアーキテクチャ層として分離できる範疇に納まらないと、ライブラリの破壊的変更に巻き込まれやすくなります。うまくライブラリとアプリケーションが噛み合わなくなると対処に苦慮するか、解決に時間がかかることになりかねません。
開発は大変になりますが、のちのメンテナンスまで見据えるとアプリケーション設計上、重要な部分は自身で構築したほうが取り回しがよく、不確定要素に振り回される心配もありません。これはDiscordライブラリだけでなく、ダイスロールの部分も同様で、既存のソフトウェアに大きく依存しない作りになっています。
TDiceBotの哲学
TDiceBotには哲学を設定することにしました。それぞれについて賛否両論あると思いますが、これらの方針を明確にすることで、あらかじめ開発者(私)とユーザーの認識をすり合わせて、双方にとって好ましい関係が構築できることを期待しています。
スラッシュコマンド
TDiceBotが提供するのはいくつかのスラッシュコマンドだけです。これはDiscordに推奨された方法であるだけでなく、以下のいくつかの理由に基づくものです:
ユーザーの発言に対して反応するボットを作成することもできますが、昨今データプライバシーが叫ばれる中で、すべての発言を確認する仕組みにすることは導入する側にとって抵抗感があると判断しました。また、サーバー管理者がボットを導入するだけで参加者全員にもその影響が及ぶ点も留意しなければなりません。
すべての投稿に対して特定の文字列(コマンド)が含まれているか走査することは、ボットの通信量が増え、負荷が大きくなります。ダイスロールのリクエスト頻度が通常会話を超えることはないと推測できることから、ほとんどの時間は本質的でない処理を行なっており、維持費の単純な増加に繋がります。
ユーザーの発言に反応するという仕様は、ユーザーの発言が自由形式がゆえに前述のタコボットの「どういった構文が使えるかわからない」という問題を解決できていません。ボットを使おうとしたときに逐一使い方を参照しなければならないのは手間です。その点スラッシュコマンドではコマンドの説明を確認できるため、不慣れでも扱いやすいと言えます。これによって「ダイスロールができる」という事実さえ知っていれば、あとはコマンド一覧の中から自分が行いたいダイスロールを選択してパラメータを指定するだけです。
いっぽうで、特にスマートフォン環境においてはスラッシュコマンドを入力することは手間であることは否定できません。これについてはよく使うダイスロールに関してはショートカットとなるコマンドを用意してなるべく負担に感じないようにしています (例: /dice に対する /d100 コマンド)。
最小限の洗練された機能
サービスは使われていくうちに機能が増えていくことが多いでしょう。しかし、欲しいと言われたもの闇雲に追加していくことが常にいいとは限りません。わずかな機能をうまくやってくれることを期待していたはずが、時を経て紆余曲折あり、いつのまにか使うことのない機能にあふれたシステムができあがっているということは避けたいと考えています。
TDiceBotは本質的な機能のみの提供にとどまります。ここでいう本質的というのは、ダイスロールや数値計算のことを指しており、それ以外のものは提供する予定がありません。
もしダイスロールの域を超える機能が欲しいということであれば、それを行なってくれる仕組みを別途導入するべきです。そうすることによって、ユーザーごとに必要な機能を取捨選択できるようになり、把握もしやすくなります。
ジョークコマンドの類は提供しませんし、ジョークを伴う応答もしません。ジョークというものはしばしば時事ネタやインターネットミーム、オタク(ギーク)知識等の影響を受け、人によっては不快さや苛立ちを感じるでしょう。前項と同じようにジョークが必要であればそのための仕組みを別途導入するべきです。
高速で安定した動作
ユーザーに使われるものは信頼性が高いことが求められます。いつでも期待する動作が期待した通りに動くことが当たり前でなければなりません。
応答速度がなるべく速くなるように設計されています。タコボットはPythonで開発されましたが、起動速度と実行速度に難があり、コールドスタートの際にDiscordの3秒レスポンスルールに引っかかることがありました。これはいうまでもなくユーザー体験を損なう要素なので、使用する言語とアーキテクチャを変更してこの問題を解消しています。実際にTDiceBotではコールドスタートでも500ms以内の応答を可能としています(Discord上での応答はそれより遅くなります)。
クラウドコンピューティングサービスを利用して、稼働率100%に近い設計になっています。アップデート時のダウンタイムもありませんし、いつでも利用できるようになっています。ただし、サービス側が障害を起こした場合までは担保できません。
見て楽しい出力
ほとんどの状況で重要視されるのは過程ではなく結果でしょう。しかし、同じ結果になったとしても過程が重要とされる場合があります。TRPGをプレイしているという文脈では 2d6+1 が振られて 7 が得られたしても、その内訳がないとなんとなく心情的に納得できず無機質なものとなるでしょう。ここでふたつの例を出してみましょう:
2d6+1 → 7
2d6+1 → 🎲2 + 🎲4 + 1 = 7
ふたつの表記のうち、より納得できて見やすいのは後者だと思います。また、重要な部分を強調することで、見て楽しい表示にもなります。TDiceBotではこの「楽しませる表示」を強く意識しています。
有料プランへの誘導や広告の表示をしない
最近のインターネットはおそろしいほどに広告にあふれるようになってしまいました。あらゆるものが収益に結び付けられてビジネス至上主義になりました。ユーザーはサービスを利用するために見たくもない広告を見ることを強要されています。
TDiceBotはその機能において有料プランへの誘導や広告の表示をしません。広告ほど興醒めするものはない上に、サービスの本質的な部分でもないからです。
ただ、このダイスボットに価値を感じてわずかばかりでも支援をしていただけるのであれば幸いです (pixivFANBOXで受け付けています)。支援していただくとお礼としてTDiceBotの月間利用上限を引き上げることのできるライセンスキーを発行いたします。
これから
利用者が増えるにつれてご意見をいただく機会が必然的に多くなると考えていますので、それに伴って機能の拡充をしていくことを考えています。機能の要望などは随時pixivFANBOXで受け付けておりますので、なにかございましたらお気軽にご意見をお寄せください。
有料にプランに対する考え方
現在は試験運用も兼ねて無料プラン(無支援)の場合の月間利用上限を100回に設定してあります。ご支援の状況次第ではありますが、利用できる機能や回数については都度調整を図っていく予定です。