feat: game lobby service
This commit is contained in:
+22
-4
@@ -273,19 +273,29 @@ Accepted intents use the original Redis Stream `stream_entry_id` as
|
||||
| `lobby.application.submitted` | `Game Lobby` (`game_lobby`) | private owner (`audience_kind=user`) or public admins (`audience_kind=admin_email`) | private: `push+email`, public: `email` | `game_id`, `game_name`, `applicant_user_id`, `applicant_name` |
|
||||
| `lobby.membership.approved` | `Game Lobby` (`game_lobby`) | applicant user (`audience_kind=user`) | `push+email` | `game_id`, `game_name` |
|
||||
| `lobby.membership.rejected` | `Game Lobby` (`game_lobby`) | applicant user (`audience_kind=user`) | `push+email` | `game_id`, `game_name` |
|
||||
| `lobby.membership.blocked` | `Game Lobby` (`game_lobby`) | private-game owner (`audience_kind=user`) | `push+email` | `game_id`, `game_name`, `membership_user_id`, `membership_user_name`, `reason` |
|
||||
| `lobby.invite.created` | `Game Lobby` (`game_lobby`) | invited user (`audience_kind=user`) | `push+email` | `game_id`, `game_name`, `inviter_user_id`, `inviter_name` |
|
||||
| `lobby.invite.redeemed` | `Game Lobby` (`game_lobby`) | private-game owner (`audience_kind=user`) | `push+email` | `game_id`, `game_name`, `invitee_user_id`, `invitee_name` |
|
||||
| `lobby.invite.expired` | `Game Lobby` (`game_lobby`) | private-game owner (`audience_kind=user`) | `email` | `game_id`, `game_name`, `invitee_user_id`, `invitee_name` |
|
||||
| `lobby.race_name.registration_eligible` | `Game Lobby` (`game_lobby`) | capable member (`audience_kind=user`) | `push+email` | `game_id`, `game_name`, `race_name`, `eligible_until_ms` |
|
||||
| `lobby.race_name.registered` | `Game Lobby` (`game_lobby`) | registering user (`audience_kind=user`) | `push+email` | `race_name` |
|
||||
| `lobby.race_name.registration_denied` | `Game Lobby` (`game_lobby`) | incapable member (`audience_kind=user`) | `email` | `game_id`, `game_name`, `race_name`, `reason` |
|
||||
|
||||
Rules:
|
||||
|
||||
- v1 supports exactly the eleven `notification_type` values listed above
|
||||
- v1 supports exactly the fifteen `notification_type` values listed above
|
||||
- `lobby.application.submitted` keeps one stable `notification_type` and one
|
||||
stable `payload_json` shape; private games publish `audience_kind=user`
|
||||
while public games publish `audience_kind=admin_email`
|
||||
- `lobby.invite.revoked` deliberately produces no notification in v1 and
|
||||
remains outside the supported catalog
|
||||
- private-game invite notifications remain user-bound by internal `user_id`
|
||||
- `lobby.race_name.registration_eligible` and
|
||||
`lobby.race_name.registration_denied` are emitted by `Game Lobby` at
|
||||
`game_finished` based on capability evaluation; the former always pairs
|
||||
with a 30-day `eligible_until_ms` window
|
||||
- `lobby.race_name.registered` is emitted on successful
|
||||
`lobby.race_name.register` commit
|
||||
|
||||
## Recipient Enrichment And Locale Policy
|
||||
|
||||
@@ -343,14 +353,18 @@ User-facing push payloads use
|
||||
| `lobby.application.submitted` | `notification.LobbyApplicationSubmittedEvent` | `game_id`, `applicant_user_id` |
|
||||
| `lobby.membership.approved` | `notification.LobbyMembershipApprovedEvent` | `game_id` |
|
||||
| `lobby.membership.rejected` | `notification.LobbyMembershipRejectedEvent` | `game_id` |
|
||||
| `lobby.membership.blocked` | `notification.LobbyMembershipBlockedEvent` | `game_id`, `membership_user_id`, `reason` |
|
||||
| `lobby.invite.created` | `notification.LobbyInviteCreatedEvent` | `game_id`, `inviter_user_id` |
|
||||
| `lobby.invite.redeemed` | `notification.LobbyInviteRedeemedEvent` | `game_id`, `invitee_user_id` |
|
||||
| `lobby.race_name.registration_eligible` | `notification.LobbyRaceNameRegistrationEligibleEvent` | `game_id`, `race_name`, `eligible_until_ms` |
|
||||
| `lobby.race_name.registered` | `notification.LobbyRaceNameRegisteredEvent` | `race_name` |
|
||||
|
||||
Only the seven user-facing push notification types above are represented in
|
||||
Only the ten user-facing push notification types above are represented in
|
||||
`notification.fbs`.
|
||||
`geo.review_recommended`, `game.generation_failed`,
|
||||
`lobby.runtime_paused_after_start`, and `lobby.invite.expired` remain outside
|
||||
this schema because they are email-only in v1.
|
||||
`lobby.runtime_paused_after_start`, `lobby.invite.expired`, and
|
||||
`lobby.race_name.registration_denied` remain outside this schema because
|
||||
they are email-only in v1.
|
||||
|
||||
Checked-in generated Go bindings for this schema live under
|
||||
[`../pkg/schema/fbs/notification`](../pkg/schema/fbs/notification).
|
||||
@@ -403,9 +417,13 @@ Initial notification-owned template assets:
|
||||
| `lobby.application.submitted` | `lobby.application.submitted` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.membership.approved` | `lobby.membership.approved` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.membership.rejected` | `lobby.membership.rejected` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.membership.blocked` | `lobby.membership.blocked` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.invite.created` | `lobby.invite.created` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.invite.redeemed` | `lobby.invite.redeemed` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.invite.expired` | `lobby.invite.expired` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.race_name.registration_eligible` | `lobby.race_name.registration_eligible` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.race_name.registered` | `lobby.race_name.registered` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
| `lobby.race_name.registration_denied` | `lobby.race_name.registration_denied` | `en/subject.tmpl`, `en/text.tmpl` |
|
||||
|
||||
`auth.login_code` does not belong to the notification-owned template set.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user