# Amoung Us / MMMN
金曜日や土曜日の21時から24時は多くのプレイヤーがAmong Usで遊んでいるせいか、利用制限に引っかかったり、利用できても負荷で重いなどの事象が散見されたので、セルフホストしてみました。
わたぬきのフォロー・フォロワー内であればご自由に利用いただけますが、再展開はお控えください。また個人提供のサービスのため、突然サービス停止となる場合があります。
## 利用マニュアル(参加者)
### AutoMuteUs
- 参加者視点での使い方は特にありません。
- 通常版同様、Among Us上のプレイヤー名とDiscordの名前が違うなどして`Unlink`状態となってしまっている場合は、自キャラの色のアイコンをクリックして同期をとってください。

### BetterCrewLink
#### PC利用者
1. [こちら](https://github.com/OhMyGuus/BetterCrewLink/releases)の`Download from GitHub`からクライアントをダウンロードしてください。
2. クライアントを起動したら、左上の歯車マーク  から設定を開いてください。
3. 設定項目のうち、`詳細設定`までスクロールダウンしてください。

4. `モバイルホスト`にチェックが入っていることを確認の上、`ボイスサーバーの変更`をクリックしてください。
- 必要に応じて、この際に`NATの修正`にもチェックを入れておいてください
5. ボイスサーバーに以下のURLを指定し、確認を押してください。
https://bettercrewlink.mmmn.jp
6. 以上が完了したら、右上の左矢印をクリックして準備完了です。

#### iOS / Android / Switch利用者
1. Among Usを遊ぶ**以外の**端末で、[こちら](https://bcweb.mmmn.jp/)を開いてください。
2. マイク利用を許可するかダイアログが出るので、許可してください。
3. `Ingame name`にAmong Us上での自キャラの名前を、`Lobby code`に参加するゲームのコードを入力してください。

4. 最後に`CONNECT`をクリックすれば設定完了です。
## 利用マニュアル(船主)
### AutoMuteUs
1. 既に自身のDiscordサーバ上にAutoMuteUsがインストールされている場合、当該Botをキックしてください。
2. [こちら](https://mmmn.jp/automuteus01)をクリックし、自身のDiscordにセルフホスト版AutoMuteUsを招待してください。
3. [こちら](https://github.com/automuteus/amonguscapture/releases)から、最新の`AmongUsCapture.zip`をダウンロードしてください。
4. 自身が音声チャンネルに入り、かつAmongUsCaptureを起動した状態で、Discordサーバのチャット欄に`.au new`と投稿してください。
5. ダイレクトメッセージとして次のようなメッセージを受けるので、`aucapture`から始まるURIをクリックしてください。

6. [利用者マニュアル](https://hackmd.mmmn.jp/PMlztRGaRA27TqiE0zC-1g#AutoMuteUs)に記載に注意しつつ、通常通りお楽しみください。
### BetterCrewLink
- 船長に限り利用マニュアル(参加者)の[PC利用者の手順](https://hackmd.mmmn.jp/PMlztRGaRA27TqiE0zC-1g#PC%E5%88%A9%E7%94%A8%E8%80%85)で参加してください。
- その他手順は参加者と変わりありません。
## 構築マニュアル
### AutoMuteUs
https://github.com/denverquane/automuteus#pre-installation-steps-important
### BetterCrewLink
ベタクルは次のコンポーネントで構成されている
- サーバ
- https://github.com/OhMyGuus/BetterCrewLink-server
- クライアント
- PC版
- https://github.com/OhMyGuus/BetterCrewLink
- Web版
- https://github.com/OhMyGuus/BetterCrewLink-mobile
- TURNサーバ
基本はサーバ導入後にクライアントの設定を変更すれば負荷の少ない自宅サーバでベタクルを利用できるが、このカスタムサーバはWeb版での利用が行えない(下記**太字**参照)
- https://github.com/OhMyGuus/BetterCrewlink-mobile/releases/tag/V1.0.20
> Can I use this without a PC player in our lobby? -> At the moment not the app requires one PC player with BetterCrewlink
> Can I find this app in the play store? -> Not yet I made a request to google but because of the holidays it will take a bit longer to validate.
> do all voice servers work? -> No, the mobile version only supports https servers so make sure the server starts with https like https://bettercrewl.ink or https://crewl.ink
> is there a web version available -> Yes there is but **it only works with the official better Crewlink voice server** at the moment. https://web.bettercrewl.ink
原因を説明するためにはベタクルの仕組みから理解する必要があるので説明すると、ベタクルは以下の仕組みで動作している(流し読みのため間違ってるかもしれません。参考程度にしてください)。
- PC版ベタクルがAmong Usアプリから全員の位置情報を収集する
- Among Usは公式サーバを介して全員の位置情報を各々に配布していると思われる
- ベタクルサーバでは部屋(ゲームコードにより区別される)ごとに参加者名簿を作成しており、各参加者の属性情報としては少なくとも以下を持つ
- Web版利用者かどうか
- PC版利用者のゲームコード: `ゲームコード`
- Web版利用者のゲームコード: `ゲームコード + '_mobile'`
- 接続元(どこにつなげば当該参加者と通信できるか)
- PC版ベタクルは、Web版ベタクル利用者に対して通信を行い、位置情報を共有する
- 各ベタクルクライアントは、位置情報をもとに付近にいる参加者に対して、自分の音声を転送する(名簿の接続元情報を使う)
- この時の通信は原則としてP2Pとなるが、NATの修正にチェックが入っている場合は、TURNサーバを通しての通信になる
- 音声が転送できるかどうかは、このTURNサーバの負荷状況も影響する
- PC版ではTURNサーバの指定はハードコードされてしまっているので、変えることができない
- https://github.com/OhMyGuus/BetterCrewLink/blob/7b9cc215881841029ea0d676274f1f5fb5b0db5f/src/renderer/Voice.tsx#L119-L121
- 負荷回避を目的に自前のTURNサーバへ変更する場合は、ソースコードを修正後再コンパイルし利用する必要がある
上記前提をもとにカスタムサーバをWeb版で使えない理由を説明すると、次の通り。
- Web版でサーバへ接続する際、ゲームコードが`ABCDEF`だったとすると、PC版は`ABCDEF`部屋に入るが、Web版は`ABCEDF_mobile`部屋に入ろうとしてしまう
- サーバ側ではゲームコードが6桁以外だとそもそも参加を許可しない仕組みになっていることも影響 [→参照](https://github.com/OhMyGuus/BetterCrewLink-server/blob/master/src/index.ts#L137)
- ただし一方でPC版ユーザから位置情報を配布する先を見つけるロジックは、この末尾mobileに頼っているので、迂闊に削れない
このため、上記不具合を解消するには
- 参加者間通信のロジックには影響を与えず
- 同じ部屋に参加させる
上記2点をベタクルサーバこれを改修することで達成する必要がある。
これを可能にする改修は以下の通り。
```diff
--- src.org/index.ts 2021-11-28 04:32:48.398391472 +0000
+++ src/index.ts 2021-11-30 13:09:54.442284283 +0000
@@ -132,9 +132,9 @@
if (!code) {
return;
}
- if (code && code.length === 6) socket.leave(code);
+ if (code && code.replace("_mobile","").length === 6) socket.leave(code.replace("_mobile",""));
- if ((io.sockets.adapter.rooms[code]?.length ?? 0) <= 0) {
+ if ((io.sockets.adapter.rooms[code.replace("_mobile","")]?.length ?? 0) <= 0) {
if (allLobbies.has(code)) {
allLobbies.delete(code);
}
@@ -169,7 +169,7 @@
typeof c !== 'string' ||
typeof id !== 'number' ||
typeof clientId !== 'number' ||
- !(c.length === 6 || c.length === 4)
+ !(c.replace("_mobile","").length === 6 || c.length === 4)
) {
socket.disconnect();
logger.error(`Socket %s sent invalid join command: %s %d %d`, socket.id, c, id, clientId);
@@ -177,8 +177,8 @@
}
let otherClients: any = {};
- if (io.sockets.adapter.rooms[c]) {
- let socketsInLobby = Object.keys(io.sockets.adapter.rooms[c].sockets);
+ if (io.sockets.adapter.rooms[c.replace("_mobile","")]) {
+ let socketsInLobby = Object.keys(io.sockets.adapter.rooms[c.replace("_mobile","")].sockets);
for (let s of socketsInLobby) {
if (s !== socket.id) otherClients[s] = clients.get(s);
}
```
この改修をベタクルサーバに入れるとWeb版からも参加できるようになる(Dockerfileがあるので、上記改修後ビルドすれば即立ち上げ可能)。
ただし、Web版もTURNサーバの指定を変更したり、接続先ベタクルサーバ情報を変更する改修を入れたりしなければ意味がないので、その方法について以下の通りメモしておく。
```dockerfile
FROM node:16
RUN apt update
RUN apt install git -y
COPY BetterCrewlink-mobile /BetterCrewlink-mobile
RUN npm install -g @ionic/cli
WORKDIR /BetterCrewlink-mobile
RUN sed -i 's@turn.bettercrewl.ink@自前のTURNサーバ@g' ./src/app/services/turnServers.ts
RUN sed -i 's@M9DRVaByiujoXeuYAAAG@TURNサーバユーザ名@g' ./src/app/services/turnServers.ts
RUN sed -i 's@TpHR9HQNZ8taxjb3@TURNサーバパスワード@g' ./src/app/services/turnServers.ts
RUN sed -i 's@bettercrewl.ink@自前のベタクルサーバ@g' ./src/app/services/settings.service.ts
RUN npm install
RUN ionic capacitor sync
EXPOSE 8100
CMD ionic serve --external --no-open --consolelogs --port 8100 -- --disableHostCheck true
```
## 実績
- [ ] サボ勝ち
- [ ] AirShip 3勝
- [ ] Skeld 3勝
- [ ] MIRA 3勝
- [ ] Polus 3勝
- [ ] キル勝ち
- [ ] 投票勝ち
- [ ] カードスキャンミスなし
- [ ] 停電時キル
- [ ] メドベイスキャン中キル
- [ ] 会議前に3キル
- [ ] ベント使わずインポスター勝ち