e40adfb0c7
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 21s
CI / ui (pull_request) Successful in 1m10s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m56s
Address review of the active-game limit lock: - Live-event GameViews (opponent_moved, match_found, game_started, ...) did not carry game_kind, so a lobby patch from an event zeroed a game's kind and the client's per-kind count under-counted — a capped kind read as free (a disabled start instead of the lock, and a wrong per-kind result). Thread Kind through notify.GameSummary → the event GameView. - New Game screen refreshes the lobby games on mount so the per-kind count reflects the current set, not a stale cached snapshot. - The guest funnel's login button routes to the profile screen (the account controls), not settings. - Copy: the guest prompt is "sign in to use all the game's features"; the durable notice is "finish your active games to start a new one". Regression tests: the notify opponent-moved payload carries kind; the client lock locks only the reached kind (vs_ai at cap leaves random open).
97 lines
3.3 KiB
Go
97 lines
3.3 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
|
|
// Kind is the game's origin for the active-game limits (0 unknown, 1 vs_ai, 2 random, 3 friends);
|
|
// it rides live events so a lobby patch keeps the per-kind count correct.
|
|
Kind int
|
|
}
|
|
|
|
// 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
|
|
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
|
|
}
|