241 lines
4.2 KiB
Plaintext
241 lines
4.2 KiB
Plaintext
修正版。仕様はこう整理すると実装しやすい。
|
|
|
|
# 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 |