feat(alerts): TASK 43 — native events & alerts (six unique animations) + chat parity
Replace the external StreamElements feed with NATIVE YouTube events per the creator's 2026-09-23 question. Chat parity half: - YouTubeChatService decodes ALL SIX liveChat/messages event types into ChatMessage.Kind (superChat/superSticker/newSponsor/membershipGifting/ giftMembershipReceived/memberMilestoneChat) — the four formerly-empty overlay rows are real now — and re-arms its one-shot poll on the server's pollingIntervalMillis (streamList connection semantics; clamp 1000-6000ms, maxResults=2000). ParsePage internal static seam + ChatPage record for deterministic tests; optional HttpClient ctor seam kept; InjectSimulatedMessage (TASK 41) preserved. Alerts half (creator rulings: one celebration zone, six UNIQUE animations, no menus/polls, sub mention = chat row only, NO viewer count): - New SourceType.AlertBox 'Stream Alerts' (one per layout, CanAddAlerts gate mirroring chat; idle = transparent). - AlertRenderer: six distinct branded animations (SuperChat slide-up/shine/ count-up, SuperSticker scale-pop, NewMember drop-in/flash, MemberGift slide-left/ chip-fan, GiftReceived confetti, MemberMilestone rise/growth-bar), every card drawing the 'made with LlamaCasty!' brand line. - AlertOverlayLayer: true component (Commit-G pattern) — queue (cap 10, drop tail never stall), 33ms UI ticker, cache-first RenderFrame + UpdatePreview, Advance(double) as the deterministic test clock; ChatEventKind.None rows never enqueue. - Wired: resolver RenderAlertBox, _alertLayer ctor + dispose, LoadLayout previews, Add menu item (Controls/LeftPanel.xaml), TestSessionViewModel sims tagged (member->NewMember, superchat->SuperChat). Good Dog ONE integration test: AlertLayerTests (RealApp STA, real WPF raster) — ParsePage classifies all six kinds + cadence fields; None rows enqueue nothing; six events play pairwise-distinct moving frames then drain to null. Gate: clean build 0 warnings; full suite 316/317, the one failure (LayerReorderPersistenceTests.RealMouseDrag) repros on the clean tree — the known environmental class (real-mouse-drag no-ops with a game/fullscreen window focused). References (OBS/overlay ecosystem): - streamList semantics: https://developers.google.com/youtube/v3/live/docs/liveChatMessages/streamList - OBS alert-box pattern (designated celebration zone, idle transparent): creator-chosen model
This commit is contained in:
@@ -58,12 +58,13 @@
|
||||
| 40 | App Settings round: active-camera picker + config dialog, gear move, defaults, accent | ☐ Queued (2026-09-22) — plan saved | [`TASKS/task-40-app-settings-round.md`](TASKS/task-40-app-settings-round.md) |
|
||||
| 41 | Test Stream mode: private test broadcast + TEST drawer (mock chat input + simulated events) | ✅ Done (2026-09-22) | [`TASKS/task-41-test-stream-mode.md`](TASKS/task-41-test-stream-mode.md) |
|
||||
| 42 | Top bar redesign: one REC-or-Stream surface, gear up top, sign-in/account zone world-gated | ✅ Done (2026-09-22) | [`TASKS/task-42-top-bar-redesign.md`](TASKS/task-42-top-bar-redesign.md) |
|
||||
| 43 | Native events & alerts: chat parity (all six event types + server poll cadence) + six-animation native alert box | ✅ Done (2026-09-24) | [`TASKS/task-43-native-alerts.md`](TASKS/task-43-native-alerts.md) |
|
||||
|
||||
---
|
||||
|
||||
## Open items (at a glance)
|
||||
|
||||
- **TASK 3** — items 16 (Text source), 17 (Alerts), 20 (Alerts precursor: RewardEvent capture) open
|
||||
- **TASK 3** — items 16 (Text source) + 20 (RewardEvent capture → SQLite, Alerts' persistence half) open; **17 (Alerts) is DONE via TASK 43 (2026-09-24) — native six-event alert box**
|
||||
- **TASK 9** — item 5 open (webcam identity key reconciliation)
|
||||
- **TASK 10** — Velopack update URL pending
|
||||
- **TASK 12** — queued future
|
||||
@@ -98,7 +99,17 @@
|
||||
poll round-trip renders on the overlay) + simulated Subscriber/New Member/Super Chat events that
|
||||
inject through the poller's `MessageReceived` seam (`IsSimulated` — YouTube's insert API only
|
||||
creates text, so these are local-only by design; styled member/SuperChat rows validate the chat
|
||||
overlay). Real stinger/TTS alert widgets stay out of scope (TASK 3 items 16/17/20).
|
||||
overlay). **Real Stinger/TTS alert widgets resolved by TASK 43's native alert box.**
|
||||
- **TASK 43 — Native events & alerts** — **DONE 2026-09-24** (`TASKS/task-43-native-alerts.md`):
|
||||
StreamElements replaced with NATIVE YouTube events. Chat parity half: `YouTubeChatService` now
|
||||
decodes all SIX `liveChat/messages` event types (`ChatEventKind` on `ChatMessage`) — the four
|
||||
formerly-empty event rows fixed — and re-arms its poll on the server's `pollingIntervalMillis`
|
||||
(streamList semantics, clamp 1000–6000ms, `maxResults=2000`). Alerts half: a new
|
||||
**`SourceType.AlertBox`** ("Stream Alerts", one per layout) is an OBS-style celebration zone
|
||||
where the six events play **six unique branded animations** (`AlertRenderer` + the
|
||||
`AlertOverlayLayer` component; 33ms ticker, deterministic `Advance` test clock; idle =
|
||||
transparent). Creator rulings baked in: free-sub mention = chat row only (no sub alert — YouTube
|
||||
emits none), NO viewer count, every alert card carries the "made with LlamaCasty!" brand line.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user