WindowsPC1台でAutoMuteUsをセルフホスティング~後編:AutoMuteUsの導入と運用~【AmongUs】

# はじめに
　本記事は「[WindowsPC1台でAutoMuteUsをセルフホスティング~前編:Docker for Windowsの準備と導入~【AmongUs】](https://qiita.com/yukuduri/items/370c966864901e1429ef "WindowsPC1台でAutoMuteUsをセルフホスティング~前編:Docker for Windowsの準備と導入~【AmongUs】 - Qiita")」からの続きです。以下、この記事のことを「前編記事」と呼びます。

本記事では、以下の内容を取扱います

1.　~~Docker for Windowsの導入~~ →前編記事を参照
2.　**Discord Botの準備**
3.　**AutoMuteUsの導入と運用**

　また、前編記事で記載した動作環境を満たしており、既にDockerをWindowsにインストール済みのものとします。まだ導入されていない場合は「`Docker for Windows`」を前編記事を参照するなどして導入を済ませてください。

# 2. Discord Botの準備
　この手順では、Discord Botを作成し、お使いのDiscordサーバー（以下、`DC鯖`と呼びます）に追加します。追加済みの方でも、もし**「管理者(Adminstrator)権限」をbotに与えている**、並びに「管理者権限」が**よくわからない場合は `2.2.2.項 Botに与える権限` を確認した上で** 3項 に進んでください。

## 2.1. Discord Botの作成
### 2.1.1. Discord Botアプリケーションの追加
　Discord Botアプリケーションを作成します。まず、以下のリンクからDiscord開発者ポータルにアクセスします。ログインが求められたら、「AmongUs」のプレイの際に使用しているDiscordアカウントでログインします。ログイン済みの方は何も出ないと思います。

- [Discord Developer Portal — My Applications](https://discord.com/developers/applications "Discord Developer Portal — My Applications")

ログインが完了すると、このような画面になります（今後、サイトデザインは変更される可能性があります）。2021/06/26現在、日本語化されていません。
![discordbot_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/1aad7c5c-f415-f15a-9f66-cf10e1c203e7.jpeg)
右上の「`New Application`」をクリックします。
![discordbot_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/c00ae4dd-996c-5a74-35bd-96c961606272.jpeg)
このようなウインドウが出るので、上記のように、`NAME*` の下の入力欄に「AutoMuteUs」と入力します（好きな文字でもいいですが、Discord開発者ポータルのトップページに並びますので、わかりやすい名前にしてください）。入力が終わればすぐ右下の「`Create`」をクリックします。
![discordbot_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/71f3c8a3-2be6-d400-8b00-e51d92e653df.jpeg)
このようなページが開きます。ここには特に何も記入しなくて構いませんが、このページの「`APPLICATION ID`」「`PUBLIC KEY`」
は**絶対に外部に漏らさない**でください。部外者に**Botを乗っ取られる**可能性がありますので。

　尚、上記画像真ん中の「`APP ICON`」にある写真マークをクリックしてファイルをアップロードすると、Discord開発者ポータルのトップページで表示されるアイコンを付けることができます。ポータルトップにアイコンが表示されるので、識別が容易になります。今回は何も追加せずに進めます。

### 2.1.2. Botの作成
　次に、左の「General Information」「OAuth2」「Bot」…と並ぶメニューから「`Bot`」をクリックします。
![discordbot_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/747feed3-8035-6338-c2c9-62c7644ea8ed.jpeg)
このような画面が開いたら、「Build-A-Bot」の右下の方にある「`Add Bot`」をクリックします。
![discordbot_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/4f902418-72f6-00a4-b4f2-27972f982dc1.jpeg)
「このアプリケーションにBotを追加します。この操作は取り消せません」という旨のウインドウが開きます。「`Yes, do it!`」を押します。
![discordbot_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/f34d38d1-1964-cf09-9ab2-4a9e3a6ce691.jpeg)
この画面で、Botの設定を行います（ユーザー識別番号となる「#XXXX」は隠しています）。この画面にある「`TOKEN`(トークン)」は**絶対に外部に漏らさないで**ください。**Botが部外者に乗っ取られます**。

　万一、トークン漏れてしまったもしくはその疑いがある場合、「`Regenerate`」を押してください。 トークンが再生成されます。その場合、既にトークンをAutoMuteUsに設定している（後の手順で説明します）のなら再度新しいものに設定し直してください。

- 「`ICON`」「`USERNAME`」でそれぞれBotのアイコンとユーザー名を設定できます。これは、DC鯖内やDM時などで他のユーザーと同じように表示されます。
- 「`PUBLIC BOT`」がオンになっていると、誰でもこのBotを追加できるようになります。オフにすると、今Discord開発者ポータルにログインしているアカウントの人しかBotを追加できなくなります。

### 2.1.3. `PUBLIC BOT`の無効化
　セキュリティの観点から、「`PUBLIC BOT`」のオフを推奨します。あなたが導入したいDC鯖内でBotを追加する権限を持っている限りは。以下のように確認します。

- DC鯖のサーバー管理人
  - DC鯖内で以下のように、名前の最右に「黄色い王冠」マークがある人はサーバー管理人です。名前の文字色は関係ありません。![discordserver_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/e7351c8c-c37a-b12c-ba33-3b942d967cfe.jpeg)

  - この場合、Botを追加する権限を持っています。
- DC鯖内で「サーバー管理」の権限を持っている
  - サーバー管理人でなくても、DC鯖内で以下のような「サーバー管理」の権限を持っていれば、Botを追加できます。![discordserver_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/d6e545fb-4639-89de-49d8-1a44988ba0ca.jpeg)
  - 尚、以下のような「管理者」の権限がある場合、すべての設定を無視してすべての権限が与えられます。つまり、Botを追加できます。![discordserver_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/1ff4b9d7-2351-fc8a-1787-4afc64de6ac4.jpeg)

- DC鯖内で「サーバー管理」の権限を持っていない/わからない
  - DC鯖内で「サーバー管理」の権限を持っていないと、Botの追加ができません。わからない場合は、DC鯖の管理者に聞いてください。DC鯖によってロールなど運用方法が異なります。上記の「サーバー管理人」に聞くのが確実です。
  - Botを追加する権限がない場合は、「`PUBLIC BOT`」をオンにしたまま、権限のある人にサーバーへの追加をやってもらう（後の手順で説明します）か、本記事を見せて権限のある人にBotの追加までをお願いしてください。

　あなたが「サーバー管理」の権限を持っているならば、「`PUBLIC BOT`」をオフにします。
![discordbot_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/daf2ee79-f2c1-4761-0933-d0f0c2ee740d.jpeg)
「オフ」に変更するとページ最下部にこのように「注意―変更は保存されていません」という旨のメッセージが表示されるので、「`Save Changes`」をクリックします。これをしない限り設定が保存されません。

## 2.2. Discord Botをサーバーに追加
### 2.2.1. Botのサーバーへの招待
　Botが作成できたら、「AmongUs」のプレイで利用するDC鯖にBotを追加します。先程の画面で、左のメニューから「`OAuth2`」をクリックします。
![discordbot_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/b51051b3-6b5c-816c-c093-3f3a80c9046d.jpeg)
このような画面が開きます。この画面にある「`CLIENT ID`」「`CLIENT SECRET`」は**絶対に外部に漏らさないで**ください。**Botが部外者に乗っ取られます**。万一、`CLIENT SECRET`が漏れてしまったもしくはその疑いがある場合、「`Regenerate`」を押してください。再生成されます。

　次に、画面を一番下までスクロールします。
![discordbot_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/333dab6f-64b7-f1f2-2844-743ee06dd9ed.jpeg)
上記画像赤枠内の箇所にある「`bot`」のすぐ左の□をクリックしてチェックを入れます。すると、下に「`BOT PERMISSIONS`」という項目が追加されるので下にスクロールします。「`BOT PERMISSIONS`」の文字のあるすぐ上にURLが表示されますが、これを**外部に漏らさないで**ください。前述した「`PUBLIC BOT`」が有効化されていると、そのURLで**部外者が勝手に**Botをあなたと**無関係なサーバーに追加**できてしまいます。

　「`BOT PERMISSIONS`」では、Botに与える権限を設定します。「Adminstrator」にチェックを入れてしまうと全ての設定を無視して全ての権限が付与されてしまい、**非常に危険です**。**絶対に「Adminstrator」にはチェックを入れないで**ください。ここでBotに設定する権限の内容と合わせて、次項（2.2.2）で詳しく解説します。

　「`BOT PERMISSIONS`」で**以下の画像で選択している12項目**にチェックを入れます。
![discordbot_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/edc33ad2-5d0b-bf64-87f9-9273ec9e7854.jpeg)
「`BOT PERMISSIONS`」の文字のあるすぐ上に生成されるURLの末尾が「**permissions=3251071040&scope=bot**」となっていることを確認してください。
（⚠ permissions=8&scope=botとなっている状態では**絶対にこの先に進まないでください！** ⚠）

　末尾が「**permissions=3251071040&scope=bot**」となっていることを確認できたら、URL右の「`Copy`」をクリックしてください。クリップボードにURLが入るので、ブラウザのアドレスバーに右クリックメニューもしくは「Ctrl+V」で「貼り付け」てそのURLを開いてください。
![discordbot_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/90bfc1ad-4820-90df-b3d7-730110571ee8.jpeg)
このようなページが開くかと思います。「サーバーに追加:」のすぐ下の「`サーバーを選択`」をクリックして「AmongUs」のプレイで利用するDC鯖を選択してください。
![discordbot_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/590ded07-8189-4f54-14d9-fa61fe5b9293.jpeg)
選択できたら、追加したいDC鯖の名前（この画像では「ゆくどり's bot test」）であることを確認し「`はい`」をクリックします。
![discordbot_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/422ed209-376c-ebe2-420b-e89d64b8f0ef.jpeg)
このような画面になります。Botに与える権限を確認して下にスクロールします。
（この画面では権限を変更できません。変更するには、前の手順へ戻り再度URLを生成する必要があります。これらの権限を設定する理由は次項 2.2.2 を参照してください）
![discordbot_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/c36f8f80-1711-2ae0-e72d-05a5db4d2fe4.jpeg)
最下部の「`認証`」をクリックします。
![discordbot_15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/e0dac047-71f4-1db0-874a-3c51da6b9511.jpeg)
Captcha認証ボタンが出ます。「私は人間です」をクリックします。もしクリックした時に何か表示されたら画面の指示に従ってください。
（AIや自動的にWebを徘徊するようなボットではないかどうかの確認です。たとえ天使や悪魔、獣人だとしてもヒトガタならクリックしても問題ないでしょう。あなたがボットではない限り。あ、もし猫耳の獣人の方がいればコメントなどでお声がけください。猫耳好きの筆者がもふもふしに行きます）
![discordbot_16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/a02cf41f-f420-2e3b-f7d6-24aeda1e758c.jpeg)
「認証しました」のメッセージと同時に、作成したBotがDC鯖に参加します。
![discordserver_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/1bb40186-bcb3-d039-1f91-62c278cd08e1.jpeg)


### 2.2.2. Botに与える権限
＊＊＊＊＊＊
**※この 2.2.2項 は興味のある方のみお読みください。技術的なことがわからない人でもある程度読めるようにはしてあります。興味がなければ読み飛ばして次の 3項に飛んでいただき問題ありません。**
＊＊＊＊＊＊

　これにてDiscord BotがあなたのDC鯖に追加されました。おめでとうございます。あるいは、既にBotを追加されていてこちらに飛んできた方ですか？ありがとうございます。はい。管理者権限についてのサポートをご希望ですか？かしこまりました。これより順を追って説明して参ります。

　AutoMuteUsの公式マニュアル他、多くのサイトでは、Botに「`Adminstrator`（管理者）」の権限を渡すように案内しています。しかし、これは**大変危険な行為**です。もしやすると、ご自身で全てプログラムを組まれている開発者の方ですか？

　開発者の方なら、自身でどういう動作をするか全て把握されてますので危険なプログラムを書かない限り問題ないですよね。

　あら、そうではない方でしたでしょうか？大変失礼いたしました。では、そのBotが具体的にどういう動作をするのかというのを理解されていますか？Botのその全てをご存知でしょうか？

　すみません、少し意地悪な言い方をしてしまいました。

　「`Adminstrator`（管理者）」の権限を渡すということは、全ての権限を付与することになります。これが意味するのは、例えばDC鯖内の**メンバーを勝手にBAN**したり、**勝手にサーバーの設定を変更**したりといった荒らし行為などが、理論上できてしまうというわけです。

　ただ、あくまで理論上の話です。普通はそんな**悪質なBotはいない**と思いますが、全てのBotに対して**その保証はできません**。尚、既にBotを管理者権限で入れてしまっている方、さぞ不安なことでしょう。しかし権限をDiscordのサーバー設定から変更することはできません。困りましたね。

　いいえ、大丈夫です。前項2.2.1項に戻り、上記手順で権限を選択した後に再度招待URLを生成し、参加させます（今参加しているものとは別のアプリケーションのBotを入れないようご注意）。こうすることで、権限が上書きされます（一度DC鯖からキックする必要があると思っていましたが、入ったまま再度参加させるURLを踏むと上書きされました）。

　以上のような理由で、本記事ではある程度権限を絞ってBotをDC鯖に追加する手法を紹介しました。公式マニュアルですら管理者権限を要求しているので、筆者がBotが必要な最小限の機能を推測し、実際にその設定で動作することを確認している権限です。

以下は本記事で与えている権限のリストです。名前を見てわかるようなものは権限の内容の説明を省いています。

| 権限名 | 公式日本語訳 | 動作 |
|---|---|---|
| Manage Emojis | 絵文字の管理 | サーバー絵文字の追加や削除など。「AutoMuteUs」では、専用の絵文字を利用します。 |
| Send Messages | メッセージを送信 | この権限がないとBotはメッセージを送信できません。 |
| Manage Messages | メッセージの管理 | 自分（ここではBot自身）以外のメッセージの削除が可能になります。「AutoMuteUs」では、ユーザーがBotを呼び出すコマンド（後述）を送信したメッセージを、動作終了時に自身のメッセージとともに削除します。 |
| Embed Links | 埋め込みリンク | 埋込みメッセージを送信します。 「AutoMuteUs」Botがメッセージを送る際にこの埋込みメッセージを利用するため必要です。|
| Read Message History | メッセージ履歴を読む | 「AutoMuteUs」ではメッセージの削除の際に必要だろうということで追加しています。|
| Mention Everyone | `@everyone`、`@here`、<br>全てのロールにメンション | 「AutoMuteUs」では今のところ利用していませんが、今後のアップデートのことも考えてあっても困らないだろうと追加しています。 |
| Use External Emojis | 外部の絵文字の使用 | オプションになりますが、「AutoMuteUs」のBotを複数のDC鯖で運用する際、1つ以上のDC鯖に絵文字が入っていればそのDC鯖の絵文字を他のところで利用することもできます。その際に必要な権限です。 |
| Add Reactions | リアクションの追加 | 「AutoMuteUs」では、自身のメッセージに独自の絵文字でリアクションを追加し、DC鯖内のメンバーとAmongUsプレイヤーの色の紐付けに利用します。 |
| Use Slash Commands | スラッシュコマンドを使用 | 2021/4/5にDiscordに追加された新機能。<br>現在、「AutoMuteUs」では「!au help」といった'!'で始まるメッセージを送信することで擬似的なコマンドとしてBotを動作せせていますが、この機能を使うと'/'で始まる公式にサポートされたコマンドが利用できます。<br>今のところ「AutoMuteUs」では利用していませんが、今後これを使うように変更される可能性もあるので追加しておきました。 |
| Mute Members | メンバーをミュート | これがないとミュートBotなのにミュートできない。 |
| Deafen Members | メンバーのスピーカーを<br>ミュート | 以下同文。 |
| Move Members | メンバーを移動 | メンバーを別のボイスチャンネルに移動できます。「AutoMuteUs」では多分使わないと思いますが、今後のアップデート次第では使うかもと思って一応入れておきました。 |

（わかる方向け、というか**Discord Bot開発者向け**：
ここでは筆者が必要最低限な権限を推測した上で選出し提示していますが、**本来は開発者が提示すべき**ものです。また、権限を変更する手順が多少手間なことから、今後実装予定の機能で未実装であっても必要であろう権限を含めて提示してもいいかもしれません。新たな権限が必要になったならその際にユーザーに教えてあげてください。）

# 3. AutoMuteUsの導入と運用

　さて、これであとはAutoMuteUsを導入していきます。まず「とりあえず使えればいい」という方向けに実際の運用まで解説したあと、最後に技術的な面を含めて簡単に補足します。尚、前編記事で「Docker」をWindowsにインストール済みのものとします。

## 3.1. ファイルの準備
　尚、この項で解説するものは `AutoMuteUs` Ver `6.15.1`のみで動作を確認しています。万一動かない場合、3.4項の「技術的解説」を参照してください。

### 3.1.1. 下準備
　エクスプローラーを開いて、どこでもいいので「AutoMuteUs」などわかりやすい名前のフォルダを作成してください。特にコダワリがなければ別にデスクトップでも大丈夫です。作成できたらそのフォルダを開いてください。尚、以前Dockerでセルフホスティングしたことがある場合は`.env`と`docker-compose.yml`を書き換えるだけで構いません。
（※注意：複数のBotアプリケーションを作成し、別々に運用する場合は必ずフォルダ名をそれぞれ違うものにしてください。毎回トークンを書き換えて運用するとかなら問題ないです。）
![explorer_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/4f6a8037-e4f7-f6f6-cd25-41b756674029.jpeg)
筆者はCドライブの空き容量が少ないので、このようにDドライブ直下に作成しました。

　次に、この先の手順で重要になるので、Windowsの設定を確認します。以下のように、エクスプローラーのウインドウ上部「表示」（画像内①）→「ファイル名拡張子」（画像内②）にチェックをが入って無ければ入れます（Windowsのデフォルト設定では入っていません）。
![explorer_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/84dc372d-e4db-cd9b-3abd-818d15610b1a.jpeg)
この設定により、全てのファイルの拡張子（`.jpg`や`.png`、`.mp3`、`.mp4`、`.exe`、`.txt`など）が表示されるようになります。この設定、画像だと思わせて実はウイルスのインストールする実行ファイル（`.exe`や`.msi`など）だった、などという被害を防ぐこともできますので**セキュリティ的にもチェック推奨**です。
（いい加減、OSのデフォルト設定でONにしてくれ…。余談ですが、WordやExcelファイルのマクロにウイルスが組まれることもあるので拡張子見えるからと言っても油断はできません。本筋ではないので気になる方は[ググって](https://www.google.com/search?q=Word+Excel+%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9)ください。）

### 3.1.2. ファイル作成
　ここから、「AutoMuteUs」を利用するためのファイルを準備していきます。尚、単純に**コピペではなく**、いくつか**変更する必要**があるのでちゃんと読んでくださいね。それで動かないとか言われても私は知りません。**記事内に書いてあることならコメントなども返信しません**。
（記事内にちゃんと説明書いていても、何も読まずに適当にコピペするだけの方が一定数いるのを把握しています。私の友人がその1人でしたので。）

　先ほど作成したフォルダの中に、2つファイルを作成します。ここからは、メモ帳を使って作成する手順を紹介します。お好きなテキストエディタがある方はそちらをご利用ください。
（わかる方向け：今回、メモ帳でGUIから簡単に開くために全て拡張子を.txtにしていますが、拡張子を.txtにしなくても編集や作成できるエディタをご利用の場合は.txtの文字列は最初から付けなくて大丈夫です）

　ファイルが何も無いところで右クリック→メニューから「新規作成」→「テキスト ドキュメント」でテキストファイルを作成します。
![explorer_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/bedb3407-5a10-98e8-0199-07873dc4ca78.jpeg)
ファイル名を「`docker-compose.yml.txt`」にします。尚、既に「ファイル名拡張子」を表示するよう設定してもらったので、この画像のようにデフォルトでは「新しいテキストドキュメント.txt」になるはずです。「新しいテキストドキュメント」としか見えていないなら先ほど説明した手順を再確認してください。

　できたら、同様にして「`.env.txt`」というテキストファイルも作成してください。
![explorer_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/4dd5bf57-ea33-4f21-4936-1971072bdfc5.jpeg)
できましたか？この手順で触れない部分の設定項目については、3.4項を参照してください。ではまず、一部書き換える必要のある`.env.txt`から先に作成しましょう。`.env.txt`をダブルクリックしてメモ帳を開きます。
（デフォルトではメモ帳が開くはずですが、この際エディタなら何でもいいです。）
![memo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/9f335b55-2089-6a4a-8833-275d5b4e848d.jpeg)

以下を全て（「# Please refer to ~」から「POSTGRES_ADDR= ~」まで）コピーして貼り付けてください。

```env:.env
# Please refer to the latest versions of Galactus and AutoMuteUs when specifying these versions:
# Automuteus: https://github.com/denverquane/automuteus/releases
# or https://hub.docker.com/repository/docker/denverquane/amongusdiscord/tags?page=1&ordering=last_updated

# Galactus: https://github.com/automuteus/galactus/releases
# or https://hub.docker.com/repository/docker/automuteus/galactus/tags?page=1&ordering=last_updated

AUTOMUTEUS_TAG=6.15.1
GALACTUS_TAG=2.4.1

# change these, but see comment below about HOST/PORT
DISCORD_BOT_TOKEN=（※ここは本記事に従って書き換えてください！！！）
GALACTUS_HOST=http://localhost:8123
GALACTUS_EXTERNAL_PORT=8123

# recommend changing these to something more secure
POSTGRES_USER=postgres
POSTGRES_PASS=putsomesecretpasswordhere

# GALACTUS_HOST can include the port or not. If you don't include the port,
# it will default to :80/:443 depending on http:// v https://
# **Make sure that GALACTUS_EXTERNAL_PORT matches the Port for the above host, UNLESS you use a reverse proxy/nginx!!!**
# Ex: if GALACTUS_HOST=http://localhost, then GALACTUS_EXTERNAL_PORT should be 80 (HTTP)
# Ex: if GALACTUS_HOST=https://localhost, then GALACTUS_EXTERNAL_PORT should be 443 (HTTPS)
# Ex: if GALACTUS_HOST=http://localhost:8123, then GALACTUS_EXTERNAL_PORT should be 8123
# If you use a reverse proxy, then GALACTUS_HOST should have the port of your reverse proxy, and it should proxy to the
# GALACTUS_EXTERNAL_PORT (ex 443 -> 8123)

# Optional, leave alone by default
EMOJI_GUILD_ID=
# comma-separated
WORKER_BOT_TOKENS=
CAPTURE_TIMEOUT=
AUTOMUTEUS_LISTENING=

# DO NOT change these unless you really know what you're doing
BROKER_PORT=8123
GALACTUS_PORT=5858
GALACTUS_REDIS_ADDR=redis:6379
AUTOMUTEUS_REDIS_ADDR=redis:6379
GALACTUS_ADDR=http://galactus:5858
POSTGRES_ADDR=postgres:5432
```
貼り付けたら、一度「Ctrl+S」か左上メニューの「ファイル」→「上書き保存」で保存しておきましょう。

　次に、Discord Botのトークン（Botと連携するためのパスワードみたいなもの）というものを`.env.txt`に挿入します。[Discord開発者ポータル](https://discord.com/developers/applications "Discord Developer Portal — My Applications")を開きます。作成したApplicationsの一覧が出ますので、2項で作成したBotのアプリケーションを選択します。
![discordbot_17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/381aa2f0-cabb-6d33-11a4-9cc5de9d1fbe.jpeg)
左メニューから「`Bot`」をクリック
![discordbot_18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/9480b7b3-0b12-be86-c694-f6db8f94a2c7.jpeg)
アイコン画像の右あたりにある「TOKEN」「Click to Reveal Token」のすぐ下にある「`Copy`」をクリックします。トークンがコピーされるので、先程メモ帳で開いた`.env.txt`の中から、

```
DISCORD_BOT_TOKEN=（※ここは本記事に従って書き換えてください！！！）
```
の行を探し、「（※ここは本記事に従って書き換えてください！！！）」を削除し貼り付けてください。
![memo_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/4071671a-b380-f547-6aaf-ba6a880f5e8d.jpeg)
終われば上書き保存を忘れずに！

　それでは、「`docker-compose.yml.txt`」を作成しましょう。先ほど同様に「`docker-compose.yml.txt`」をメモ帳で開き、以下を全て（「version: "3"」から「  postgres-data:」まで）コピーして貼り付けます。

**（2021/07/05修正：以下の`docker-compose.yml`の内容を修正しました。）**

```yml:docker-compose.yml
version: "3"

services:
  automuteus:
    # Either:
    # - Use a prebuilt image
    image: denverquane/amongusdiscord:${AUTOMUTEUS_TAG:?err}
    # - Build image from local source
    #build: .
    # - Build image from github directly
    #build: http://github.com/denverquane/automuteus.git
    restart: unless-stopped
    ports:
      # 5000 is the default service port
      # Format is HostPort:ContainerPort
      - ${SERVICE_PORT:-5000}:5000
    environment:
      # These are required and will fail if not present
      - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}
      - HOST=${GALACTUS_HOST:?err}
      - POSTGRES_USER=${POSTGRES_USER:?err}
      - POSTGRES_PASS=${POSTGRES_PASS:?err}

      # These Variables are optional
      - WORKER_BOT_TOKENS=${WORKER_BOT_TOKENS:-}
      - EMOJI_GUILD_ID=${EMOJI_GUILD_ID:-}
      - CAPTURE_TIMEOUT=${CAPTURE_TIMEOUT:-}
      - AUTOMUTEUS_LISTENING=${AUTOMUTEUS_LISTENING:-}

      # Do **NOT** change this
      - REDIS_ADDR=${AUTOMUTEUS_REDIS_ADDR}
      - GALACTUS_ADDR=${GALACTUS_ADDR}
      - POSTGRES_ADDR=${POSTGRES_ADDR}
    depends_on:
      - redis
      - galactus
      - postgres
    volumes:
      - "bot-logs:/app/logs"
  galactus:
    ports:
      # See sample.env for details, but in general, match the GALACTUS_EXTERNAL_PORT w/ the GALACTUS_HOST's port
      - ${GALACTUS_EXTERNAL_PORT:-8123}:${BROKER_PORT}
    image: automuteus/galactus:${GALACTUS_TAG:?err}
    restart: unless-stopped
    environment:
      # Do **NOT** change these
      - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}
      - BROKER_PORT=${BROKER_PORT}
      - REDIS_ADDR=${GALACTUS_REDIS_ADDR}
      - GALACTUS_PORT=${GALACTUS_PORT}
    depends_on:
      - redis

  redis:
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - "redis-data:/data"

  postgres:
    image: postgres:12-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASS}
    volumes:
      - "postgres-data:/var/lib/postgresql/data"

volumes:
  bot-logs:
  redis-data:
  postgres-data:
```
上書き保存を忘れずに！
（わかる方向け：~~上記コードでは「restart: always」を全てコメントアウトしています。~~　**`restart: unless-stopped`に変更しました。**詳細は3.4項で。）

　どちらも保存が終われば、ファイルの拡張子を変更します。エクスプローラーで「`.env.txt`」を一度クリックで選択した状態で、名前の部分をもう一度クリックするor右クリック→「名前の変更」で「.txt」を削除し「`.env`」だけにします。
![explorer_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/c28be43d-34a3-a26b-00c4-bd4b38425f30.jpeg)
「Enter」キーを押します。以下のような警告は出ますが、今回は問題ないので「`はい`」を押してください。
![explorer_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/6383f710-30d7-985b-cde4-5016b3380bad.jpeg)
同様にして、「`docker-compose.yml.txt`」の`.txt`を削除し「`docker-compose.yml`」にします。
![explorer_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/e41b2860-eded-801f-cf3a-c9d8d21a0930.jpeg)
筆者の環境ではテキストをエディタが入っている関係で`docker-compose.yml`の左横にアイコン出てますが、特にエディタなどがなければ`.env`の左横のようなアイコンになると思います。

　尚、この時点から、エディタなどが入っていない限り、デフォルト設定ではメモ帳で編集できなくなります。編集したい場合は、再度拡張子「`.txt`」を付けて開くか、ファイルを選択状態にして右クリック→「プログラムで開く」から、お好きなエディタを選んで開いてください（メモ帳でも大丈夫）。
![explorer_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/97152312-9045-9465-ce5a-803d1d2ad61b.jpeg)

## 3.2. 「AutoMuteUs」の導入
この先の手順では、「Docker for Windows」が起動している必要があります。Docker Desktopの設定で自動起動にしている場合はPC起動時にDockerは起動していると思います。わからない場合はとりあえずタスクバー左下の検索バーに「Docker」と打って「Docker Desktop」を起動しておけば大丈夫です。
### 3.2.1. 「PowerShell」の起動
　本記事では前編記事でもお伝えしたとおり、極力GUIを用いてきましたが、ここからはCUIが必要になります。先程「ファイルを作成したフォルダ」を開いた状態のエクスプローラーで、以下のように左上メニューから「ファイル」（画像内①）→「Windows PowerShellを開く」（画像内②）を押します。
![explorer_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/da61aa00-fd08-2508-6514-c5ddc93ca214.jpeg)
以下のような「PowerShell」のウインドウが立ち上がると思います。
![PowerShell_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/42c5389b-2aae-5575-e3ec-042b28d926d7.jpeg)
大丈夫なはずですが、`PS D:\AutoMuteUs>`のPS以下が`D:\AutoMuteUs`のように先ほど作成したディレクトリのパスになっていることを確認します。パスって何？って方は無視してもらって大丈夫です。
（わかる方向け：この手順を踏むことで、エクスプローラーで開いているディレクトリがカレントディレクトリの状態でPowerShellを起動できます。わざわざ`cd`コマンドで移動する必要がありません。）

### 3.2.2. Dockerを使って「AutoMuteUs」のインストール
　「Docker for Windows」が起動できていることを確認した後、以下の一文をコピーしてください。

```
docker-compose pull
```
先程の「PowerShell」のウインドウで「右クリック」して貼り付けます。
![PowerShell_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/14777c1b-48f1-8af5-c53d-6785f5856983.jpeg)
このようになれば、「Enter」を押します。
![PowerShell_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/efdef499-2dc6-b95a-22b3-8f7403025eae.jpeg)
しばらくの間は何も表示されませんが、待ちます。
![PowerShell_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/49ec0504-dc3e-1d90-d53f-5022dfffefcb.jpeg)
このようになれば、ダウンロードが開始します。一度ダウンロードしたことがあればすぐ終わりますが、初めての場合や、バージョンのアップデートがある場合にはかなり時間がかかります（インターネットの速度に影響されます）。もし暇ならカップラーメンでも作って食べるなどしてお待ち下さい。
![PowerShell_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/e90a8f24-b014-0b99-4832-c482a161a6be.jpeg)
終わるとこのように`done`と表示されます。

　これにて導入は完了しました。念の為、動作も確認しておきましょう。以下の一文をコピーします。

```
docker-compose up
```
「PowerShell」に右クリックで貼り付け、エンターを押します。
![PowerShell_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/6f6f175d-8bab-c333-b916-bc0751819404.jpeg)
何やらわけわからないものが大量に出てくると思いますが、待ちます。ひたすらに待って、正常に起動できると、一番最後の方は以下のような表示が出ると思います（※一部Guild idを伏せるなどしています）。

```
automuteus_1  | 2021/07/03 20:53:34 Added to new Guild, id XXXXXXXXXXX, name botテスト鯖
automuteus_1  | 2021/07/03 20:53:34 [This is not an error] No explicit guildID provided for emojis; using the current guild default
automuteus_1  | 2021/07/03 20:53:34 Refreshing user stats with worker
automuteus_1  | 2021/07/03 20:53:34 Refreshing game stats with worker
automuteus_1  | 2021/07/03 20:53:34 Added emoji aumaroon successfully!
automuteus_1  | 2021/07/03 20:53:35 Added emoji aurose successfully!
automuteus_1  | 2021/07/03 20:53:35 Added emoji aubanana successfully!
automuteus_1  | 2021/07/03 20:53:35 Added emoji augray successfully!
automuteus_1  | 2021/07/03 20:53:36 Added emoji autan successfully!
automuteus_1  | 2021/07/03 20:53:36 Added emoji aucoral successfully!
automuteus_1  | 2021/07/03 20:53:36 Added emoji aumaroondead successfully!
automuteus_1  | 2021/07/03 20:53:37 Added emoji aurosedead successfully!
automuteus_1  | 2021/07/03 20:53:37 Added emoji aubananadead successfully!
automuteus_1  | 2021/07/03 20:53:37 Added emoji augraydead successfully!
automuteus_1  | 2021/07/03 20:53:38 Added emoji autandead successfully!
automuteus_1  | 2021/07/03 20:53:38 Added emoji aucoraldead successfully!
```
サーバーに追加されていない絵文字がある場合、`Added emoji aumaroon successfully!`のように絵文字の追加を告げるメッセージが大量に出るはずです。今回は、2021/06/15アップデートの新色追加前に一度運用していたので、その際に追加された絵文字が追加されました。基本的には、

```
automuteus_1  | 2021/07/03 22:10:58 Added to new Guild, id XXXXXXXXXXX, name botテスト鯖
automuteus_1  | 2021/07/03 22:10:58 [This is not an error] No explicit guildID provided for emojis; using the current guild default
```
のように`Added to new Guild`のあとに使いたいサーバーの名前（ここでは「botテスト鯖」）と、その下に`[This is not an error]`の表示があれば大丈夫だと思います。試しにDiscordを開いて絵文字の欄を見てみてください。
![discordserver_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/7a9fe4b5-1db7-bf01-8dee-0d8e6c274c89.jpeg)
全色の絵文字が追加されていれば大丈夫です。確認できれば「PowerShell」のウインドウで「Ctrl+C」（Ctrlキー押しながらC）で停止させます。

**公式Botを導入した際にはお使いのDC鯖に絵文字は導入されていません。公式Botを導入済みであったDC鯖でも、絵文字の導入の確認が必須です。絵文字が追加されない場合、本記事最下部の「トラブルシューティング」をご確認ください。**

## 3.3. AutoMuteUsの運用

　さて、一度でも「`docker-compose up`」してしまえば、それ以降は「Docker Desktop」から起動できます。もちろん、先程同様に毎回「PowerShell」を起動して「`docker-compose up`」を実行してもらっても問題ないです。Botの動作を監視したい場合など、CUIにある程度慣れている方は後者を推奨します。本記事ではGUIを重視しているので以降、GUIで解説します。

　尚、本記事では動作が確認できているバージョンを示していますが、今後更新があった場合など、アップデートが必要な場合は、`.env`を編集してバージョンを書き換えた後、再度同じように「PowerShell」を起動し「`docker-compose pull`」してもらえばアップデートできます。詳細は3.4項参照してください。

### 3.3.1. AutoMuteUsの起動
　まず、「Docker Desktop」を起動します。タスクバー左下の検索バーに「Docker」などと入れて出る「`Docker Desktop`」を開きます。
![Docker_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/8dacc636-ad16-8670-258c-7183981ce354.jpeg)
開いたら、（最初から開くと思いますが）「Containers/Apps」が左で選ばれているのを確認し、`automuteus`という名前を探します（`.env`などを置いたフォルダの名前を独自のものにしたならそれを探してください）。この画像ではautomuteus_v6になってますが、色々あってautomuteus_v6というフォルダ名で再度やり直したからです。
![Docker_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/886be4fe-2b00-15e1-928c-11090a278fcf.jpeg)
そこにカーソルを合わせると青い再生ボタンのマーク（▶）が出ると思うのでそれを押します。尚、終了させるときは停止ボタン（■）です。
![Docker_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/adb21366-4238-aeaa-146b-1c149f04fa58.jpeg)
左端の方の灰色の「▶」の方をクリックするとこのように全てのコンテナ（※Docker用語）の状態を確認できます。緑色になっていれば正常に動いています。オレンジ色とか灰色のままのがあれば正常にできていません。一度PCを再起動するなど試してみてください。

### 3.3.2. AmongUsCaptureのインストール

　既にAmongUsCaptureをインストールしている方は、一度起動して更新がないか確認してください。アップデート可能だとその旨が表示されます。尚、最新版にアップデートするとAutoMuteUsも最新版へアップデートしないとできないことがあります（少なくとも、最大プレイ人数が15人に増えた2021/06/15のAmongUsのアップデート後は必要でした）。

　まだ入れてない方は`AmongUsCapture`のインストールの必要があります。尚、実行には「[Steam](https://store.steampowered.com/app/945360/Among_Us/)/[Epic Games](https://www.epicgames.com/store/ja/p/among-us)/[Itch.io](https://innersloth.itch.io/among-us)/[Microsoft store](https://www.microsoft.com/ja-jp/p/among-us/9ng07qjnk38j)」のいずれかの「AmongUs」（以下、PC版AmongUs）が必要です。どれか一つさえあれば大丈夫です。以下からAmongUsCaptureのダウンロードページを開きます。

- [Releases · automuteus/amonguscapture · GitHub](https://github.com/automuteus/amonguscapture/releases "Releases · automuteus/amonguscapture · GitHub")

「AmongUsCapture」はAmongUsのゲーム中の状態を"覗き見"してそれをAutoMuteUsなど他のアプリケーションに渡す**非公式ツール**です。「AmongUsCapture」の利用は自己責任でお願いします。
![AmongUsCapture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/413e4c89-3055-8f6d-3ad1-df64d2cfc6b7.jpeg)

一番上が最新版です。本記事初稿時点で最新版は`4.1.1`でした。`4.1.1`の下にChangelogが続き、その下のAssetsのところの「`AmongUsCapture.zip`」をクリックしてダウンロードします。ダウンロードできたら、ZIPファイルを解凍して中の「`AmongUsCapture.exe`」を開きます。解凍できない/わからない方がもしいれば[7-Zip](https://freesoft-100.com/review/7-zip.php)などを利用してみてください。
（本記事を試しているということは64bitOSのはずですので、解凍ソフトインストール時も64bit用を入れてください。）
![AmongUsCapture_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/9c8c6615-2bfe-d73e-cfad-274c839c1243.jpeg)
AmongUsを起動していない状態だと、このように起動するよう促すメッセージが表示されています。とりあえず起動できたらOKです。
![AmongUsCapture_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/3114a34b-48fa-da93-1df2-d560e290c643.jpeg)

もし起動できず、このようなエラーウインドウ（AmongUsCaptureの公式チュートリアルからスクショしているため英語ですが、日本語でメッセージ出るかもしれません）が出るなどで起動できない場合、`.NET Desktop Runtime 5.0.1`のインストールが必要です。[こちら](https://github.com/automuteus/amonguscapture#manual-installation)を開いてください。
![AmongUsCapture_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/08cc2a9f-4de9-a31a-0f54-63f09c835e84.jpeg)
この画像内にある「`.NET Desktop Runtime 5.0.1`」をクリックしてダウンロードした後、そのファイルをダブルクリックで開いてください。インストールが終わったら、再度AmongUsCaptureを起動してください（それでもダメなら一度PCを再起動してもう一度AmongUsCaptureを起動してみてください）。

### 3.3.3. Discordとの連携
　PC版AmongUsを起動します。「AmongUsCapture」は起動しなくても後で勝手に起動するのでどっちでも大丈夫です。Discordを開き、AmongUsの際に使うDC鯖のボイスチャットに入ってください。入っていないのにこの先の手順を行うと、「`please join a voice channel before starting a match!`」とメッセージが送信され実行できません。
![discordserver_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/e692554c-4ad5-90b3-013d-75f4eae5b0ed.jpeg)
以下のように、Botがオンライン表示されているテキストチャンネルを開きます。今後、そのテキストチャンネルでBotとのメッセージをやり取りしますので、各DC鯖の管理者さんなどと相談して、既存のチャンネルを使うか新規でチャンネルを作るかにしてください。尚、プライベートチャンネルにする場合は、そのチャンネルにプレイヤーはもちろん、BotのAutoMuteUsも入れてください。
![discordserver_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/f528c617-4fe5-61d8-d790-cc493213b841.jpeg)
テキストチャンネルに「.au n」とだけ入力して送信してください。
![discordserver_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/efac28ac-c3ff-fb12-19ab-5d301d2b327c.jpeg)
Botからそのチャンネルに以下のようなメッセージが送信されると同時に、BotからDMが届きます。
![discordserver_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/e1b61dbc-0627-29b6-95ce-d9b057a5c634.jpeg)
届いたDMのページを開きます。
![discordserver_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/9729721e-48de-9f7a-5551-3dc4f01f7bce.jpeg)
「`aucapture://localhost:8123/`」で始まるリンクをクリックして開きます。
![discordserver_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/8ed8ae56-4d69-8f05-82d1-6f1cc905c30c.jpeg)
このような確認画面が表示されるので「うん！」をクリックします。
![AmongUsCapture_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/5c04b0ed-820c-28ea-5403-e02dee3a847a.jpeg)
AmongUsCaptureを開き、左下の「`AutoMuteUs`」の左が緑色のランプに変わっていれば連携完了です。先程メッセージを置くったテキストチャンネルに戻ってください。
![discordserver_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/be8f1e2c-5052-aabf-fecc-6044d5cbb240.jpeg)
このようにメッセージが変わっていれば、AmongUs側で部屋に入ります（通常はプライベートルームかと思います）。AmongUs側でのホストである必要はありません。とりあえず部屋に入ればよいです。
![AmongUs_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/5f18e400-7a18-c7d9-5e1a-72ca84eb438a.jpeg)
部屋に入ると、メッセージの表示が変わります。
![discordserver_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/40e50b1f-c6b0-d6dd-3ac9-53582dd9cd2f.jpeg)
遊ぶ全員にAmongUsの部屋とボイスチャットに入ってもらいます。全員入ったら、AmongUsでの色とDiscordのアカウントが連携されているか確認します。このとき、どうやらDiscord名とAmongUsでのプレイヤー名が一致すると自動的に連携されるようです。また、詳しくはわかりませんが一度連携すると次回もその人が来ると勝手に連携されるっぽいです。色の横に`Unlinked`となっている人は連携できていません。

　連携できていない人がいたら、その人にAutoMuteUsが発信しているメッセージの下にあるリアクションの欄から自分の色を選んで押してもらいます（❌は連携を解除）。尚、AutoMuteUsをDockerで実行している本人がPC版AmongUsなら他の人はどのデバイスでもOKです。とりあえず今回はテスト環境で試すために、PC、スマホ、タブレット、Switchの計4台を用いて部屋に入ってみました。

　全員連携できたら、準備完了です。あとはAmongUsを楽しむだけです。遊び終わってAutoMuteUsを終了するときは、テキストチャンネルで「`.au e`」と送ります。再度始めるならもう一度「`.au n`」と送ります。尚、完全にAutoMuteUsを終了するには「Docker Desktop」で停止（■）します。

　もし途中でバグったら「`.au e`」を試し、それでも無反応なら「Docker Desktop」で一度停止（■）させ、全て止まったらもう一度起動（▶）してください。ミュート状態がおかしかったら手動ミュートに切り替えたり対応してください。**尚、`.au unmuteall`というコマンドで全員を強制ミュート解除できますので非常時にはお使いください。**
![discordserver_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/7611aee5-dd62-6163-4158-d850cd2b7e64.jpeg)
Botはサーバーミュート/スピーカーミュート（赤いマーク、上の画像）で動作します。解除にはその権限が必要になります。DC鯖の管理者にお問い合わせください。尚、Botの仕組み上はセルフミュート/スピーカーミュート（白いマーク、下の画像）とは別で動作しています。筆者のDiscord Bot開発の経験上、セルフミュートしている人がいても問題は起こらないはずです。
![discordserver_15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274925/b7fd6a1f-70a4-64ae-2a2e-fdbee7bff58a.jpeg)


## 3.4. 技術的解説
需要が高そうな順に簡単に解説を入れます。

### 3.4.1. コマンドについて
まずはDiscordでAutoMuteUsを制御するコマンドから。[公式のREADME](https://github.com/denverquane/automuteus/blob/master/README.md)をお借りして日本語に書き換え&補足を挿入。

| コマンド        | 別名<br>(省略形)   | オプション  | 説明                                                                                                     | 例                            |
| -------------- | ------- | ----------- | --------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| `.au help`     | `.au h` | None        | コマンドのヘルプを表示します。 |  |
| `.au new`      | `.au n` | None        | ゲームをスタートします。<br>オプションでゲームの部屋コードとリージョンを指定できますが、AmongUsCaptureで自動連携されるので通常このオプションは不要です。 | `.au n CODE eu`                    |
| `.au link`     | `.au l` | `@name color` | Discordのユーザーとゲーム内の色を手動でリンクします（リアクションからできるので通常は不要です）。 | `.au l @Soup cyan`                 |
| `.au refresh`  | `.au r` | None        | もしテキストチャットでのやり取りがたくさんあって上の方に流れてしまった時などに、このコマンドでBotのステータスメッセージを作り直します。 |                                    |
| `.au end`      | `.au e` | None        | ゲームを完全に終了し、プレイヤーの追跡を止めます。全員のミュートを解除し、状態をリセットします。 |                                    |
| `.au unlink`   | `.au u` | `@name`       |Discordのユーザーとゲーム内の色を手動でリンクを解除します。 | `.au u @player`                    |
| `.au settings` | `.au s` |             | コマンドのプレフィクス(prefix、おそらく`.au`の`.`を変えて`!au`とかにできる)やミュートの動作など、ボットの設定を確認・変更できます。<br>「例」にBotの言語を日本語にするコマンドを書いてみました。その他の設定は`.au s`と打てば確認できますが上級者向けです。 | `.au s language ja`                |
| `.au pause`    | `.au p` | None        | ボットを一時停止し、解除するまで誰も自動ミュートしないようにします。**既にミュートされているプレイヤーのミュートは解除されないので注意！** |                                    |
| `.au privacy`  |         |             | ボットのプライバシーとデータ収集に関する情報を表示します。 |                                    |
| `.au info`     | `.au i` | None        | ボットについての一般的な情報を表示します。 |                                    |
| `.au map`      |         | `MAPNAME`     | ゲーム内のマップ画像をテキストチャンネルに表示します。簡易版と、ベントやカメラなども表記した詳細版の2種類に対応しています。 | `.au map skeld detailed`<br><br>`.au map skeld simple` |
| `.au unmuteall`      |         |     | 強制的に全員のミュートを解除します。 |  |

その他、[こちらの記事](https://blog.kurokobo.com/archives/3730 "Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能 | kurokobo.com")にもう少し深堀りしたことが書いてありましたので参考にしてください。尚、全コマンドの説明は[AutoMuteUsの公式ページ](https://automute.us/commands)に解説があります（英語）。

わかる方向け：コマンド操作している元のソースコード
[automuteus/command_handlers.go at master · denverquane/automuteus · GitHub](https://github.com/denverquane/automuteus/blob/master/discord/command_handlers.go "automuteus/command_handlers.go at master · denverquane/automuteus · GitHub")（※masterブランチの最新の`command_handlers.go`へのリンクになるので今後のアップデート等でリンク切れになる可能性があります。）

### 3.4.2. `.env`関連
次に`.env`の設定項目。

```env:.env
# Please refer to the latest versions of Galactus and AutoMuteUs when specifying these versions:
# Automuteus: https://github.com/denverquane/automuteus/releases
# or https://hub.docker.com/repository/docker/denverquane/amongusdiscord/tags?page=1&ordering=last_updated

# Galactus: https://github.com/automuteus/galactus/releases
# or https://hub.docker.com/repository/docker/automuteus/galactus/tags?page=1&ordering=last_updated

AUTOMUTEUS_TAG=6.15.1
GALACTUS_TAG=2.4.1

```

`AUTOMUTEUS_TAG=6.15.1`
`GALACTUS_TAG=2.4.1`
AutoMuteUsとGalactusのバージョンを指定します。「Galactus」はAutoMuteUsとAmongUsCaptureを繋ぐためのツールです。バージョン番号は上の`.env`内の英文で示されている通り、いずれかのURLを開いて最新版の番号を指定します。

尚、いずれも`latest`と書くと常に最新版を使えます（アップデートするにはPowerShellなどで`docker-compose pull`する必要があります）。ただし、最新版の利用時には`.env`や`docker-compose.yml`の仕様が変更になっている可能性があります。動かなければ[公式のコード](https://github.com/denverquane/automuteus)を参照し必要に応じて変更する必要があります。
（例えば、本記事初稿時点では`PostgreSQL`を使う仕様に変更されており、以前のバージョンの仕様のものが動かないことがあります。）

```env:.env
# change these, but see comment below about HOST/PORT
DISCORD_BOT_TOKEN=（※ここは本記事に従って書き換えてください！！！）
GALACTUS_HOST=http://localhost:8123
GALACTUS_EXTERNAL_PORT=8123

# recommend changing these to something more secure
POSTGRES_USER=postgres
POSTGRES_PASS=putsomesecretpasswordhere

# GALACTUS_HOST can include the port or not. If you don't include the port,
# it will default to :80/:443 depending on http:// v https://
# **Make sure that GALACTUS_EXTERNAL_PORT matches the Port for the above host, UNLESS you use a reverse proxy/nginx!!!**
# Ex: if GALACTUS_HOST=http://localhost, then GALACTUS_EXTERNAL_PORT should be 80 (HTTP)
# Ex: if GALACTUS_HOST=https://localhost, then GALACTUS_EXTERNAL_PORT should be 443 (HTTPS)
# Ex: if GALACTUS_HOST=http://localhost:8123, then GALACTUS_EXTERNAL_PORT should be 8123
# If you use a reverse proxy, then GALACTUS_HOST should have the port of your reverse proxy, and it should proxy to the
# GALACTUS_EXTERNAL_PORT (ex 443 -> 8123)
```
`GALACTUS_HOST`と`GALACTUS_EXTERNAL_PORT`でGalactusがホストする先とポートを指定します。ここではローカルホストの8123番ポートを指定しています。通常はこのままで大丈夫です。ローカルホストなので、他の人が「`.au n`」したとしても、同じローカルホストに繋がらないので連携でません。

「# GALACTUS_HOST can include the port or not. ~」以下に英語で設定方法が解説されてるので変更する必要のある方は翻訳して読んでください（筆者は読んだ上でこのように設定しています）。

`POSTGRES_USER`と`POSTGRES_PASS`は変更推奨と書かれていますが、ローカルホストで動かすなら別に触らなくていいと思います。外部からアクセスできる場所にホストする場合は必要に応じて変更してください。

また、ローカルホスト（本記事の手法）の場合はセキュリテイ的に問題ないと考えられるため、HTTP通信で構いませんが、外部からアクセス可能にするのであればセキュリテイ的にリバースプロキシを利用しHTTPS通信に対応させることをお勧めしますが、専門外のためサポートできません。

ポート開放による自宅サーバーやVPSサーバーなどを利用する場合は以下の文献を参照ください

- HTTP
  - [Among Usと連携するDiscordのBOT「AutoMuteUs」をVPSで動かしたときのメモ - kariaの日記 @ Alice::Diary](https://karia.hatenablog.jp/entry/2020/12/15/053754 "Among Usと連携するDiscordのBOT「AutoMuteUs」をVPSで動かしたときのメモ - kariaの日記 @ Alice::Diary")
- HTTPS
  - [AutoMuteUsをリバースプロキシでHTTPS化してセルフホスティングする](https://blog.usagiga.me/posts/2021-03-15-automuteus-on-reverse-proxy/ "AutoMuteUsをリバースプロキシでHTTPS化してセルフホスティングする")
  - [Among Us の便利ボット AutoMuteUs の通信をリバースプロキシ（Nginx/Caddy）と Let’s Encrypt で暗号化する | kurokobo.com](https://blog.kurokobo.com/archives/3629 "Among Us の便利ボット AutoMuteUs の通信をリバースプロキシ（Nginx/Caddy）と Let’s Encrypt で暗号化する | kurokobo.com")



```env:.env
# Optional, leave alone by default
EMOJI_GUILD_ID=
# comma-separated
WORKER_BOT_TOKENS=
CAPTURE_TIMEOUT=
AUTOMUTEUS_LISTENING=
```
オプションです。例えば、一つのBotで複数のDC鯖を動かしている場合、`EMOJI_GUILD_ID`で指定したDC鯖の絵文字を使うことができ、その場合は他のDC鯖に絵文字が追加されません（※Botに「外部絵文字を使用する」の権限が必要です）。他のオプションは[公式ドキュメント（英語）](https://github.com/denverquane/automuteus#environment-variables)でどうぞ。

`WORKER_BOT_TOKENS`を追加することで、ミュートを高速化します。Discordへの負荷軽減のためにBotの動作に制限がかかるように動作するようです。このオプションによって、複数のBotが手分けしてミュートや解除を行います。逆に言えば、追加Botがないと、大人数（例えば十数人）でプレイ時、一部の人がしばらく（十数秒程度）ミュートや解除がされずに遅れて動作します。

尚、追加するBotに与える権限は「`Mute Members`」「`Deafen Members`」だけで構いません。[Discord開発者ポータル](https://discord.com/developers/applications "Discord Developer Portal — My Applications")から新しくBotを作成、DC鯖に追加、トークンを「.env」の「`WORKER_BOT_TOKENS=`」の後ろに追記してください。

この他、AmongUsCapture側からも手分けして手伝ってくれるBotを追加できます。これらの高速化についての詳細は以下の記事の「ミュート・アンミュートの高速化」を参照ください。

- [Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能 | kurokobo.com](https://blog.kurokobo.com/archives/3730 "Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能 | kurokobo.com")

```env:.env
# DO NOT change these unless you really know what you're doing
BROKER_PORT=8123
GALACTUS_PORT=5858
GALACTUS_REDIS_ADDR=redis:6379
AUTOMUTEUS_REDIS_ADDR=redis:6379
GALACTUS_ADDR=http://galactus:5858
POSTGRES_ADDR=postgres:5432
```
変更しないでください。

### 3.4.3. `docker-compose.yml`関連
```yml:docker-compose.yml
version: "3"

services:
  automuteus:
    # Either:
    # - Use a prebuilt image
    image: denverquane/amongusdiscord:${AUTOMUTEUS_TAG:?err}
    # - Build image from local source
    #build: .
    # - Build image from github directly
    #build: http://github.com/denverquane/automuteus.git
    restart: unless-stopped
    ports:
      # 5000 is the default service port
      # Format is HostPort:ContainerPort
      - ${SERVICE_PORT:-5000}:5000
    environment:
      # These are required and will fail if not present
      - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}
      - HOST=${GALACTUS_HOST:?err}
      - POSTGRES_USER=${POSTGRES_USER:?err}
      - POSTGRES_PASS=${POSTGRES_PASS:?err}

      # These Variables are optional
      - WORKER_BOT_TOKENS=${WORKER_BOT_TOKENS:-}
      - EMOJI_GUILD_ID=${EMOJI_GUILD_ID:-}
      - CAPTURE_TIMEOUT=${CAPTURE_TIMEOUT:-}
      - AUTOMUTEUS_LISTENING=${AUTOMUTEUS_LISTENING:-}

      # Do **NOT** change this
      - REDIS_ADDR=${AUTOMUTEUS_REDIS_ADDR}
      - GALACTUS_ADDR=${GALACTUS_ADDR}
      - POSTGRES_ADDR=${POSTGRES_ADDR}
    depends_on:
      - redis
      - galactus
      - postgres
    volumes:
      - "bot-logs:/app/logs"
  galactus:
    ports:
      # See sample.env for details, but in general, match the GALACTUS_EXTERNAL_PORT w/ the GALACTUS_HOST's port
      - ${GALACTUS_EXTERNAL_PORT:-8123}:${BROKER_PORT}
    image: automuteus/galactus:${GALACTUS_TAG:?err}
    restart: unless-stopped
    environment:
      # Do **NOT** change these
      - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}
      - BROKER_PORT=${BROKER_PORT}
      - REDIS_ADDR=${GALACTUS_REDIS_ADDR}
      - GALACTUS_PORT=${GALACTUS_PORT}
    depends_on:
      - redis

  redis:
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - "redis-data:/data"

  postgres:
    image: postgres:12-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASS}
    volumes:
      - "postgres-data:/var/lib/postgresql/data"

volumes:
  bot-logs:
  redis-data:
  postgres-data:
```
基本的には`docker-compose.yml`が何かわかる方のみ触ってください。
[元のコード](https://github.com/denverquane/automuteus/blob/master/docker-compose.yml)では`automuteus:`、`galactus:`、`redis:`、`postgres:`それぞれに`restart: always`が付いていますが、その場合Docker for Windowsが起動したと際にも勝手に「AutoMuteUs」が起動します。本記事ではそうならないようにします。

本記事では当初、ただコメントアウトしているだけでしたが、どうやら途中で再起動は必要になるようです。[こちらの記事](https://yk5656.hatenablog.com/entry/20201122/1605970800 "Dockerのrestartの挙動を確認してみる - yk5656 diary")を確認したところ「`restart: unless-stopped`」に設定するのが良さそうでしたので試してみたところ、筆者の環境では正常動作を確認しました。

`DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}`や`POSTGRES_USER=${POSTGRES_USER:?err}`などの`?err`を削除してる方がいましたが、必要ないです。エラー出るのは基本`.env`で指定してる何かが足りてないです。関係ないものまでエラーメッセージに表示されるのでややこしいですが（詳しくは下のトラブルシューティングに書いてます）。

もし動かないなら最新版でAutoMuteUsとGalactusを利用しているかと、`.env`や`docker-compose.yml`が最新の仕様に準拠しているか再確認してください。

#トラブルシューティング
以下に筆者が遭遇したエラー例を置いておきます。以下を読んでも何かわからないことがあればコメントに書いてください。可能な限り対応します。ただ、Qiitaのコメントに気付かない可能性があります。返信遅くなるようでしたら申し訳ありません。お待ち下さい。

尚、エラーメッセージを載せる際は個人情報や機密情報を含まないようにしてください（例えば、`docker-compose up`時のPowerShellのログにはDC鯖のIDや名前、鯖内のメンバーの名前やIDが含まれる場合があります）。何か含まれてそうで怖いなどあれば[筆者のTwitter](https://twitter.com/durian3960)にでもDM飛ばしてください。

## `docker-compose pull` でエラーになる

`ERROR: Missing mandatory value for "environment"`

```
ERROR: Missing mandatory value for "environment" option interpolating ['DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}', 'HOST=${GALACTUS_HOST:?err}', 'POSTGRES_USER=${POSTGRES_USER:?err}', 'POSTGRES_PASS=${POSTGRES_PASS:?err}', 'WORKER_BOT_TOKENS=${WORKER_BOT_TOKENS:-}', 'EMOJI_GUILD_ID=${EMOJI_GUILD_ID:-}', 'CAPTURE_TIMEOUT=${CAPTURE_TIMEOUT:-}', 'AUTOMUTEUS_LISTENING=${AUTOMUTEUS_LISTENING:-}', 'REDIS_ADDR=${AUTOMUTEUS_REDIS_ADDR}', 'GALACTUS_ADDR=${GALACTUS_ADDR}', 'POSTGRES_ADDR=${POSTGRES_ADDR}'] in service "automuteus": err
```
 このエラーは、`.env`で設定している環境変数（`AUTOMUTEUS_TAG=6.15.1`など）のどこかが空欄（e.g. `DISCORD_BOT_TOKEN=`）になっている際に起こり得るエラーです。しかし、残念ながらエラーメッセージではどの部分が抜けているのか教えてくれないみたいです。`.env`を確認してエラーメッセージに上がっているどれかが抜けていないか確認してください。
ちなみにこれは`DISCORD_BOT_TOKEN`のみ空欄にして出したエラーです。
（わかる方向けのエラーメッセージの解読：
　~`value for "environment" option interpolating [`（略）`] in service "automuteus": err`
　で、"automuteus"の"environment"のオプションのどれかが無いよ！と教えてくれてます）

まあ、本記事では、GitHubの[元のコード](https://github.com/denverquane/automuteus)からコードを取ってきているので、`docker-compose.yml`には問題はないはずです。本記事では動作を確認したバージョンのものを使用していますが、AutoMuteUsの今後のバージョンアップで変わる可能性はあります。その際は[元のコード](https://github.com/denverquane/automuteus)の`sample.env`を参考に`.env`を作成し、`docker-compose.yml`も最新のコードのものに書き換えてください。
（特に`AUTOMUTEUS_TAG`や`GALACTUS_TAG`を`latest`にしている方は注意してくださいね。）

## `docker-compose up` やコンテナの起動時にエラーになる
いくつか理由はあると思いますが、筆者の場合、本記事作成のため、新たに別の場所に「AutoMuteUs」という名前のフォルダを作って運用したところ、以前別の場所で「AutoMuteUs」という名前のフォルダを作って運用していたせいで色々バグりました。フォルダの名前を書き換えるなどしてなんとかしました。

他に、本記事では`galactus`がlocalhostの8123番ポートにサーバーを立てているので、同じポートに立てている他のアプリケーション（Dockerの別コンテナも含む）がある場合、次のようなエラーを吐きます。`XXXXXX`の部分は伏せました。

```
ERROR: for automuteus_galactus_1  Cannot start service galactus: driver failed programming external connectivity on endpoint automuteus_galactus_1 (XXXXXX): Bind for 0.0.0.0:8123 failed: port is already allocated

ERROR: for galactus  Cannot start service galactus: driver failed programming external connectivity on endpoint automuteus_galactus_1 (XXXXXX): Bind for 0.0.0.0:8123 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
```
筆者の場合は、試すために複数個同じAutoMuteUsのDockerコンテナを作っていましたが、`.env`で「restart: always」が有効になっていたせいで複数のAutoMuteUsが立ち上がっていてエラーになりました。「restart: always」をコメントアウトなどで再起動しないようにしてどれか一つだけ起動させるか、`.env`でそれぞれ違うポート番号を設定してください。

## 絵文字が一部もしくは全部追加されない
通常、初めて「`docker-compose up`」を実行したときに絵文字が追加されますが、絵文字が追加されないことがあるようです。よくあるパターンを2つ紹介します。

- サーバー絵文字の空きスロットが不足している
  - 絵文字は各色×生死の2種が存在します。そのため、2021年9月時点では全18色×2で36スロットが必要になります。デフォルト（サーバーブーストがない状態）では50スロットしか利用できません。既存の絵文字を削除するか、あるいは[サーバーブーストによりレベルを上げ、空きスロットを拡張](https://support.discord.com/hc/ja/articles/360028038352-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%96%E3%83%BC%E3%82%B9%E3%83%88-)してください。
- DiscordのBot制限にかかった
  - 空きスロットがあるにも関わらず、追加できない場合はBotに絵文字の追加に関する制限がかかった可能性があります。
  - 絵文字が追加されずに続けて「`docker-compose up`」を何度も実行した場合などにおいて、「絵文字を大量に追加しようとした」としてスパムなどの疑いで一時的にそのBotによる絵文字の追加が制限されることがあります（私が実際にこうなりました）。
  - ログに制限解除までの時間が書いていますが、ログがよくわからないなら無難に数時間や一晩時間を空けるなどして再度「`docker-compose up`」を行ってください。焦って何度もやろうとすると制限される時間が伸びていくだけです。

## 全員が同時にミュート/解除されないことがある
私のプレイ環境では、11人を超えると11人目だけミュートや解除が遅れるという事態が発生しました。これについて、以下の記事で解決しましたので紹介します。

- [Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能 | kurokobo.com](https://blog.kurokobo.com/archives/3730 "Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能 | kurokobo.com")

こちらの記事の「ミュート・アンミュートの高速化」の項目を参照ください。本記事ではセルフホストしていますので、キャプチャボットとワーカボットいずれも利用が可能です。私の環境下では、キャプチャボットとワーカボットそれぞれ一つずつ導入し、15人プレイでも快適な環境になりました。

# 最後に
ここまで読んでいただきありがとうございました。前編記事で近日中と書いたものの、かなり時間が経ってしまいました。何日かにわけて、合計20時間とかいくんじゃないかなあ...

そんな手間ひまかけた記事、お役に立っていれば幸いです。LGTMなど貰えるとモチベにつながるので`LookGoodToMe`と思った方はぜひ。LINE、Twitter、Discord、その他SNSでシェアしていただけると嬉しいです。

# 参考文献
[GitHub - denverquane/automuteus](https://github.com/denverquane/automuteus "GitHub - denverquane/automuteus: Discord Bot to automute Among Us players at round transitions, in conjunction with https://github.com/denverquane/amonguscapture")
[GitHub - automuteus/amonguscapture](https://github.com/automuteus/amonguscapture "GitHub - automuteus/amonguscapture: Capture of the local Among Us executable state")
[Botアカウント作成 - discord.py](https://discordpy.readthedocs.io/ja/latest/discord.html "Botアカウント作成")
[Discord Developer Portal — Documentation — Change Log](https://discord.com/developers/docs/change-log "Discord Developer Portal — Documentation — Change Log")
[Dockerエラーと立ち向かうPart1 - Qiita](https://qiita.com/matsugaknight/items/5f7cbb1fc2b2ad496ff3 "Dockerエラーと立ち向かうPart1 - Qiita")
[Among Usと連携するDiscordのBOT「AutoMuteUs」をVPSで動かしたときのメモ - kariaの日記 @ Alice::Diary](https://karia.hatenablog.jp/entry/2020/12/15/053754 "Among Usと連携するDiscordのBOT「AutoMuteUs」をVPSで動かしたときのメモ - kariaの日記 @ Alice::Diary")
[[Among Us] automuteus v4.0.4をdocker-composeで起動 - Qiita](https://qiita.com/tomoyk/items/9aca31db29e9ce7e0f1d "[Among Us] automuteus v4.0.4をdocker-composeで起動 - Qiita")
[Dockerのrestartの挙動を確認してみる - yk5656 diary](https://yk5656.hatenablog.com/entry/20201122/1605970800 "Dockerのrestartの挙動を確認してみる - yk5656 diary")
[Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能 | kurokobo.com](https://blog.kurokobo.com/archives/3730 "Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能 | kurokobo.com")