AutoMuteUs (Among Us の自動ミュート bot) のセルフホスティング

## はじめに

AutoMuteUs は Among Us を Discord で通話して遊ぶ際に自動でミュートのオンオフを行う bot です。有志によって非公式に開発されている OSS アプリケーションです。

https://github.com/denverquane/automuteus

[導入方法はいろいろあります](https://note.com/tokotokologlog/n/nfacd4553145c)が、この記事では自前環境での利用方法を説明します。

実際に動かすには以下の 2 つが必要です。

- bot アプリケーション ([AutoMuteUs](https://github.com/denverquane/automuteus))
- ゲーム状態をキャプチャするアプリケーション ([AmongUsCapture](https://github.com/denverquane/amonguscapture))

AmongUsCapture の動作環境は Windows に限定されます。Among Us 自体も AmongUsCapture と同じマシンで動いている必要があるため同様です。AutoMuteUs の推奨動作環境は Docker (docker-compose) です。後述の理由により、そのプロセスは Windows マシンから HTTP でアクセスできる必要があります。未検証ですが、Docker Desktop for Windows や WSL を使えば一台の Windows マシンでもできると思われます。

概念図はこんな感じです。Galactus については後で説明しますが、AutoMuteUs の補助的なアプリケーションです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/086196ba-8fcf-87be-2cbe-31c7b523db7a.png)


バージョンはそれぞれ現時点 (2020/12/19) で最新のものを使いました。

- AutoMuteUs 6.5.5
- AmongUsCapture 2.8.4

ところで、https://github.com/denverquane/automuteus で invite me をクリックすると、セルフホストせずともどこか (Heroku？有志運営？) のサーバーで動くフリーの bot が招待できます。それでもセルフホストする利点は安定性です。フリーの方を使ってみると、混んでいる時間帯は反応が悪く（なかなかミュート解除されない）ゲームの進行に影響が出ることがよくありました。自分で立てると実用的なレベルで動きます。その際必要な情報がまとまった日本語の記事が無かったのでこの記事を書きました。

なお、Docker を使わなくても、AutoMuteUs はしばらく前まで Windows 版が出ていたので古いバージョンを遡って使うという方法もあります。しかし、今は動くようですが、今後 Among Us や AmongUsCapture のアップデートによって動かなくなる可能性が高いです。実際、現時点 (2020/12/19) で不安定です。そうこう言っている間にゲーム上で通話できるようになるかなとも思いますが。

## AutoMuteUs の準備

git と docker-compose が使えるマシンで以下のコマンドを実行します。

```shell
git clone git@github.com:denverquane/automuteus.git
cd automuteus
cp sample.env .env # .env に docker-compose から参照される環境変数を記述する
vi .env # 下記の通り編集する
```

`.env` のうち設定が必須な項目は以下の 4 つです。残りは基本的にデフォルトのままにしてくだい。

```shell
AUTOMUTEUS_TAG=6.5.5
GALACTUS_TAG=2.4.1
DISCORD_BOT_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
GALACTUS_HOST=http://XXX.XXX.XXX.XXX:8123
```

`AUTOMUTEUS_TAG` と `GALACTUS_TAG` はそれぞれ AutoMuteUs と Galactus の、その時の最新バージョンを設定してください。

それぞれのリリース一覧:

- https://github.com/denverquane/automuteus/releases
- https://github.com/automuteus/galactus/releases

ここで [Galactus](https://github.com/automuteus/galactus) とは何か説明しておきます (動かすだけなら知らなくてもいいです)。サーバーで動く AutoMuteUs と手元の AmongUsCapture 間で通信する必要があるわけですが、それを補助するのが Galactus です。Galactus は連携に必要な URL を作成し、その URL を受ける HTTP サーバーを立て、bot を通して URL をユーザーに DM で送ります。そして、AmongUsCapture が動いているマシンからユーザーが URL にアクセスすることで連携されます。さらに、その後 WebSocket によりゲーム状態の通信を仲介をします。

`DISCORD_BOT_TOKEN` は自作した bot のものにします。自作とトークンの入手手順は https://github.com/denverquane/automuteus/blob/master/BOT_README.md に従えばよいです。ただし、内容がやや古く、今 `final.txt` というファイルは存在しません。`.env` を使う形に変更されたので `.env` に書いてください。

`GALACTUS_HOST` には、AmongUsCapture が起動する Windows マシンから見た、docker-compose で動かす Galactus プロセスへの URL を設定します。私はグローバル IP が払い出されている ConoHa の VPS を使いポートはデフォルトの 8123 のままにしたので、上記のような設定となりました。ファイアウォールで外部にポートを開くのを忘れずに。

詳しくないので試していませんが、WSL や Windows 版 Docker を使えば全て手元で完結するかもしれません。インターネットから見えるようにする必要もなく楽そうです。

最後に起動します。

```shell
docker-compose up -d
```

## Windows 側の準備

あとはセルフホストしない場合と同じです。

まず Windows で Among Us と AmongUsCapture を起動します。AmongUsCapture は https://github.com/denverquane/amonguscapture/releases から最新の .zip ファイルをダウンロードして、中の AmongUsCapture.exe を実行してください。

実行するとこのようなログが出力されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/340960a9-02cc-a78c-a6bd-3800500f2d22.png)
試しにフリープレイをやると画面下の Game status が LOBBY や TASK に切り替わったり、会議時にメンバーの死活がログに表示されたりすると思います。

必須ではありませんが、安定性のために Discord bot token を設定すると良いです (bot の管理者以外の人がトークン無しで利用することもできます)。`.env` に書いたのと同じものを入力し、SUBMIT してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/87994608-6cae-a712-c5e2-7fc27e35e502.png)
以下のようなログが出ていれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/0dc0a20f-c128-f666-8395-8f00a6555e86.png)
bot がいる Discord サーバーのチャットで `.au new` と打ってみると以下のようなメッセージが投稿されるとともに bot から DM が届くはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/a8399137-8d3b-e4ed-cf3b-faedfe551fdd.png)
DM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/24fb2806-fdab-ef5b-b28c-70fd39840408.png)

DM のリンクをクリックすると AmongUsCapture と連携され、`.au new` と打ったチャットのメッセージがゲームの状態に応じて更新されるようになります。以下は連携に成功したときの AmongUsCapture のログと Discord のメッセージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/3eba4992-c508-90d0-f4d7-3c4994d40b2c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/2720af89-4be5-7556-a7c2-f6e6413c4125.png)

キャラクターの色、`ROOM CODE` などがちゃんと反映されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56321/c5fdbd4c-9579-6a9d-73e5-ac2237682a1c.png)

`docker-compose logs -f` で様子を見て、変なログが見当たらないか確認してください。

ゲームをしてみて、ミュート状態がちゃんと更新されれば完了です！