欧米のワールドボス状況把握Discordが羨ましいので類似品を日本鯖用に作ろうとするお話

いつも北米でワールドボスを回るとき、「BDO NA WorldBosses」というDiscordサーバーを見ます。
そこではワールドボスの現在の状態(湧きまであと何時間とか)とか今沸いてるワールドボスの情報がリアルタイムで
ユーザーたちによって更新されて非常に効率良く回ることができているのです

こういうワールドボス情報まとめBOT自体は、1年以上前から始まった
「International Hunting Association(IHA)」が始まりでその後、
IHAが現在運用されているシステムに統合されてからボス情報一覧はくっそ見やすくなりました。
特に今は体力の%表示と色分けされた背景とその情報が何分前の物かが一目で分かるようになってます。

一方、日本では2年近く経っても未だに全茶での情報発信がメインで欧米のシステムと比べると非常に状況を把握しづらく、
全茶チケットを使わないと全体に情報共有できないが非常に不便だと感じました。

というわけでこの欧米のシステムを日本に持ってこようとシステム管理者などに問い合わせて
交渉したのですが、「欧米のシステム運用で手一杯で余裕がない」とだけ返されました。

くそぅ、羨ましい。
持ってこれないものは作るしかないな。

というわけで作り始めてみました。
最終目標は欧米での現行システム並みの機能を持ったBOTです。
3日前から作り始めてみて、
プログラミング言語には経験のあるC#を、フレームワークには近年新たに登場した”.NET Core 2.0“を使うことに。
将来的に完成の暁には自分が保有しているLinuxのVPSで24時間稼働を行うつもりなので、
WindowsだけでなくMacOSやLinuxでも動作できるマルチプラットフォームアプリが作れる”.NET Core 2.0″を使うことにしました。
Discord APIの制御はC#ラッパーである”Discord.Net”を採用し、手探りでプログラミングしながら機能を追加していくことに。

で、3日間頑張った結果が以下です。

現在、このBOTシステム名は”闇の精霊の感応(Black Spirit Telepathy)”ですが仮名ですので、
「良い名前思いついたぞ!」という方はTwitterへご意見を送ってください。

ある程度まともに動くようになってある程度実用に耐えられるようになった時に
アルファテストとしてDiscordサーバーを公開するので、ボス状況一覧などのデザインなどに意見・要望がある方はそちらの
専用テキストチャンネルへお願いします。

というわけでソースコードをスクショで公開して簡単に解説します。

これは主にボス状況のリストを管理するクラス(BossStatus)内の
ボス状況リストを生成するCreateStatus()関数です
”BossChannelMapTable”というListを使って全部のボスのHPを管理する予定です
現状複数の文字列を組み合わせたりしまくってリストを作ってるのでコードの見栄えはかなりひどいです。

こちらは主にBOTが発するメッセージやサーバーコンソール内のメッセージを定義するクラス群です。
見てわかる通り、英語メッセージも実装予定で需要があれば中国語メッセージも実装するつもりです。

BOTの中心となるクラス(Program)です。
これは序盤でMainAsync()関数でコンソールの初期メッセージや
Discord BOTのAPIクライアント生成やログインなどを行い、
BOTとして活動する最低限の作業を行っています。

BOTの要となる”client_MessageReceived()”関数です。
この関数は”ユーザーからメッセージがテキストチャンネルに送信された場合”というイベントが発生することで実行されます。
“SocketMessage arg”と定義された”arg”変数にユーザーから送信されたメッセージの情報が詰まっており、
この”arg”変数をいじることでメッセージの発信元ユーザーを特定したりいろいろできます

最初のif文でメッセージの発信源がBOTではないことと、メッセージが指定されたチャンネルから発信されていることを確認し、
CommandFields[]というstring型の配列を作っておいて、arg変数から受け取ったユーザーのメッセージを指定のルール通りに分割して
CommandFieldsの配列にぶちこんでおき、後程それをswitch文で分岐してユーザーが発したコマンドを仕分ける構造になっています(はずです)

これが仕分け作業のコードの一部です
ここはコメントを入れているので説明は省略します
一応クザカ沸きメッセージの送信のところは、
status_chというローカル変数を作ってそれにDiscordサーバーIDとメッセージを送信したいチャンネルのIDを渡して、
そのローカル変数でメッセージ送信(SendMessageAsync())することでメッセージを受け取ったチャンネルとは別のチャンネルに
ボス状況のリストを展開しています。

こちらもユーザーから受け取ったメッセージの解釈作業の部分です。
BOTはここのstring配列にぶちこまれてる文字列を”ボスの情報を操作するコマンド”として解釈します。

 

以上、現状できているところの紹介でした。
出来れば、今日本鯖でワールドボスに良く通っている人にはこれを知ってほしいなと内心思ってます。
今後の進展をお楽しみに!