180名が参加するeスポーツ大会(ApexLegends)のDiscordサーバーを支える専用Bot

# 180名が参加するeスポーツ大会(ApexLegends)のDiscordサーバーを支える専用Bot
## 導入
この記事は社員の9割がゲーマーの会社エイプリルナイツAdventCalendar 12日目の記事です。

https://adventar.org/calendars/8003

- 最初に好きなクリスマスソングを記載するルールなんですが3本目なのでiTunesライブラリから検索してどうにかこうにか引っ張ってきました。
    - Christmas Baby / G.Love&SpecialSauce

<iframe width="560" height="315" src="https://www.youtube.com/embed/XHvfAG5Dg4M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

- 昨日書いたこちらの記事と少し関連します
    - これを書いて若干力尽きた感があるので今日はゆるめに書きます。 

https://qiita.com/shngmsw/private/d4c98f98db22070b714d


## GCD事業とcogme cupの紹介
- 弊社には[ゲーミングカルチャーデザイン事業部](https://april-knights.com/gaming_culture/)という他では絶対に耳にしない名前の部署があります。
- ミッションは **「ゲームという共通言語でコミュニケーションを活性化する」** という文化の普及です。
### cogme cupの概要
- [cogme cup](https://cogme.jp/cup)はその取組の1つであり、企業eスポーツ部を成立させるための成果発表の場です。
- ApexLegendsの大会で、1チーム3名20チームの合計60名で試合が行われます。
- 前々回のcogmecup＃4では予選が3ブロックあったので60チーム180名が同時進行で試合を行う大規模な大会となりました。

https://twitter.com/cogme_official/status/1526859798171779072?s=20&t=QCuEIPJp13e82oyMCWLVdQ

## オンライン大会運営に欠かせないDiscord
- オンラインで行うeスポーツ大会において絶対に欠かせない存在となっているのがDiscordです。主な用途は以下のとおりです。
    - エントリーから本番まで運営からの全体連絡、参加チームとの個別連絡窓口
    - 大会当日の進行連絡
    - 参加者同士のボイスチャット
    - 参加者同士の交流の場
## サーバー設計
- チャンネル構成
![スクリーンショット_121022_103525_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/e839cce6-d31d-8536-3fd7-5dcad06e4ae6.jpeg)

- ロール関連
    - Discordにおけるロールはユーザーごとに複数割り当てでき、チャンネル閲覧権限などを設定できる機能です。
    - 参加チームごとの専用ロール付与（権限設定に必要）
    - 予選ブロック、本戦のロール付与
        - 参加者に関係のないチャンネルを見せないため

## 「180名が参加する」は盛ってなくてむしろ最少人数、実際は手作業で捌ける規模じゃなくなってきたという話
- ここまではDiscordユーザーなら誰もが考える部分で特筆すべきことではないのですが、問題になるのは規模の大きさに比例して作業量が大きくなってしまう点です。
    - 1チーム3名～6名(リザーブメンバー含む)がサーバーに参加するため、60チームともなると200～300名ほどになります。
    - 1チーム増えるごとに必要な作業は以下のとおりです。
        - チームロールを作成
        - チームロールのみ閲覧可能なテキストチャンネルを作成
        - Discordにメンバーが参加するたびにIDを確認し、チームロールを付与
        - 大会当日用のボイスチャットチャンネルを作成
        - 大会当日用の専用ロールを予選ブロック別にチームメンバー全員に付与
    - これすべてDiscord上のGUIでポチポチ押しながら作業しないとできません。

## Botで自動化した部分
- チャンネル自動作成
    - チャンネル設計は事前にスプレッドシートで行います。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/85e7c052-b51a-8468-dc54-80401010e292.png)
    - CSVとしてダウンロードし、Botに投げれば自動で作成してくれる機能です。
        - 動いてる様子がこちら
![dicordmanager_half.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/21215b5f-86e7-ca0a-c323-964dbc0765d0.gif)
    - チャンネルごとにロールを割り当てればロール付与されたユーザーしか見れないようにする権限設定もやってくれます。
    ![dicordmanager_role.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/0f98dbc5-d752-400c-fe25-14a47cfa39e0.gif)

    - この部分を自動化
        - [x] チームロールを作成
        - [x] チームロールのみ閲覧可能なテキストチャンネルを作成
        - [x] 大会当日用のボイスチャットチャンネルを作成
    - このコードはprivateリポジトリですが、同じ機能を個人開発しているDiscordBotにも実装しているので実装が気になる方は確認してみてください。

https://github.com/shngmsw/ikabu/tree/stg/app/cmd/admin-cmd




- サーバー参加時のロール自動付与
    - inviteRoleという既存Botを利用
        - 招待リンクに付与したいロールを紐づけることができ、これから入ってくるユーザーに対しては参加したタイミングでロールを自動付与することができます。
        - 最初は既存Botを利用していたのですが登録できるロール数に制限があり、自作することにしました。
        - Githubに似たような機能を持ったBotを作成している方がいたのでForkしてカスタマイズして運用しています。
        - この部分を自動化
            - [x] Discordにメンバーが参加するたびにIDを確認し、チームロールを付与

        
https://github.com/april-knights-dev/discord-invite-role-bot


- コマンドでロール付与
    - 参加したユーザーにはチームロールが割り当てられますが、予選Aブロック、予選Bブロックというロールを各チームに付けたり外したりという作業も必要です。
    - 特定のロールがついているメンバーに新しくロールを付与するというコマンドを作成しました。
    ![スクリーンショット_121022_111458_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/1f64d0b7-26ab-e829-39f7-2eda850defda.jpeg)
    - 逆に予選が終わったタイミングでは予選Bというロールから予選Bロールを削除することも可能にしています。
        - 予選ロール自体を削除することでも後処理はできますが、誤って違うロールを付与してしまったときのために戻せるコマンドは必要です。
    ![スクリーンショット_121022_111603_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/267bb05a-8e57-8a50-635c-b6671f26aaf8.jpeg)
    - この部分を自動化
        - [x] 大会当日用の専用ロールを予選ブロック別にチームメンバー全員に付与

- 参加表明
  - cogme cupでは集合時間前に全員揃っていることを確認するため、チェックイン作業を行っています。
    - 以前は代表者にチーム名を添えてメッセージを送信してもらっていたのですが、初見の方でも分かりやすいよう、ボタンを押すだけでチェックインが可能なようにしています。
    - ボタンを押すと、名前と、チームロール名、日時が表示され、運営側でチェックインを確認しやすくなっています。
    ![dicordmanager_checkin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/d5f127f0-b141-c5ad-2b41-ce8cdc083c43.gif)
    - 実際の大会開催時のチェックインはこんな感じでした。
    ![スクリーンショット_121122_115745_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262707/fe2d6303-673b-484f-4c63-1a18e2b0cece.jpeg)

## 最後に
- 弊社のような規模の会社で国内最大規模の大会を運営できたのは、第1回の手作業からの積み上げがあったからだと思います。
     - 自動化するにあたって基本的には既存の手作業を置き換えるだけだったので、基礎となるオペレーションを作り上げてきて運用してきたイベント担当が要件定義を済ませてくれていたということですね。
    - また、社会人限定かつApexLegendsの大会ということで、Discordのリテラシーが高く、Botを導入してもすぐに順応していただける方が多く、運営する側もとても助かっております。
- DiscordBotについてはDiscord側のアップデートに追いつかずエラーが発生することもあり、改善点もまだまだありますので少しずつアップデートしていきたいと思っています。
- 今回は裏側で扱っているITエンジニアがeスポーツ大会で活躍できる部分にフォーカスを当ててお話していますが、番組内の仮想スタジオや、アセットのデザイン、試合中にチーム内VCを取り込んだりと、メインの配信も力を入れて制作しております。
    - そして一番大事なプレイヤーの方々のレベルが高く、とても見応えのある大会となってますので、ぜひ[大会アーカイブ](https://cogme.jp/cup/archives/5)をご覧いただけると幸いです。
- 今後も継続してApexLegendsの大会やscrimを開催していきますので、今まで知らなかった方は同僚をお誘いの上、ぜひ企業eスポーツ部登録をして大会Discordサーバーへお越しください。

https://media.cogme.jp/12042/