Fortunaは長いあいだ、Discordサーバーでダイスを振り、コインを管理し、キャンペーンを円滑に回し続けてきました。けれども裏側では、ボットがすべてを一手に抱え込む1つの巨大なプログラムへと膨れ上がり、その継ぎ目がほころび始めていました。そこで私たちは、長く続くプロジェクトがいつかは向き合う決断を下しました。ゼロからの再構築です。
新しいFortunaは、応答がより速く、高負荷でも安定し、私たちにとって改良しやすく、そしてあなたの卓とともに成長できるようになりました。その作業のほとんどは、あなたの目には決して触れない場所で行われました。それこそが狙いです。けれども成果は、あなたが実際に使うあらゆる場面で姿を現します。ここでは、何が変わり、なぜそれが大切なのか、その全貌をお話しします。
最初のFortunaは、よくあるパターンの上に作られていました。Discordとの恒久的な接続を常に開きっぱなしにし、参加しているすべてのサーバーで起きることを四六時中ひたすら聞き続けるボットです。Discordではこの接続をゲートウェイと呼びます。ボットが成長して負荷に対応するため、その接続はいくつもの並列コピーへと分割されました。これをシャードと呼び、それぞれが独立して動くプロセスで、監視し、再起動し、健全に保ち続ける必要がありました。
この方式は機能しますし、何年も機能してきました。けれども相応の代償をともないます。常時接続のボットは、誰もコマンドを打っていないときでさえ、メモリを消費し続け、状態を抱え続けます。見えるサーバー、チャンネル、メンバーが1つ増えるごとに重みが増していきます。1つのシャードが不調になれば、ひとかたまりのサーバーがその影響を受けます。そして新機能を追加するたびに、すでに同時に十数のことをこなしているプログラムへ、慎重に縫い込んでいかなければなりませんでした。
私たちが欲しかったのは、もっと身軽なものでした。仕事があるときには働き、ないときには静かにしていて、1つずつ直したり拡張したりできる小さな部品で組み立てられたもの。それです。
現代のDiscordボットには、コマンドを扱うためのより良い選択肢があります。接続を開いて待ち構えるのではなく、誰かが実際にスラッシュコマンドを使ったときだけ、Discordのほうからボットを呼んでもらうのです。Discordがコマンドをひとまとめにし、1回の安全なWebリクエストとして送り、ボットが応答する。常時接続もなければ、待機中の重みもありません。何も起きていないとき、ボットはほとんど何も消費しません。
これが新設計の核心です。私たちは古いモノリスを、役割を絞った2つの部品へと分割しました。
レストランを思い浮かべてみてください。かつてのFortunaは、注文を取り、ホールを切り盛りし、厨房を回すのを同時にこなそうとする、てんてこ舞いの料理人ひとりでした。新しいFortunaには、注文が入った瞬間に火が入る厨房(fortuna-http)と、入り口で飛び込み客に目を配る気の利いたホスト係ひとり(fortuna-gateway)がいます。それぞれが自分の仕事を見事にこなし、互いの足を引っ張ることはありません。
アーキテクチャの話もいいですが、ここからはあなたのサーバーで実際に感じられることをお話しします。
キビキビした応答。 コマンドの中核は1つのことだけをこなし、待機中の余計な荷物を背負っていないため、素早く一貫して応答します。コマンドが何かの後ろで待たされることが減るのです。
より高い信頼性。 2つの部品は独立しています。チャットロール用の補佐役が再起動を必要としても、あなたのスラッシュコマンドはまばたきひとつせず動き続けます。問題はボット全体に波及せず、その場に封じ込められます。
プレッシャー下でも安定。 ステートレスなコマンド中核は、サーバーやプレイヤーが増えても重みを溜め込みません。賑やかな夜も、静かな夜とずっと近い振る舞いをします。
より速い改良。 すっきりとモジュール化された中核のおかげで、周りのすべてを乱すことなく機能を追加・修正できます。新しいコマンドはきれいに収まり、つまりアップデートがより早くあなたのもとへ届くということです。
再構築は、前々から加えたかったものを世に出す好機でもあります。新しいFortunaは、ずっしりとした新機能の数々を引っさげてやってきました。
/lc、モデレーター向けの残高管理用/mod_lcを用意しました。報酬とランクはあなたのコミュニティの中だけに収まります。/configコマンドが、サーバーごとの設定を一カ所にまとめます。各コミュニティが、自分たちの遊び方に合わせてFortunaを調整できます。/handoutsフローを通じて、手がかりや手紙、画像を卓のみんなと共有できます。良質なオンラインセッション卓がそうあるべきかたちで。/checkinコマンドで、出席の記録が簡単になり、グループの足並みをそろえやすくなります。これらすべては、Fortunaがずっと得意としてきたものと並んで存在します。豊かなダイスロール(スラッシュコマンドからも、チャットに直接ロールを打ち込んでも)、デイリー報酬、ランク、ストア、その他もろもろです。
最も大きな使い勝手の向上の1つが、新しい中核にしっかりと組み込まれています。完全なローカライズです。FortunaはいまやDiscordのすべての言語――30を超えるロケール――を話し、各ユーザーのDiscord設定に基づいて自動的に正しい言語を選びます。コマンド名、説明、応答がプレイヤー自身の言語で届き、気の利いたフォールバックの連鎖によって、翻訳の抜けを前に途方に暮れる人は誰もいません。あなたの卓がポルトガル語で遊ぼうと、英語、スペイン語、フランス語、日本語、あるいはそのあいだのどの言語であろうと、Fortunaは一人ひとりのいる場所まで歩み寄ります。
技術的なディテールがお好きなら、私たちが誇りに思っている選択をいくつかご紹介します。興味がなければ、この節は安心して読み飛ばしてください。
Discordから届くすべてのコマンドリクエストは、Fortunaが動き出す前にEd25519署名で暗号的に検証されます。これにより、ボットは本物の、改ざんされていないリクエストにしか応答しません。コマンドの中核は軽量なHonoフレームワークとともにBun上で動き、チャットロール用の補佐役は静的にコンパイルされた小さなGoのプログラムで、ごくわずかなフットプリントでアイドル状態を保ちます。どちらもすっきりとコンテナ化されたイメージとして出荷され、デプロイは速く再現性のあるものになります。さらに、何かがうまくいかなくなったときにきちんと気づいて素早く直せるよう、適切なエラー監視を組み込みました。その際、機微な情報は決してログに残さないよう細心の注意を払っています。
共有のダイスエンジンは、私たちの他のツールを支えているのと同じ信頼の置ける計算ロジックです。だからこそ、Discordで振ろうと、エコシステムのどこで振ろうと、1つのロールはまったく同じ意味を持ちます。
これらはどれも、Fortunaの精神を変えるものではありません。いまも変わらず、あなたのダイスを振り、キャンペーンを整えてくれる、親しみやすいボットです。変わったのは、その下にある土台です。より身軽に、より安定し、あなたの邪魔をすることなく改良を続けられるように作り上げました。
Fortunaをあなたのサーバーに迎え、新しいコマンドを試して、次に見たいものをぜひ教えてください。ダイスは、あなたの準備ができたときにいつでも転がる用意ができています。