Among Us 用ボット AutoMuteUs のあまり知られていない便利な機能

Among Us でゲームの状況に応じて自動でミュート・アンミュートしてくれる便利なボットこと AutoMuteUs、ほんとうに便利ですよね。

簡単な使い方であればインタネットの各所に解説記事がたくさんありますが、実は AutoMuteUs には、さらに便利に活用できるいろいろな機能 が用意されています。

本エントリでは、他の解説記事ではあまり触れられていない機能 を中心に、AutoMuteUs をさらに活用するための情報 を紹介します。

なお、文中で 公式サービス と記載していますが、これは AutoMuteUs 開発者が直々に運営しているサービス というだけの意味であり、Among Us の公式サービス ではない ことは念のため明記しておきます。

ミュート・アンミュートの高速化

ゲーム開始直後やディスカッションの開始・終了時など、同時に多数のプレイヤのミュート・アンミュートが必要なシーン で、実際にミュート・アンミュートされるまでにプレイヤ間でラグ が生じることがあります。

AutoMuteUs では、ミュートとアンミュートに Discord の API を利用しています。Discord の API には一定時間内に許容される操作の回数の制限(Rate Limits)があり、ざっくり、トークンごとかつサーバごと・チャンネルごと にこの制約を受けます。前述のラグは、この制限によるものです。

このラグは、それぞれ次の方法で解消または軽減できます。現在の実装では 8 人以上で遊ぶときに特に制限を受けやすい ため、いずれかの対策を検討するとよいでしょう。

利用形態高速化方法
公式サービス(無償またはブロンズ)キャプチャボットによる高速化
公式サービス(シルバー以上)キャプチャボットによる高速化
ワーカボットによる高速化
セルフホストキャプチャボットによる高速化(5.0.0 以上のみ)
ワーカボットによる高速化

キャプチャボットによる高速化

AmongUsCapture は、ボットからの依頼を受けてプレイヤのミュート・アンミュートを手伝う機能を持っています。この機能でミュート・アンミュートの処理を分散することで、Discord の制限を受けにくくできます。

この手段は、公式サービスを無償で利用している場合でも有効 な点が魅力です。もちろん、有償サービスの利用者もセルフホストの利用者(5.0.0 以降限定)にも有効です。

利用するには、公式のドキュメント を参考に、

  1. Discord Developer Portal へアクセスし
  2. ボットを作成してトークンを取得し
  3. 権限(Mute Members と Deafen Members のみでよい)を付与して
  4. サーバへ招待する

な作業をしたうえで、AmongUsCapture の設定画面でトークンを入力する必要があります。最初だけちょっと手間ですが、いちど設定してしまえばあとは放置でよいので簡単です。

設定画面のここです

AutoMuteUs の開発者が、この作業の解説動画も公開していますので、併せて参考にできます。

なお、セルフホストの場合で、キャプチャのトークン欄にボット側の DISCORD_BOT_TOKEN と同じ値を入れても動作はしますが、Discord からすれば同じトークンでのリクエストになるので、制限を回避する観点では大きな効果は期待できません(厳密には完全に無意味でもないのですが、別のトークンを利用する方が効果は大きいはずです)。

ワーカボットによる高速化

AutoMuteUs Premium の シルバー以上 で、公式ページで Priority Muting Bots と表記されているのがコレです。シルバー以上の利用者は、/premium invite コマンドで、追加のボットの招待リンクを取得でき、サーバに追加でボットを招待するだけで、ミュート・アンミュートが高速化されます。

セルフホスト の利用者は、追加でボットを作成し、トークンを取得してサーバに招待(権限は Mute Members と Deafen Members のみでよい)した上で、.env ファイルの WORKER_BOT_TOKENS にそのトークンを追記すれば利用できます。WORKER_BOT_TOKENS はカンマ区切りで複数のトークンを設定できるので、ワーカボットを複数用意すればさらに動作を安定させられます。詳細な説明は省きますが、ワーカボット 1 つあたり 7 人まで と考えて数を調整するとよいでしょう。

ぼくの管理するインスタンスには三つのワーカボットが居ます

なお、環境変数 WORKER_BOT_TOKENS は 5.0.0 以上のみの対応のため、それ以前(2.4.3 など)を利用している方は、代わりに DISCORD_BOT_TOKEN_2 として追記してください。ただし、DISCORD_BOT_TOKEN_2 には複数のトークンの列挙はできないので、ワーカボットの数は 1 つのみに限定されます。

技術的な補足

技術的には、ミュート・アンミュートの Discord へのリクエストは、以下の優先順位で処理されています。

  • ワーカボット
    • WORKER_BOT_TOKENS で入力したトークンによる処理
    • 複数のトークンを入力した場合は、すべてのトークンで順次処理を試行
  • キャプチャボット
    • AUCapture の Settings 画面に入力したトークンによる処理
  • プライマリボット
    • DISCORD_BOT_TOKEN で入力したトークンによる処理

プライマリボットはそもそも制限を受けやすい(ユーザからのコマンドへの応答やメッセージの投稿などで API リクエストを行わざるを得ない)ため、ミュート・アンミュートの処理に関しては最後の手段として使われます。

さらに技術的には、Discord の制限とは に、Galactus もワーカボットのトークンごとのミュート・アンミュートリクエストを 5 秒あたり 7 回に制限しています。環境変数でカスタマイズできる箇所ではありますが、Discord 側の制限が変わるわけではないので、この数値をいじるメリットはあまりありません。

ゲーム開始直後のミュート時間の変更

ゲーム開始後、役職が明らかになって即座に声で反応してしまうと、ミュートになっていなくてバレる…… みたいな事故がまれに発生します。

実は、デフォルトでは、ゲームの開始後は 7 秒待ってからミュート するようになっています。同様に、ディスカッション終了からタスクに戻るときも、デフォルトでは 7 秒待ってからミュート します。/settings delays.au settings delays)コマンドでこの待ち時間を短くすることで、この事故は予防できます。

コマンドは、/settings delays start-phase:<遷移前フェイズ名> end-phase:<遷移後フェイズ名> delay:<数値>.au settings delays <遷移前フェイズ名> <遷移後フェイズ名> <数値>)で、必要なパラメータはそれぞれ次の通りです。

  • 遷移前フェイズ名遷移後フェイズ名
    • LOBBYlobby)、TASKStasks)、DISCUSSIONdiscussion) のいずれかをそれぞれ指定します
    • 例えば、遷移前フェイズを LOBBY、遷移後フェイズを TASKS と指定すると、ロビーからタスクに遷移したとき、すなわち ゲーム開始時 を表現できます
  • 数値
    • 待ち時間を秒単位で指定します

デフォルト値は次の通りです。

遷移前フェイズ遷移後フェイズ待ち時間補足
LOBBYTASKS7ゲームを開始した直後
TASKSLOBBY1タスク中にゲームが終了したとき(タスク勝ち、キル勝ちなど)
DISCUSSIONLOBBY6ディスカッションでゲームが終了したとき(追放勝ちなど)
DISCUSSIONTASKS7ディスカッションが終了してタスクに戻るとき

統計や成績、タイムラインの表示

有償の AutoMuteUs Premium、またはセルフホストで 5.0.0 以降を利用している場合、過去に遊んだゲームの統計や成績を表示できます。

サーバ全体の統計やユーザ別の成績の表示

/stats view guild.au stats guild)コマンドで、そのサーバの過去の統計情報を確認できます(ギルドとは、Discord ではサーバのことです)。

勝率(Total Winrate)、役割別の勝率(Crewmate/Imposter Winrate)、メンバの組み合わせでの勝率(Best/Worst Imposter/Crewmate Team)、最初に殺されがちなヒト、最初に特定のヒトに殺されがちなヒト、の情報が得られます。

また、/stats view user user:<@ユーザ名>.au stats <@ユーザ名>)では、個人単位の成績も表示できます。

これらの統計情報画面の表示は、それぞれ次のオプションでカスタマイズできます。

コマンド意味
/settings leaderboard-mention use-mention:<True/False>
.au settings leaderboardMention <true/false>
表示に含まれるユーザ名のメンション化の有無を指定する。デフォルトは True で、メンションが飛ぶ。False にするとニックネームだけになり、メンションは飛ばない。
/settings leaderboard-size size:<数値>
.au settings leaderboardSize <数値>
ランキングに表示する順位を指定する。デフォルトは上図の通り 3 で 3 位までの表示だが、例えば 5 にすると 5 位まで表示されるようになる。
/settings leaderboard-min minimum:<数値>
.au settings leaderboardMin <数値>
あるユーザがランキングに含まれるようになるために必要なゲームの数を指定する。デフォルトは 3 で、そのサーバで 3 回以上ゲームをしないとランキングに載らない。

ゲームのタイムラインの表示

開発途中の機能ではありますが、/stats view match match:<ゲーム ID>.au stats <ゲーム ID>)を実行すると、そのゲームの時系列が確認できます。

必要なゲーム ID は、ゲームオーバメッセージ の中で Match ID として確認できますが、デフォルトではそもそもこのメッセージ自体が無効化されています。下図のようなメッセージです。

このゲームオーバメッセージを有効化するには、/settings match-summary-duration minutes-duration:<数値>.au settings matchSummary <数値>)を実行する必要があります。数値には、ゲームオーバメッセージの表示時間(分単位)を指定しますが、個人的なおすすめは -1(無期限)です。1 以上の数値を指定すると、その時間が経過したらそのゲームオーバメッセージは削除されるようになります。

観戦者のミュート・アンミュート

AutoMuteUs は、通常はゲーム内のプレイヤと Discord のアカウントがリンクされているヒトだけを対象にミュート・アンミュートを行うのみで、プレイヤでない観戦者がボイスチャットに混ざっていても、そのヒトはミュート・アンミュートしません。

有償サービスまたはセルフホストでは、/settings mute-spectators mute:True.au settings muteSpectators true)を実行すると、同じボイスチャットに参加しているプレイヤでない観戦者 を、死者と同じルールでミュート・アンミュート するようになります。画面配信と組み合わせると便利に利用できますね。元に戻すには、同じコマンドで True でなく False を指定します。

なお、この機能は観戦者の数に応じて前述の Discord の API 制限を受けやすくなるため、利用には注意が必要です。利用する場合は、同じく前述のキャプチャボットやワーカボットの併用が推奨されます。

チャットで流れたメッセージの再表示

ボットが投稿してくれるこのメッセージは、チャットで流れてしまいがちです。

そんなときは、/refresh.au refresh)を実行すると、新しく投稿しなおしてくれます。

また、/settings auto-refresh autorefresh:True.au settings autoRefresh true)で自動リフレッシュを有効化すると、

  • ディスカッションの開始時
  • ゲームの終了時(Try Again か Quit をクリックしてロビーかメニュー画面に戻ったとき)

に、自動で /refresh.au refresh)に相当する処理を行ってくれるようになります。

ミュート・アンミュートの条件の変更

デフォルトでは、例えば、

  • ロビーでは全員聴こえるし喋れる
  • タスク中は死者のみ聴こえるし喋れる
  • ディスカッション中は全員聴こえるが、喋れるのは生存者だけ

な状態ですが、このルールも細かくカスタマイズできます。コマンドは /settings voice-rules deaf-or-muted:<muted/deafened> phase:<フェイズ名> alive:<dead/alive> value:<True/False>.au settings voiceRules <mute/deaf> <フェイズ名> <dead/alive> <true/false>)で、パラメータはそれぞれ次の通りです。

  • muted/deafenedmute/deaf
    • muted でマイクミュートの設定を、deafened でスピーカミュートの設定を変更します
  • フェイズ名
    • ロビーは LOBBYlobby)、タスク中は TASKStasks)、ディスカッションは DISCUSSIONdiscussion)として、いずれかを指定します
  • dead/alive
    • dead で死者の設定を、alive で生存者の設定を変更します
  • True/Falsetrue/false
    • muted/deafened で指定した設定について、フェイズ名 で指定したフェイズ中の dead/alive で指定した状態のプレイヤの設定の有効(True)・無効(False)を指定します

デフォルトでは、以下のコマンド相当の設定が投入されています。

