feat(alerts): add scene-local recent ticker

Model the AlertBox and standalone ticker with shared settings; scene tickers render the in-memory active and queued events without saving history. Keep AlertBox content active-event-only.

Ref: https://obsproject.com/kb/obs-studio-overview
This commit is contained in:
2026-11-02 10:47:48 -08:00
parent 6208cb9409
commit 20f059422b
20 changed files with 339 additions and 90 deletions
+19 -3
View File
@@ -5,7 +5,7 @@
> the creator picks their own clip (referenced from disk, never stored in the DB), the
> clip fades in/out in ~0.3s (alpha envelope on the video + volume on the audio, mixed
> into the live stream at unity — no duck), and an auto-composed **message ticker**
> ("Funder — Super Chat · $10.00") scrolls across the very top of the frame, toggleable.
> ("Funder — Super Chat · $10.00") appears inside the Stream Alerts box, toggleable.
> The six TASK 43 animations remain the intrinsic fallback when no asset is playable.
## Provenance (recorded per the feature-provenance rule)
@@ -25,8 +25,9 @@
read-at-play clip lets the creator re-edit the file without a re-import). Decided
with the creator: "never store the video in the layout." The built-in default is the
one BLOB, stamped into the internal `Asset` table at startup.
- **Creator rulings (asked once, held):** custom video + six-animation fallback
(not either/or); ticker on top of the canvas (very top, full width); **no ducking** —
- **Original creator rulings (asked once, held):** custom video + six-animation fallback
(not either/or); ticker on top of the canvas (the placement was later corrected to
inside Stream Alerts); **no ducking** —
"don't lower my game audio for a tip" (the TASK 43 planner's auto-duck idea was
rejected on the floor); a per-alert **Volume** slider instead.
@@ -309,3 +310,18 @@ Flash is on for half of each second; the panel shows and writes back the chosen
risk by asserting all three alert fields together.
Full suite 339/339.
## Scene-local recent-alert ticker
The standalone `SourceType.Ticker` layer is addable once per scene. It shares the
`Models/Ticker.cs` settings and `AlertTickerRenderer` with the AlertBox ticker, but
each source has an independent `Ticker` object. The existing per-Source ticker DB
columns persist both kinds without an alert-history table or schema migration. The
standalone feed renders the active event followed by queued events; completed events
are discarded. The AlertBox ticker remains limited to the active event and uses the
active scene's AlertBox settings. Standalone tickers are ordinary dynamic sources in
preview and output; the AlertBox ticker remains a positioned compositor overlay.
The integration guard in `AlertTickerPreviewDisplayTests` uses two scene tickers to
prove settings are independent, then checks that the standalone feed differs from
the AlertBox's active-only message while a second event is queued.