8793bd34f2
The statistics screen gains real depth, plus a hint-count bug fix found along the way. - Best move per variant: the screen shows the actual best-move word (drawn as game tiles; a wildcard shows its letter but no value), broken down by game variant, empty variants omitted. New account_best_move table, written at game finish. - Moves & hint share: two new lifetime tiles — the player's play count and the share of plays that used a hint — from summed account_stats counters (moves, hints_used). Honest-AI games are excluded, like the rest of the stats. - Hint-count fix: the in-game hint badge no longer goes stale across games. The global wallet now rides the wire apart from the per-game allowance (wallet_balance on StateView/HintResult/StatsView), so the client reads the live wallet rather than a per-game snapshot; game_players.hints_used now counts every hint (allowance + wallet), its true per-game total. - Account merge: sums the new moves/hints_used counters and merges the per-variant best moves (higher score kept), which it previously dropped. - Admin: the user card shows Moves and Hints used. - UI polish: tab/label wording, game-over text, and e2e selectors hardened against label changes. All wire additions are trailing (backward-compatible). Docs (ARCHITECTURE, FUNCTIONAL +ru, UISN_DESIGN) updated in step.
95 lines
3.1 KiB
Go
95 lines
3.1 KiB
Go
package notify
|
|
|
|
// The structs below are the wire-agnostic inputs the domain services hand to the
|
|
// enriched event constructors. Keeping them here — rather than importing the wire
|
|
// schema into game/lobby/social — preserves the package boundary: notify owns the
|
|
// FlatBuffers encoding, while the domain only fills in already-resolved values (seat
|
|
// display names, alphabet-index racks). Each mirrors the matching scrabblefb table.
|
|
|
|
// SeatStanding is one seat's public standing inside a GameSummary (mirrors
|
|
// scrabblefb.SeatView).
|
|
type SeatStanding struct {
|
|
Seat int
|
|
AccountID string
|
|
DisplayName string
|
|
Score int
|
|
HintsUsed int
|
|
IsWinner bool
|
|
}
|
|
|
|
// GameSummary is the shared, non-private game state embedded in enriched events
|
|
// (mirrors scrabblefb.GameView). LastActivityUnix is the lobby sort key: the current
|
|
// turn's start for an active game, the finish time once finished.
|
|
type GameSummary struct {
|
|
ID string
|
|
Variant string
|
|
DictVersion string
|
|
Status string
|
|
Players int
|
|
ToMove int
|
|
TurnTimeoutSecs int
|
|
MultipleWordsPerTurn bool
|
|
// VsAI marks an honest-AI game (the opponent is shown as 🤖, chat/nudge/add-friend off).
|
|
VsAI bool
|
|
MoveCount int
|
|
EndReason string
|
|
Seats []SeatStanding
|
|
LastActivityUnix int64
|
|
}
|
|
|
|
// AlphabetLetter is one variant alphabet entry (a display-only row) embedded in an
|
|
// initial PlayerState so a client seeing a variant for the first time can render its
|
|
// rack (mirrors scrabblefb.AlphabetEntry).
|
|
type AlphabetLetter struct {
|
|
Index int
|
|
Letter string
|
|
Value int
|
|
}
|
|
|
|
// PlayerState is a player's full initial view of a game — the shared summary plus
|
|
// their private rack and budgets (mirrors scrabblefb.StateView). Rack carries wire
|
|
// alphabet indices (a blank is the sentinel index 255). Alphabet is set only when the
|
|
// recipient may not have cached the variant yet (match_found / game_started).
|
|
type PlayerState struct {
|
|
Game GameSummary
|
|
Seat int
|
|
Rack []int
|
|
BagLen int
|
|
HintsRemaining int
|
|
WalletBalance int
|
|
Alphabet []AlphabetLetter
|
|
}
|
|
|
|
// AccountRef is a referenced account with its display name resolved (mirrors
|
|
// scrabblefb.AccountRef).
|
|
type AccountRef struct {
|
|
AccountID string
|
|
DisplayName string
|
|
}
|
|
|
|
// InvitationInvitee is one invited player's seat and response inside an
|
|
// InvitationSummary (mirrors scrabblefb.InvitationInvitee).
|
|
type InvitationInvitee struct {
|
|
AccountID string
|
|
DisplayName string
|
|
Seat int
|
|
Response string
|
|
}
|
|
|
|
// InvitationSummary is a friend-game invitation carried by the NotifyInvitation event so
|
|
// the client adds it to its lobby list without a refetch (mirrors scrabblefb.Invitation).
|
|
type InvitationSummary struct {
|
|
ID string
|
|
Inviter AccountRef
|
|
Invitees []InvitationInvitee
|
|
Variant string
|
|
TurnTimeoutSecs int
|
|
HintsAllowed bool
|
|
HintsPerPlayer int
|
|
MultipleWordsPerTurn bool
|
|
DropoutTiles string
|
|
Status string
|
|
GameID string
|
|
ExpiresAtUnix int64
|
|
}
|