設定フェイズ生死デフォルト値
mutedLOBBYaliveFalse
mutedLOBBYdeadFalse
mutedTASKSaliveTrue
mutedTASKSdeafFalse
mutedDISCUSSIONaliveFalse
mutedDISCUSSIONdeafTrue
deafenedLOBBYaliveFalse
deafenedLOBBYdeafFalse
deafenedTASKSaliveTrue
deafenedTASKSdeafFalse
deafenedDISCUSSIONaliveFalse
deafenedDISCUSSIONdeafFalse

ボット操作のロールによる制限

AutoMuteUs では、デフォルトではボットに対するすべての操作をサーバの全員が行えてしまいますが、次の二つの役割を設定すると、ボットを操作できるメンバを制限できます。人数が多いサーバで何らかの統制が必要な場合には、この機能が便利に使えるかもしれません。

  • 管理者(admin
    • ボットに対するすべての操作を実行できる権限を持つユーザ
    • 管理者が一人以上設定されていると、設定の変更(/settings の実行)は管理者しかできなくなる
  • 運用者(operator
    • ゲームの作成や終了(/new/end)やポーズ(/pause)、強制アンミュート(/debug unmute-all)、設定変更(/settings)など、ゲームの操作やミュート・アンミュートに関わる処理を実行できる権限を持つロール
    • ただし、管理者が一人以上設定されている場合は、設定変更はできない

設定は、以下のコマンドで行います。

  • 管理者の指定
    • /settings admin-user-ids user user:<@ユーザ名>.au settings adminUserIDs <@ユーザ名>)で管理者を指定
      • /settings ... の場合は、ユーザ名は 1 ユーザずつ複数回のコマンドで指定する
      • .au ... の場合は、ユーザ名は必要なだけ複数名をスペース区切りで列挙する
    • /settings admin-user-ids clear.au settings adminUserIDs clear)で管理者設定をリセット
    • /settings admin-user-ids view.au settings adminUserIDs)で現在の設定を確認
  • 運用者の指定
    • /settings operator-roles role role:<@ロール名>.au settings operatorRoles<@ロール名>)で運用権限を与えるロールを指定
      • /settings ... の場合は、ロール名は 1 ロールずつ複数回のコマンドで指定する
      • .au ... の場合は、ロール名は必要なだけ複数をスペース区切りで列挙する)
    • /settings operator-roles clear.au settings operatorRoles clear)で運用者設定をリセット
    • /settings operator-roles view.au settings operatorRoles)で現在の設定を確認

設定した段階で、必要な権限を持たないユーザはコマンドを実行できなくなります。

管理者と運用者は必ずしも両方設定する必要はなく、どちらか一方でも構いません。また、サーバのオーナは、管理者と運用者の設定に関わらず、常にすべての操作を実行できます。

コマンドの簡易表記(6.x 以前のセルフホストのみ)

6.x 以前向けの .au から始まるコマンドは、本エントリでは一貫して完全表記で記載していますが、例えば .au settings.au s だけ、.au new.au n だけなど、一部のコマンドは簡易表記に対応しています。簡易表記は、一部はコマンドごとのヘルプで Aliases として記載されています。

どこにも書かれていない簡易表記も存在しており、挙げるとキリがないので列挙はしませんが、一例ではフェイズ名も簡略化が可能です。例えば次の二つのコマンドは同じ意味です。

  • .au settings delays discussion tasks 3
  • .au s d d t 3

ほかにも、turetfalsefclearc などちょこちょこあるので、遊べる環境があれば探してみるのもよいでしょう。いちばん確実なのは、ソースコードを読むことです。

コマンドを .au から別の文字列に変更する(6.x 以前のセルフホストのみ)

6.x 以前でデフォルトで .au になっているコマンドプレフィックスは、任意で別の文字列に変更できます。設定コマンドは次の通りです。

  • <現在のプレフィックス> settings commandPrefix <新しいプレフィックス>

例えば、現在のプレフィックスが .au で、これを .mybot に修正したい場合は、次の通りに操作します。

  • .au settings commandPrefix .mybot

以降は、例えば .mybot new などで操作できるようになります。

また、docker-compose.ymlsample.env で、AUTOMUTEUS_GLOBAL_PREFIX によるデフォルトのプレフィックスの変更に対応しています。ただし、プレフィックスはサーバ単位で保存されているため、途中から変えたい場合には結局は上記コマンドでの操作も併用する必要があります。

