Skip to content

Feat/game focused scoreboard - #10

Merged
0xclx merged 2 commits into
mainfrom
feat/game-focused-scoreboard
Sep 28, 2026
Merged

0xclx merged 2 commits into
mainfrom
feat/game-focused-scoreboard

Conversation

@0xclx

@0xclx 0xclx commented Sep 28, 2026

Copy link
Copy Markdown
Owner

No description provided.

Scoreboard (Home featured event, Scoreboard and Overview tabs, public link),
all rendering one EventScoreboardView in three states:

- Not started: a pre-start overview of the games (objective count, points,
  Custom chip) and the competitor roster, built from the event response
  alone; no /scoreboard request. EventCompetitorResponse gains twitchLogin
  and profileImageUrl for it.
- Started with an enabled game: a "Current game / Whole event" switch bound
  to ?view=, defaulting to the current game: "Now playing" header and
  standings ordered by the server's new per-game rank
  (GameBreakdown.Rank, computed with the event's tie-break mode from
  official figures only), with a named progress bar, Done chip, event
  total with event rank, and trial figures for the current game only.
- Whole event: a per-game matrix (score, x/y, per-game #rank or "—" before
  anyone has a result), rows in event-rank order.

Rows and cells open an objectives dialog for that competitor and game;
a competitor search filters without renumbering and announces the match
count; below md both views become cards. Surfaces re-read the event and
the scoreboard every 30 s and resync at once when the event starts or the
enabled game changes. The old table, rows, cards and the Overview preview
are removed; docs updated.

Server timestamps are UTC only: global JSON converters read a zone-less
request timestamp as UTC (never the server's local time) and write UTC,
and the backend test assemblies run in a non-UTC zone so a local-time leak
fails the tests.
Sample events: an admin "Sample data" page (any environment, behind a
confirmation) creates the same five "Sample: " events every time, each in
a different state (not started, game in progress, between games, seven
games, empty setup), with custom Souls-series games and categorised
objectives but no competitors. POST /admin/sample-events runs
SampleEventSeeder, which writes everything plus an event.created audit
each in one save and is callable directly from IntegrationTests.

Custom display names: users gain TwitchDisplayName (refreshed on sign-in)
and DisplayNameOverride (max 50 chars); DisplayName stays the shown name,
override ?? Twitch, so a chosen name survives sign-in. Migration
AddDisplayNameOverride backfills the Twitch name. Users set or clear their
own on the Profile page (PATCH /users/me/display-name), admins anyone's
from the Users tab (PATCH /admin/users/{id}/display-name). Changes are
validated (trimmed, 1-50 chars, no control characters), audited as
user.display_name_changed, and evict the cached scoreboard of every event
the user plays (also /scores, overlay, Twitch extension) and the calendar.
@0xclx
0xclx merged commit 6ae2a39 into main Sep 28, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant