修正版。仕様はこう整理すると実装しやすい。 # VRC_LOG event.toml 監視仕様 ## 1. 目的 VRChatログから現在インスタンスの入退室を拾い、必要最低限だけ表示する。 表示対象は以下のみ。 - ワールド入室 - guest の現在人数 - guest の join / leave - staff の join / leave staff は表示するが guest 人数にはカウントしない。 --- ## 2. event.toml ```toml [staff] names = [ "StaffUserA", "StaffUserB" ] [guest] names = [ "GuestUserA", "GuestUserB", "GuestUserC" ] [notice] missing_count = 3 注意。 nofice ではなく notice にする。 意味は「通知設定」。 3. カウント仕様 3.1 guest人数 guest人数は event.toml の [guest].names にいるユーザーだけを数える。 staff は数えない。 現在Guest: 1/22 意味。 現在いるguest数 / guest登録総数 3.2 自分の入室順は関係ない 自分がインスタンスに何番目に入ったかは使わない。 現在インスタンス内で発生した join / leave を時系列で処理し、最終的な在室状態から人数を出す。 4. ログ範囲 解析対象は昼12:00以降。 実行時刻が 01:00 の場合。 前日 12:00 以降 実行時刻が 13:00 の場合。 当日 12:00 以降 11:59以前のインスタンスは切り捨てる。 5. インスタンス仕様 昼12:00以降に検出した最新のワールド / インスタンスだけを対象にする。 インスタンスが変わったら、参加状態はリセットする。 6. 表示仕様 6.1 ワールド入室 ワールドに入った時だけ表示。 ワールド入室: Midnight Rooftop 現在Guest: 1/22 ワールド名が取れない場合。 ワールド入室: wrld_xxx 現在Guest: 1/22 7. join / leave 表示仕様 7.1 guest join [01:20] GuestUserA join 2/22 7.2 guest leave [01:25] GuestUserA leave 1/22 7.3 staff join staff は人数カウントしない。 [staff] StaffUserA join 1/22 7.4 staff leave staff が抜けても guest人数は変わらない。 [staff] StaffUserA leave 1/22 8. notice 判定 notice.missing_count = 3 の場合、guest登録総数から3人以内の不足になったら、今いないguest名を出す。 例。 guest登録総数が23人。 missing_count が3。 通知対象人数は以下。 20人 21人 22人 つまり、 23 - 3 = 20 なので、guest現在人数が 20〜22 の間なら不足者を表示する。 9. notice 表示例 guest総数23人、notice=3。 9.1 20人になった場合 現在Guest: 20/23 未入室Guest: - GuestUserA - GuestUserB - GuestUserC 9.2 21人になった場合 現在Guest: 21/23 未入室Guest: - GuestUserA - GuestUserB 9.3 22人になった場合 現在Guest: 22/23 未入室Guest: - GuestUserA 9.4 23人になった場合 表示しない。 9.5 23人から22人に減った場合 再度表示する。 現在Guest: 22/23 未入室Guest: - GuestUserA 9.6 19人以下になった場合 表示しない。 理由。 23 - 3 = 20 なので、20人未満は通知範囲外。 10. notice 条件 通知する条件。 total_guest - notice <= current_guest < total_guest 例。 23 - 3 <= current_guest < 23 つまり。 20 <= current_guest < 23 通知しない条件。 current_guest == total_guest current_guest < total_guest - notice 11. 最終出力例 ワールド入室: Midnight Rooftop 現在Guest: 1/22 [staff] StaffUserA join 1/22 [01:20] GuestUserA join 2/22 [01:21] GuestUserB join 3/22 [01:22] GuestUserC join 4/22 [01:25] GuestUserB leave 3/22 [staff] StaffUserA leave 3/22 notice条件に入った場合。 現在Guest: 20/23 未入室Guest: - GuestUserA - GuestUserB - GuestUserC 12. 実装時の内部状態 world_name world_id instance_id guest_total guest_present_set staff_present_set current_guest_count notice_missing_count ユーザー分類。 if name in staff: role = "staff" elif name in guest: role = "guest" else: role = "other" other は表示しない。 guest人数にも含めない。 13. Discord通知も同じ最小表示 Discordには以下だけ送る。 ワールド入室: Midnight Rooftop 現在Guest: 1/22 [staff] StaffUserA join 1/22 [01:20] GuestUserA join 2/22 [01:25] GuestUserA leave 1/22 notice時だけ追加。 未入室Guest: - GuestUserA - GuestUserB