イースターエッグ(6.x 以前のセルフホストのみ)

実はこんなアスキーアートを表示する機能が隠されています。探してみましょう。

残念ながら 7.x では削除されています。

メッセージ中のルームコードの非表示

バージョン 6.13.0 から、ボットが投稿するメッセージ中のルームコードを、このように非表示にできるようになりました。

/settings display-room-code visibility:<always/spoiler/never>.au settings displayRoomCode <always/spoiler/never>)で変更できます。

デフォルトは always です。spoiler では Discord のネタバレ機能でコードが隠されるようになり、閲覧にクリックが必要になります。never では完全に秘匿されます。

マップの画像を差し替える

セルフホスト限定 ですが、バージョン 6.15.3 から、/map.au map)コマンドやゲーム開始時のメッセージに含まれるマップの画像を、自前のものに差し替えられるようになりました。ただし、画像が HTTP でホストされ ていて、かつ、所定のファイル名のルールに従っていて、さらに クエリ文字列 ?raw=true が付与されてもアクセスできる 必要があります。GitHub のリポジトリに PNG ファイルを配置するのがラクそうです。

設定は、.env にある環境変数 BASE_MAP_URL で画像群のベースになる URL を指定することで行います。内部的なデフォルトは https://github.com/denverquane/automuteus/blob/master/assets/maps/ です。

配置が必要な画像のファイル名は次の通りです。設定すると、マップの画像の URL として、BASE_MAP_URL と、ファイル名と、?raw=true を連結した文字列が利用されるようになります。

マップ(バージョン)ファイル名利用される URL
The Skeld(通常)the_skeld.pngBASE_MAP_URL + the_skeld.png?raw=true
The Skeld(詳細)the_skeld_detailed.pngBASE_MAP_URL + the_skeld_detailed.png?raw=true
MIRA HQ(通常)mira_hq.pngBASE_MAP_URL + mira_hq.png?raw=true
MIRA HQ(詳細)mira_hq_detailed.pngBASE_MAP_URL + mira_hq_detailed.png?raw=true
Polus(通常)polus.pngBASE_MAP_URL + polus.png?raw=true
Polus(詳細)polus_detailed.pngBASE_MAP_URL + polus_detailed.png?raw=true
The Airship(通常)airship.pngBASE_MAP_URL + airship.png?raw=true
The Airship(詳細)airship_detailed.pngBASE_MAP_URL + airship_detailed.png?raw=true

公式サービスの負荷状況の確認

公式サービスを無償で利用している場合、高負荷時にゲームを開始できない制約を受けます(有償サービスまたはセルフホストでの利用時は、この制約はありません)。

グローバルで 150 ゲーム がこの制限の閾値ですが、最近は日本時間で 21:00 頃から 24:00 頃 が特に高負荷で、この閾値を恒常的に超えた状態になっています。

次のグラフは、ある一日の公式サービスの負荷状況です。最近は連日だいたいこんな感じで、ピーク時は 230 近くまで増えることもあるようです。盛況ですね。

公式サービスの負荷状況(その時点でグローバルで実行されているゲームの数)は、公式サービスのボットに対して /info を実行すれば、結果の中の Active Games 欄で確認できます。

上図の例だと 153 なので、150 を超えているため、公式サービスの無償ユーザは .au new ができない状態です。

プレミアム機能のフリートライアル

公式サービスでは、2022 年 5 月のアップデートで、AutoMuteUs Premium の一部の機能を無料で試用できる ようになりました。試用すると、ブロンズ相当の以下の機能が有効化 されます。

  • 150 ゲームの制限の撤廃/new
    • ボットの負荷が高い時間帯でも、いつでもゲームを開始できるようになります
  • 統計や成績の詳細な表示/stats
  • 一部の高度な設定の有効化/settings
    • /settings list で表示される結果のうち、Premium Settings に区分される設定を確認・変更できるようになります
    • 試用期間中に変更した設定は、試用期間後も変更されたままになります

