【勝利の女神:NIKKE】ユニオンレイド支援用Discord Botを開発運用している話

おはようございます、こんにちは、こんばんは。かせりーといいます。
初めましての方は初めまして。
勝利の女神:NIKKE  皆さん楽しんでますか?自分もサービス開始初日から飽きずに楽しくプレイしています。

毎日欠かさずプレイしてきて、個人的には色々あるコンテンツの中でもユニオンレイドはお祭り感があって良いなと思ってます。
ただユニオンレイドってめっっちゃ疲れるんですよ、わかります?
誰がどの敵に挑むか、とか、ダメージ出すための模擬戦やらな・・・とか、それらを管理している人の時間泥棒問題とか・・・
(その辺は気楽にやっているところも多いのかなとは思いつつ)

自分の所属しているユニオンはがっつりユニオンレイドに力を入れているところでして、所属されている皆様のパワーによりチャレンジャーランクの恩恵を享受させていただいております。
ただ、大体2-3シーズンくらいやったあたりで「あっこれ何とかしないと管理する人も戦う人もしんどいな」という雰囲気が漂い始めたので、ユニオンマスターの方と相談してタイトルの通りDiscord Botを開発することに決めました。

この記事を書く目的

初めに明言しますが、 技術的な問題 + サポートの負荷が高いのでBOTは配布しません。(というより、できません)

その上でDiscord Botを開発したいという方がこの記事を見た際に、道標として何を作ればいいか、どんな機能を利用しているのかがわかるようにするのが目的です。
自分がBotの開発参考にしたのはプリンセスコネクト!Re:Diveの凸管理Botの記事でした。
NIKKEに限らず、今後ゲーム用管理Botを作る上でこうしたらいいんだな、というのがわかると良いのかなぁと考えています。
Botの初期設定などについては既に記事が大量にあるので割愛します。

Discord Botについて

全知全能のマイティーツールズであるリターちゃんがユニオンレイドを管理してくれてます。

何ができるの?

  • 凸予約 / 凸削除 / 凸ダメージ報告

    • 誰がどのボスに攻撃するかダメージ込みで予約できる

    • 予約の削除ができる

    • 実際に与えたダメージを報告できる

  • メッセージ

    • 実際に与えたダメージの報告を元に3回攻撃した人、してない人が常にリストで表示され、自動で更新される

    • 朝5時の更新タイミングで自動で表示内容がリセットされる

    • 実際に与えたダメージや予約されているダメージを表示し、ボスの残りHPや現在の状況が自動で表示・更新される

    • スレッドを自動で作成し、ログの吐き出しとメンションを行う

  • メンション

    • ボスが撃破された際に次のボスの予約者に自動でメンションが送られる

    • 指定されたボスの予約者をメンションで募集できる

    • まだ3回攻撃してない人にメンションを送れる

あたりが主な機能になります。
それ以外にも管理用のスラッシュコマンドがいくつかあり、ダメージ数値などゲーム内と誤差が出てしまうタイミングで手直しができるようにしています。

開発環境について

  • Python 3.1

  • Heroku

    • クラウド環境利用のため

    • 有料なので維持費が毎月5$くらいかかります

  • Discord.py

    • テンプレートとしてこちらを利用させていただきました

  • gspread 5.7.x

    • スプレッドシート操作用ライブラリです

機能ごとの話

凸予約 / 凸削除 / 凸ダメージ報告

基本的に、モーダル機能を利用してデータを送信する仕組みにしています。
特定のチャンネルに送信されたボタンを押すとこのモーダルが開き、送信されることでデータが保存され、適切にUIを更新します。

これは凸予約画面
これは凸ダメージ確定画面

メッセージ

ユニオンレイドの状況を見られるようなメッセージ群です。
大まかに2つのメッセージが常に管理されており、3凸管理メッセージとボスステータスメッセージがあります。
3凸管理メッセージは朝5時にリターの「ユニオンレイド*日目じゃ!!!」と共にリセットされます(かわいい)

3凸管理メッセージ
この下にズラーっと名前が並んでいるようなイメージ
こちらはEmbedを利用して、自動でレイアウトをしています
ボスステータスメッセージ
予約ダメージや実際のダメージなど管理してくれます
予約が増えるとどんどんメッセージが縦に伸びていくような感じ
こちらはEmbedではなく、普通のブロック分けメッセージです

ユニオンレイド開始時にスレッドが自動で作成され、ログやメンションがわかるようになっています。

自動で作成されたスレッド
特にログのスレッドは絶対に作っておいた方が良さそうだった
誰が今何をしているのか、を追うことができるため

メンション

Discordを利用している人で詳しい人であれば、「ロールへのメンション」を利用している方もいらっしゃると思います。
基本的にロールへのメンションを利用して、メッセージに含めることでメンションを実現しています。

スラッシュコマンド

管理用で用意しています。レイドの開始やリセットなどのBotを使用する側から手の届かない部分を操作するために使用しています。
スラッシュコマンドはBotが見える全ユーザーから操作可能なため、操作権限をロール対象などにしておくと外部の方が使用する事故を防ぐことができます。(プログラム側で書いておいてください)

5月のユニオンレイドで実際に運用してみた

  • 運用中に結構色々バグが出たものの、なんとかなった

  • Discordが一瞬鯖落ちして凄まじい冷や汗をかいた

  • ダメージ計算が複雑になるレイド後半(6-7レベルくらい)になるにつれ本領発揮

    • 4月のレイドと比べて2時間早く凸が回った

  • 凸管理者が離席してもうまいこと回ったので負担も軽減

  • 初日完走達成(嬉しい)

アンケートも取ってみましたが満足度は高かったようです、よかった。

大満足

技術的な話

DBについて(gspread)

結構重要なポイントですが、クラウドサーバー上でpythonプログラムを動かす場合特定のタイミングで再起動がかかる環境があります。
今回利用したHerokuでは時刻設定は可能なものの、毎日必ず一度再起動がかかり、保存していたデータが吹き飛びます。
これを回避するためにはデータをDBに保存することが必須で、今回は手軽さや管理者がデータを直操作してバグ回避出来ることなどを考えてスプレッドシートでDBを作成しました。
スプレッドシート操作用のライブラリは公開されていたので、そちらを利用しています。

APIリクエスト数の上限到達

スプレッドシートの操作を行うリクエストの回数は毎分100回までと定められているのですが、I/O(読み込み書き出し)を適当にやるとすぐ上限に到達し、1分間APIを受け付けなくなります。
これは1分1秒を争うユニオンレイドでは致命的な不具合になりうるので、I/Oの回数を極力減らすためにスプレッドシートのデータは一括読み込み、一括書き出しを徹底しました。
大体レイドのピーク時で50回/分程度に収まっています。

Discord.py 開発が終了してる件

オープンソースのコードあるある、既に時代が終わっている。
pythonをほとんど使用したことが無かったのとDiscord Botを開発するのが初めての経験だったので、環境の策定を適当にやってしまいました。
結果としてDiscord.pyのAPIとWebに転がっている技術記事のサンプルコードにかなり齟齬があり、四苦八苦しました;
環境を策定する場合はまず先にどのライブラリを利用するかを事前にチェックしましょう。
これのせいでGWが消えました、3日くらいで見積もってたのに・・・

まとめ

ユニオンのチャットツールとしてDiscordを利用している場合、Botを作成することでレイドの管理の手間が減らせます。
幸いにもその道の先人がたくさんいるので、作成の際に壁があっても乗り越えることは可能だと思います。
自分も今回pythonほぼ初心者、Discord Bot開発未経験から始め、形にすることができました。

もし「自分も作ってみるぜ!」という方がいて、開発中に困ったことがあれば力になるので 

https://twitter.com/hieharu3216

までDMいただければできる範囲で対応します。
もしくはDiscordで見かけたらDMどうぞ。

宣伝(2023/06/13現在)

現在私がサブマスターをさせていただいているユニオン「LUX」ではメンバーを募集しております!興味がある方はぜひご連絡ください!

  • Hard 13章到達者、戦力不問です。普段のノルマもありません

  • レイドの凸は自分の時間に合わせて消化できます

  • 協同作戦やソロレイドの攻略が盛んです

    • キャンペーンやトライブタワー攻略も動画で共有されています

  • 育成方針の相談所あり!趣味育成攻略されている方も多数在籍中

  • Discordの参加だけ必須です

高機能って書かれると若干恥ずかしくないですか?

この記事が気に入ったらサポートをしてみませんか?