ただし、試用には以下の制約や条件 があります。

  • 試用は Discord のアカウント単位で有効化 されます
    • サーバ単位ではありません
    • 試用中のユーザ本人がコマンドを実行したときだけ機能します
  • 試用は Discord のアカウントごとに 1 回のみ で、有効期間は 12 時間 です
  • top.gg(Discord のボットの投票サイト)で、試用したい Discord のアカウントで AutoMuteUs に投票 する必要があります

少しややこしいのは、試用が Discord のアカウント単位 である点です。例えば、無償プランを使っているあるサーバに A さんと B さんがいて、そのうち A さんのみが試用を開始 した場合、/new/stats などのコマンドは、A さんが実行したときだけプレミアム扱い されます。同じコマンドを B さんが実行しても、プレミアム扱いはされません。したがって、例えばそのサーバで 150 ゲームの制限を回避してゲームを開始するには、/new を A さんに実行してもらう などの工夫が必要になります。

また、A さんが複数のサーバに所属している場合は、どのサーバでも A さんが実行したコマンドはプレミアム扱い されます(サーバですでに AutoMuteUs Premium を利用中の場合はそちらが優先されます)。

試用を開始するには、/premium info の出力の Vote for the Bot on top.gg のリンクか、top.gg の AutoMuteUs のページ で、試用を有効化したい Discord のアカウントでログインして投票するだけです(投票する前に広告を見る必要があります)。

/premium info で表示される投票用のリンク

top.gg での投票は時間を空ければ複数回できますが、何回投票しても AutoMuteUs の試用は Discord のアカウントあたり 1 回のみ で、有効期間は 投票から 12 時間 です。

投票後、有効期間中に /premium info を実行すると、試用中である旨が表示されます。

試用中である旨の表示

一緒に遊ぶプレイヤが多い場合は、日ごとに交代で試用を有効化するなど工夫すれば、便利に使えるかもしれません。

データベース内データのダウンロード

7.3 から、データベース内のデータを CSV ファイルとしてダウンロードできる機能が追加されました。ゴールド以上の公式サービス、またはセルフホストで利用できます。次のエントリで詳しく紹介しています。

API からの情報の取得

通常の用途では出番がない機能ですが、8.0 で RESTful API のエンドポイントが少しだけ用意されました。

automuteus コンテナが 5000 番ポート(デフォルト値)で待ち受けており、最新の docker-compose.yml ではこれがコンテナホストの 80 番(デフォルト値、環境変数 API_PORT で変更可)にバインドされています。

本ブログでは詳しくは取り上げませんが、詳細は起動後に /swagger/index.html で公開される Swagger UI で確認できます(Swagger UI で表示されるベース URL は環境変数 API_SERVER_URL で修正できます)。試す場合は 8.1.2 以降がおすすめです。

抜粋ですが、エンドポイントには以下のようなものがあります。

  • /bot/info
    • ボットの基礎情報(バージョン、登録ギルド数、アクティブゲーム数、累積ゲーム数など)
  • /bot/commands
    • コマンドの一覧
  • /game/state(要認証)
    • 現在実行中のゲームの詳細情報
  • /guild/settings(要認証)
    • ギルドの設定情報
  • /open/link
    • キャプチャソフトの起動

認証は、ユーザ名は固定で admin、パスワードはデフォルトで automuteus です。パスワードは環境変数 API_ADMIN_PASS で変更できます。

おわりに

AutoMuteUs のちょっとマイナかもしれない機能群を紹介しました。ほかにも、

  • タスク中に死んだら直ちにアンミュートする機能(/settings unmute-dead
  • ミュート・アンミュートを一時的にしなくする機能(/pause
    • 鬼ごっこや初参加者の練習時などに
  • 保存されているプレイヤ名の確認や削除(/debug view user/debug clear user
  • 設定のリセット(/settings reset
  • 全設定の現在の値の表示(/settings show
  • 統計収集の拒否(/privacy

など実にいろいろな機能があり、ヘルプをつぶさに観察するのも楽しいかもしれません。

AutoMuteUs 関連おすすめエントリ

@kurokobo

くろいです。ギターアンサンブルやら音響やらがフィールドの IT やさんなアルトギター弾き。たまこう 48 期ぎたさん、SFC '07 おんぞう、新日本ギターアンサンブル、Rubinetto。今は野良気味。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です