feat: game lobby service
This commit is contained in:
@@ -29,8 +29,9 @@ type GetMyAccountRequest struct{}
|
||||
// UpdateMyProfileRequest stores the authenticated self-service profile
|
||||
// mutation request.
|
||||
type UpdateMyProfileRequest struct {
|
||||
// RaceName stores the requested exact replacement race name.
|
||||
RaceName string `json:"race_name"`
|
||||
// DisplayName stores the requested replacement display name. An empty
|
||||
// value resets the stored display name.
|
||||
DisplayName string `json:"display_name"`
|
||||
}
|
||||
|
||||
// UpdateMySettingsRequest stores the authenticated self-service settings
|
||||
@@ -134,8 +135,12 @@ type Account struct {
|
||||
// Email stores the exact-after-trim login e-mail address.
|
||||
Email string `json:"email"`
|
||||
|
||||
// RaceName stores the current user-facing race name.
|
||||
RaceName string `json:"race_name"`
|
||||
// UserName stores the immutable `player-<suffix>` handle assigned at
|
||||
// account creation.
|
||||
UserName string `json:"user_name"`
|
||||
|
||||
// DisplayName stores the current optional free-text user label.
|
||||
DisplayName string `json:"display_name,omitempty"`
|
||||
|
||||
// PreferredLanguage stores the current BCP 47 language tag.
|
||||
PreferredLanguage string `json:"preferred_language"`
|
||||
|
||||
@@ -82,6 +82,13 @@ const (
|
||||
// `lobby.membership.rejected` notification.
|
||||
NotificationTypeLobbyMembershipRejected NotificationType = "lobby.membership.rejected"
|
||||
|
||||
// NotificationTypeLobbyMembershipBlocked identifies the
|
||||
// `lobby.membership.blocked` notification published by Game Lobby
|
||||
// to the private-game owner when an active membership is blocked
|
||||
// by the user-lifecycle cascade reacting to a `permanent_block` or
|
||||
// `DeleteUser` event.
|
||||
NotificationTypeLobbyMembershipBlocked NotificationType = "lobby.membership.blocked"
|
||||
|
||||
// NotificationTypeLobbyInviteCreated identifies the
|
||||
// `lobby.invite.created` notification.
|
||||
NotificationTypeLobbyInviteCreated NotificationType = "lobby.invite.created"
|
||||
@@ -93,6 +100,24 @@ const (
|
||||
// NotificationTypeLobbyInviteExpired identifies the
|
||||
// `lobby.invite.expired` notification.
|
||||
NotificationTypeLobbyInviteExpired NotificationType = "lobby.invite.expired"
|
||||
|
||||
// NotificationTypeLobbyRaceNameRegistrationEligible identifies the
|
||||
// `lobby.race_name.registration_eligible` notification published by
|
||||
// Game Lobby when capability evaluation at game finish promotes a
|
||||
// reservation to `pending_registration`.
|
||||
NotificationTypeLobbyRaceNameRegistrationEligible NotificationType = "lobby.race_name.registration_eligible"
|
||||
|
||||
// NotificationTypeLobbyRaceNameRegistered identifies the
|
||||
// `lobby.race_name.registered` notification published by Game Lobby
|
||||
// when a user converts a `pending_registration` into a permanent
|
||||
// registered race name.
|
||||
NotificationTypeLobbyRaceNameRegistered NotificationType = "lobby.race_name.registered"
|
||||
|
||||
// NotificationTypeLobbyRaceNameRegistrationDenied identifies the
|
||||
// `lobby.race_name.registration_denied` notification published by
|
||||
// Game Lobby when capability evaluation at game finish releases a
|
||||
// reservation because the member did not meet the capability rule.
|
||||
NotificationTypeLobbyRaceNameRegistrationDenied NotificationType = "lobby.race_name.registration_denied"
|
||||
)
|
||||
|
||||
// String returns the wire value for notificationType.
|
||||
@@ -111,9 +136,13 @@ func (notificationType NotificationType) IsKnown() bool {
|
||||
NotificationTypeLobbyApplicationSubmitted,
|
||||
NotificationTypeLobbyMembershipApproved,
|
||||
NotificationTypeLobbyMembershipRejected,
|
||||
NotificationTypeLobbyMembershipBlocked,
|
||||
NotificationTypeLobbyInviteCreated,
|
||||
NotificationTypeLobbyInviteRedeemed,
|
||||
NotificationTypeLobbyInviteExpired:
|
||||
NotificationTypeLobbyInviteExpired,
|
||||
NotificationTypeLobbyRaceNameRegistrationEligible,
|
||||
NotificationTypeLobbyRaceNameRegistered,
|
||||
NotificationTypeLobbyRaceNameRegistrationDenied:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
@@ -133,9 +162,13 @@ func (notificationType NotificationType) ExpectedProducer() Producer {
|
||||
NotificationTypeLobbyApplicationSubmitted,
|
||||
NotificationTypeLobbyMembershipApproved,
|
||||
NotificationTypeLobbyMembershipRejected,
|
||||
NotificationTypeLobbyMembershipBlocked,
|
||||
NotificationTypeLobbyInviteCreated,
|
||||
NotificationTypeLobbyInviteRedeemed,
|
||||
NotificationTypeLobbyInviteExpired:
|
||||
NotificationTypeLobbyInviteExpired,
|
||||
NotificationTypeLobbyRaceNameRegistrationEligible,
|
||||
NotificationTypeLobbyRaceNameRegistered,
|
||||
NotificationTypeLobbyRaceNameRegistrationDenied:
|
||||
return ProducerGameLobby
|
||||
default:
|
||||
return ""
|
||||
@@ -169,7 +202,8 @@ func (notificationType NotificationType) SupportsChannel(audienceKind AudienceKi
|
||||
return channel == ChannelEmail
|
||||
}
|
||||
return channel == ChannelPush || channel == ChannelEmail
|
||||
case NotificationTypeLobbyInviteExpired:
|
||||
case NotificationTypeLobbyInviteExpired,
|
||||
NotificationTypeLobbyRaceNameRegistrationDenied:
|
||||
return audienceKind == AudienceKindUser && channel == ChannelEmail
|
||||
default:
|
||||
return audienceKind == AudienceKindUser && (channel == ChannelPush || channel == ChannelEmail)
|
||||
@@ -752,10 +786,21 @@ func validatePayloadObject(notificationType NotificationType, payload map[string
|
||||
return validateStringFields(payload, "game_id", "game_name", "applicant_user_id", "applicant_name")
|
||||
case NotificationTypeLobbyMembershipApproved, NotificationTypeLobbyMembershipRejected:
|
||||
return validateStringFields(payload, "game_id", "game_name")
|
||||
case NotificationTypeLobbyMembershipBlocked:
|
||||
return validateStringFields(payload, "game_id", "game_name", "membership_user_id", "membership_user_name", "reason")
|
||||
case NotificationTypeLobbyInviteCreated:
|
||||
return validateStringFields(payload, "game_id", "game_name", "inviter_user_id", "inviter_name")
|
||||
case NotificationTypeLobbyInviteRedeemed, NotificationTypeLobbyInviteExpired:
|
||||
return validateStringFields(payload, "game_id", "game_name", "invitee_user_id", "invitee_name")
|
||||
case NotificationTypeLobbyRaceNameRegistrationEligible:
|
||||
if err := validateStringFields(payload, "game_id", "game_name", "race_name"); err != nil {
|
||||
return err
|
||||
}
|
||||
return validatePositiveIntFields(payload, "eligible_until_ms")
|
||||
case NotificationTypeLobbyRaceNameRegistered:
|
||||
return validateStringFields(payload, "race_name")
|
||||
case NotificationTypeLobbyRaceNameRegistrationDenied:
|
||||
return validateStringFields(payload, "game_id", "game_name", "race_name", "reason")
|
||||
default:
|
||||
return fmt.Errorf("payload_json notification type %q is unsupported", notificationType)
|
||||
}
|
||||
|
||||
@@ -159,6 +159,23 @@ func TestConstructorsBuildExpectedIntentValues(t *testing.T) {
|
||||
recipientUserIDs: []string{"applicant-1"},
|
||||
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash"}`,
|
||||
},
|
||||
{
|
||||
name: "lobby membership blocked",
|
||||
build: func() (Intent, error) {
|
||||
return NewLobbyMembershipBlockedIntent(metadata, "owner-1", LobbyMembershipBlockedPayload{
|
||||
GameID: "game-1",
|
||||
GameName: "Nebula Clash",
|
||||
MembershipUserID: "user-2",
|
||||
MembershipUserName: "player-aabbccdd",
|
||||
Reason: "permanent_blocked",
|
||||
})
|
||||
},
|
||||
notificationType: NotificationTypeLobbyMembershipBlocked,
|
||||
producer: ProducerGameLobby,
|
||||
audienceKind: AudienceKindUser,
|
||||
recipientUserIDs: []string{"owner-1"},
|
||||
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","membership_user_id":"user-2","membership_user_name":"player-aabbccdd","reason":"permanent_blocked"}`,
|
||||
},
|
||||
{
|
||||
name: "lobby invite created",
|
||||
build: func() (Intent, error) {
|
||||
@@ -207,6 +224,51 @@ func TestConstructorsBuildExpectedIntentValues(t *testing.T) {
|
||||
recipientUserIDs: []string{"owner-1"},
|
||||
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","invitee_user_id":"invitee-1","invitee_name":"Nova Pilot"}`,
|
||||
},
|
||||
{
|
||||
name: "lobby race name registration eligible",
|
||||
build: func() (Intent, error) {
|
||||
return NewLobbyRaceNameRegistrationEligibleIntent(metadata, "user-7", LobbyRaceNameRegistrationEligiblePayload{
|
||||
GameID: "game-1",
|
||||
GameName: "Nebula Clash",
|
||||
RaceName: "Skylancer",
|
||||
EligibleUntilMs: 1775208100000,
|
||||
})
|
||||
},
|
||||
notificationType: NotificationTypeLobbyRaceNameRegistrationEligible,
|
||||
producer: ProducerGameLobby,
|
||||
audienceKind: AudienceKindUser,
|
||||
recipientUserIDs: []string{"user-7"},
|
||||
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","race_name":"Skylancer","eligible_until_ms":1775208100000}`,
|
||||
},
|
||||
{
|
||||
name: "lobby race name registered",
|
||||
build: func() (Intent, error) {
|
||||
return NewLobbyRaceNameRegisteredIntent(metadata, "user-8", LobbyRaceNameRegisteredPayload{
|
||||
RaceName: "Skylancer",
|
||||
})
|
||||
},
|
||||
notificationType: NotificationTypeLobbyRaceNameRegistered,
|
||||
producer: ProducerGameLobby,
|
||||
audienceKind: AudienceKindUser,
|
||||
recipientUserIDs: []string{"user-8"},
|
||||
payloadJSON: `{"race_name":"Skylancer"}`,
|
||||
},
|
||||
{
|
||||
name: "lobby race name registration denied",
|
||||
build: func() (Intent, error) {
|
||||
return NewLobbyRaceNameRegistrationDeniedIntent(metadata, "user-9", LobbyRaceNameRegistrationDeniedPayload{
|
||||
GameID: "game-1",
|
||||
GameName: "Nebula Clash",
|
||||
RaceName: "Skylancer",
|
||||
Reason: "capability_not_met",
|
||||
})
|
||||
},
|
||||
notificationType: NotificationTypeLobbyRaceNameRegistrationDenied,
|
||||
producer: ProducerGameLobby,
|
||||
audienceKind: AudienceKindUser,
|
||||
recipientUserIDs: []string{"user-9"},
|
||||
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","race_name":"Skylancer","reason":"capability_not_met"}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
@@ -62,6 +62,20 @@ type LobbyMembershipRejectedPayload struct {
|
||||
GameName string `json:"game_name"`
|
||||
}
|
||||
|
||||
// LobbyMembershipBlockedPayload stores the normalized payload for
|
||||
// `lobby.membership.blocked` published by the user-lifecycle cascade
|
||||
// when an active membership is blocked because the underlying user was
|
||||
// permanently blocked or deleted.
|
||||
type LobbyMembershipBlockedPayload struct {
|
||||
GameID string `json:"game_id"`
|
||||
GameName string `json:"game_name"`
|
||||
MembershipUserID string `json:"membership_user_id"`
|
||||
MembershipUserName string `json:"membership_user_name"`
|
||||
// Reason captures the upstream lifecycle event that triggered the
|
||||
// cascade. Frozen vocabulary: `permanent_blocked`, `deleted`.
|
||||
Reason string `json:"reason"`
|
||||
}
|
||||
|
||||
// LobbyInviteCreatedPayload stores the normalized payload for
|
||||
// `lobby.invite.created`.
|
||||
type LobbyInviteCreatedPayload struct {
|
||||
@@ -89,6 +103,30 @@ type LobbyInviteExpiredPayload struct {
|
||||
InviteeName string `json:"invitee_name"`
|
||||
}
|
||||
|
||||
// LobbyRaceNameRegistrationEligiblePayload stores the normalized payload
|
||||
// for `lobby.race_name.registration_eligible`.
|
||||
type LobbyRaceNameRegistrationEligiblePayload struct {
|
||||
GameID string `json:"game_id"`
|
||||
GameName string `json:"game_name"`
|
||||
RaceName string `json:"race_name"`
|
||||
EligibleUntilMs int64 `json:"eligible_until_ms"`
|
||||
}
|
||||
|
||||
// LobbyRaceNameRegisteredPayload stores the normalized payload for
|
||||
// `lobby.race_name.registered`.
|
||||
type LobbyRaceNameRegisteredPayload struct {
|
||||
RaceName string `json:"race_name"`
|
||||
}
|
||||
|
||||
// LobbyRaceNameRegistrationDeniedPayload stores the normalized payload for
|
||||
// `lobby.race_name.registration_denied`.
|
||||
type LobbyRaceNameRegistrationDeniedPayload struct {
|
||||
GameID string `json:"game_id"`
|
||||
GameName string `json:"game_name"`
|
||||
RaceName string `json:"race_name"`
|
||||
Reason string `json:"reason"`
|
||||
}
|
||||
|
||||
// NewGeoReviewRecommendedIntent builds the admin-email intent published by Geo
|
||||
// Profile Service when a user becomes review-worthy.
|
||||
func NewGeoReviewRecommendedIntent(metadata Metadata, payload GeoReviewRecommendedPayload) (Intent, error) {
|
||||
@@ -143,6 +181,14 @@ func NewLobbyMembershipRejectedIntent(metadata Metadata, applicantUserID string,
|
||||
return newIntent(NotificationTypeLobbyMembershipRejected, ProducerGameLobby, AudienceKindUser, []string{applicantUserID}, metadata, payload)
|
||||
}
|
||||
|
||||
// NewLobbyMembershipBlockedIntent builds the private-game owner intent
|
||||
// published by Game Lobby when an active membership is blocked by the
|
||||
// user-lifecycle cascade. ownerUserID is the recipient (private-game
|
||||
// owner whose roster lost the affected member).
|
||||
func NewLobbyMembershipBlockedIntent(metadata Metadata, ownerUserID string, payload LobbyMembershipBlockedPayload) (Intent, error) {
|
||||
return newIntent(NotificationTypeLobbyMembershipBlocked, ProducerGameLobby, AudienceKindUser, []string{ownerUserID}, metadata, payload)
|
||||
}
|
||||
|
||||
// NewLobbyInviteCreatedIntent builds the invited-user intent published by Game
|
||||
// Lobby when a private-game invite is created.
|
||||
func NewLobbyInviteCreatedIntent(metadata Metadata, invitedUserID string, payload LobbyInviteCreatedPayload) (Intent, error) {
|
||||
@@ -160,3 +206,23 @@ func NewLobbyInviteRedeemedIntent(metadata Metadata, ownerUserID string, payload
|
||||
func NewLobbyInviteExpiredIntent(metadata Metadata, ownerUserID string, payload LobbyInviteExpiredPayload) (Intent, error) {
|
||||
return newIntent(NotificationTypeLobbyInviteExpired, ProducerGameLobby, AudienceKindUser, []string{ownerUserID}, metadata, payload)
|
||||
}
|
||||
|
||||
// NewLobbyRaceNameRegistrationEligibleIntent builds the capable-member intent
|
||||
// published by Game Lobby at game finish when a reservation is promoted to
|
||||
// `pending_registration`.
|
||||
func NewLobbyRaceNameRegistrationEligibleIntent(metadata Metadata, recipientUserID string, payload LobbyRaceNameRegistrationEligiblePayload) (Intent, error) {
|
||||
return newIntent(NotificationTypeLobbyRaceNameRegistrationEligible, ProducerGameLobby, AudienceKindUser, []string{recipientUserID}, metadata, payload)
|
||||
}
|
||||
|
||||
// NewLobbyRaceNameRegisteredIntent builds the registering-user intent
|
||||
// published by Game Lobby on successful `lobby.race_name.register` commit.
|
||||
func NewLobbyRaceNameRegisteredIntent(metadata Metadata, recipientUserID string, payload LobbyRaceNameRegisteredPayload) (Intent, error) {
|
||||
return newIntent(NotificationTypeLobbyRaceNameRegistered, ProducerGameLobby, AudienceKindUser, []string{recipientUserID}, metadata, payload)
|
||||
}
|
||||
|
||||
// NewLobbyRaceNameRegistrationDeniedIntent builds the incapable-member intent
|
||||
// published by Game Lobby at game finish when a reservation is released
|
||||
// without a pending-registration window.
|
||||
func NewLobbyRaceNameRegistrationDeniedIntent(metadata Metadata, recipientUserID string, payload LobbyRaceNameRegistrationDeniedPayload) (Intent, error) {
|
||||
return newIntent(NotificationTypeLobbyRaceNameRegistrationDenied, ProducerGameLobby, AudienceKindUser, []string{recipientUserID}, metadata, payload)
|
||||
}
|
||||
|
||||
@@ -25,6 +25,12 @@ table LobbyMembershipRejectedEvent {
|
||||
game_id:string;
|
||||
}
|
||||
|
||||
table LobbyMembershipBlockedEvent {
|
||||
game_id:string;
|
||||
membership_user_id:string;
|
||||
reason:string;
|
||||
}
|
||||
|
||||
table LobbyInviteCreatedEvent {
|
||||
game_id:string;
|
||||
inviter_user_id:string;
|
||||
@@ -35,4 +41,14 @@ table LobbyInviteRedeemedEvent {
|
||||
invitee_user_id:string;
|
||||
}
|
||||
|
||||
table LobbyRaceNameRegistrationEligibleEvent {
|
||||
game_id:string;
|
||||
race_name:string;
|
||||
eligible_until_ms:int64;
|
||||
}
|
||||
|
||||
table LobbyRaceNameRegisteredEvent {
|
||||
race_name:string;
|
||||
}
|
||||
|
||||
root_type GameTurnReadyEvent;
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
|
||||
|
||||
package notification
|
||||
|
||||
import (
|
||||
flatbuffers "github.com/google/flatbuffers/go"
|
||||
)
|
||||
|
||||
type LobbyMembershipBlockedEvent struct {
|
||||
_tab flatbuffers.Table
|
||||
}
|
||||
|
||||
func GetRootAsLobbyMembershipBlockedEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyMembershipBlockedEvent {
|
||||
n := flatbuffers.GetUOffsetT(buf[offset:])
|
||||
x := &LobbyMembershipBlockedEvent{}
|
||||
x.Init(buf, n+offset)
|
||||
return x
|
||||
}
|
||||
|
||||
func FinishLobbyMembershipBlockedEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||
builder.Finish(offset)
|
||||
}
|
||||
|
||||
func GetSizePrefixedRootAsLobbyMembershipBlockedEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyMembershipBlockedEvent {
|
||||
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
|
||||
x := &LobbyMembershipBlockedEvent{}
|
||||
x.Init(buf, n+offset+flatbuffers.SizeUint32)
|
||||
return x
|
||||
}
|
||||
|
||||
func FinishSizePrefixedLobbyMembershipBlockedEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||
builder.FinishSizePrefixed(offset)
|
||||
}
|
||||
|
||||
func (rcv *LobbyMembershipBlockedEvent) Init(buf []byte, i flatbuffers.UOffsetT) {
|
||||
rcv._tab.Bytes = buf
|
||||
rcv._tab.Pos = i
|
||||
}
|
||||
|
||||
func (rcv *LobbyMembershipBlockedEvent) Table() flatbuffers.Table {
|
||||
return rcv._tab
|
||||
}
|
||||
|
||||
func (rcv *LobbyMembershipBlockedEvent) GameId() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *LobbyMembershipBlockedEvent) MembershipUserId() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *LobbyMembershipBlockedEvent) Reason() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func LobbyMembershipBlockedEventStart(builder *flatbuffers.Builder) {
|
||||
builder.StartObject(3)
|
||||
}
|
||||
func LobbyMembershipBlockedEventAddGameId(builder *flatbuffers.Builder, gameId flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(gameId), 0)
|
||||
}
|
||||
func LobbyMembershipBlockedEventAddMembershipUserId(builder *flatbuffers.Builder, membershipUserId flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(membershipUserId), 0)
|
||||
}
|
||||
func LobbyMembershipBlockedEventAddReason(builder *flatbuffers.Builder, reason flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(reason), 0)
|
||||
}
|
||||
func LobbyMembershipBlockedEventEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||
return builder.EndObject()
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
|
||||
|
||||
package notification
|
||||
|
||||
import (
|
||||
flatbuffers "github.com/google/flatbuffers/go"
|
||||
)
|
||||
|
||||
type LobbyRaceNameRegisteredEvent struct {
|
||||
_tab flatbuffers.Table
|
||||
}
|
||||
|
||||
func GetRootAsLobbyRaceNameRegisteredEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegisteredEvent {
|
||||
n := flatbuffers.GetUOffsetT(buf[offset:])
|
||||
x := &LobbyRaceNameRegisteredEvent{}
|
||||
x.Init(buf, n+offset)
|
||||
return x
|
||||
}
|
||||
|
||||
func FinishLobbyRaceNameRegisteredEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||
builder.Finish(offset)
|
||||
}
|
||||
|
||||
func GetSizePrefixedRootAsLobbyRaceNameRegisteredEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegisteredEvent {
|
||||
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
|
||||
x := &LobbyRaceNameRegisteredEvent{}
|
||||
x.Init(buf, n+offset+flatbuffers.SizeUint32)
|
||||
return x
|
||||
}
|
||||
|
||||
func FinishSizePrefixedLobbyRaceNameRegisteredEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||
builder.FinishSizePrefixed(offset)
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegisteredEvent) Init(buf []byte, i flatbuffers.UOffsetT) {
|
||||
rcv._tab.Bytes = buf
|
||||
rcv._tab.Pos = i
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegisteredEvent) Table() flatbuffers.Table {
|
||||
return rcv._tab
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegisteredEvent) RaceName() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func LobbyRaceNameRegisteredEventStart(builder *flatbuffers.Builder) {
|
||||
builder.StartObject(1)
|
||||
}
|
||||
func LobbyRaceNameRegisteredEventAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(raceName), 0)
|
||||
}
|
||||
func LobbyRaceNameRegisteredEventEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||
return builder.EndObject()
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
|
||||
|
||||
package notification
|
||||
|
||||
import (
|
||||
flatbuffers "github.com/google/flatbuffers/go"
|
||||
)
|
||||
|
||||
type LobbyRaceNameRegistrationEligibleEvent struct {
|
||||
_tab flatbuffers.Table
|
||||
}
|
||||
|
||||
func GetRootAsLobbyRaceNameRegistrationEligibleEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegistrationEligibleEvent {
|
||||
n := flatbuffers.GetUOffsetT(buf[offset:])
|
||||
x := &LobbyRaceNameRegistrationEligibleEvent{}
|
||||
x.Init(buf, n+offset)
|
||||
return x
|
||||
}
|
||||
|
||||
func FinishLobbyRaceNameRegistrationEligibleEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||
builder.Finish(offset)
|
||||
}
|
||||
|
||||
func GetSizePrefixedRootAsLobbyRaceNameRegistrationEligibleEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegistrationEligibleEvent {
|
||||
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
|
||||
x := &LobbyRaceNameRegistrationEligibleEvent{}
|
||||
x.Init(buf, n+offset+flatbuffers.SizeUint32)
|
||||
return x
|
||||
}
|
||||
|
||||
func FinishSizePrefixedLobbyRaceNameRegistrationEligibleEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||
builder.FinishSizePrefixed(offset)
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegistrationEligibleEvent) Init(buf []byte, i flatbuffers.UOffsetT) {
|
||||
rcv._tab.Bytes = buf
|
||||
rcv._tab.Pos = i
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegistrationEligibleEvent) Table() flatbuffers.Table {
|
||||
return rcv._tab
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegistrationEligibleEvent) GameId() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegistrationEligibleEvent) RaceName() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegistrationEligibleEvent) EligibleUntilMs() int64 {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
|
||||
if o != 0 {
|
||||
return rcv._tab.GetInt64(o + rcv._tab.Pos)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (rcv *LobbyRaceNameRegistrationEligibleEvent) MutateEligibleUntilMs(n int64) bool {
|
||||
return rcv._tab.MutateInt64Slot(8, n)
|
||||
}
|
||||
|
||||
func LobbyRaceNameRegistrationEligibleEventStart(builder *flatbuffers.Builder) {
|
||||
builder.StartObject(3)
|
||||
}
|
||||
func LobbyRaceNameRegistrationEligibleEventAddGameId(builder *flatbuffers.Builder, gameId flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(gameId), 0)
|
||||
}
|
||||
func LobbyRaceNameRegistrationEligibleEventAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(raceName), 0)
|
||||
}
|
||||
func LobbyRaceNameRegistrationEligibleEventAddEligibleUntilMs(builder *flatbuffers.Builder, eligibleUntilMs int64) {
|
||||
builder.PrependInt64Slot(2, eligibleUntilMs, 0)
|
||||
}
|
||||
func LobbyRaceNameRegistrationEligibleEventEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||
return builder.EndObject()
|
||||
}
|
||||
@@ -6,7 +6,7 @@ table GetMyAccountRequest {
|
||||
}
|
||||
|
||||
table UpdateMyProfileRequest {
|
||||
race_name:string;
|
||||
display_name:string;
|
||||
}
|
||||
|
||||
table UpdateMySettingsRequest {
|
||||
@@ -51,7 +51,8 @@ table ActiveLimit {
|
||||
table AccountView {
|
||||
user_id:string;
|
||||
email:string;
|
||||
race_name:string;
|
||||
user_name:string;
|
||||
display_name:string;
|
||||
preferred_language:string;
|
||||
time_zone:string;
|
||||
declared_country:string;
|
||||
|
||||
@@ -57,7 +57,7 @@ func (rcv *AccountView) Email() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *AccountView) RaceName() []byte {
|
||||
func (rcv *AccountView) UserName() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
@@ -65,7 +65,7 @@ func (rcv *AccountView) RaceName() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *AccountView) PreferredLanguage() []byte {
|
||||
func (rcv *AccountView) DisplayName() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
@@ -73,7 +73,7 @@ func (rcv *AccountView) PreferredLanguage() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *AccountView) TimeZone() []byte {
|
||||
func (rcv *AccountView) PreferredLanguage() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
@@ -81,7 +81,7 @@ func (rcv *AccountView) TimeZone() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *AccountView) DeclaredCountry() []byte {
|
||||
func (rcv *AccountView) TimeZone() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(14))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
@@ -89,8 +89,16 @@ func (rcv *AccountView) DeclaredCountry() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *AccountView) Entitlement(obj *EntitlementSnapshot) *EntitlementSnapshot {
|
||||
func (rcv *AccountView) DeclaredCountry() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(16))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rcv *AccountView) Entitlement(obj *EntitlementSnapshot) *EntitlementSnapshot {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(18))
|
||||
if o != 0 {
|
||||
x := rcv._tab.Indirect(o + rcv._tab.Pos)
|
||||
if obj == nil {
|
||||
@@ -103,7 +111,7 @@ func (rcv *AccountView) Entitlement(obj *EntitlementSnapshot) *EntitlementSnapsh
|
||||
}
|
||||
|
||||
func (rcv *AccountView) ActiveSanctions(obj *ActiveSanction, j int) bool {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(18))
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
|
||||
if o != 0 {
|
||||
x := rcv._tab.Vector(o)
|
||||
x += flatbuffers.UOffsetT(j) * 4
|
||||
@@ -115,7 +123,7 @@ func (rcv *AccountView) ActiveSanctions(obj *ActiveSanction, j int) bool {
|
||||
}
|
||||
|
||||
func (rcv *AccountView) ActiveSanctionsLength() int {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(18))
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
|
||||
if o != 0 {
|
||||
return rcv._tab.VectorLen(o)
|
||||
}
|
||||
@@ -123,7 +131,7 @@ func (rcv *AccountView) ActiveSanctionsLength() int {
|
||||
}
|
||||
|
||||
func (rcv *AccountView) ActiveLimits(obj *ActiveLimit, j int) bool {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(22))
|
||||
if o != 0 {
|
||||
x := rcv._tab.Vector(o)
|
||||
x += flatbuffers.UOffsetT(j) * 4
|
||||
@@ -135,7 +143,7 @@ func (rcv *AccountView) ActiveLimits(obj *ActiveLimit, j int) bool {
|
||||
}
|
||||
|
||||
func (rcv *AccountView) ActiveLimitsLength() int {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(22))
|
||||
if o != 0 {
|
||||
return rcv._tab.VectorLen(o)
|
||||
}
|
||||
@@ -143,18 +151,6 @@ func (rcv *AccountView) ActiveLimitsLength() int {
|
||||
}
|
||||
|
||||
func (rcv *AccountView) CreatedAtMs() int64 {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(22))
|
||||
if o != 0 {
|
||||
return rcv._tab.GetInt64(o + rcv._tab.Pos)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (rcv *AccountView) MutateCreatedAtMs(n int64) bool {
|
||||
return rcv._tab.MutateInt64Slot(22, n)
|
||||
}
|
||||
|
||||
func (rcv *AccountView) UpdatedAtMs() int64 {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(24))
|
||||
if o != 0 {
|
||||
return rcv._tab.GetInt64(o + rcv._tab.Pos)
|
||||
@@ -162,12 +158,24 @@ func (rcv *AccountView) UpdatedAtMs() int64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (rcv *AccountView) MutateUpdatedAtMs(n int64) bool {
|
||||
func (rcv *AccountView) MutateCreatedAtMs(n int64) bool {
|
||||
return rcv._tab.MutateInt64Slot(24, n)
|
||||
}
|
||||
|
||||
func (rcv *AccountView) UpdatedAtMs() int64 {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(26))
|
||||
if o != 0 {
|
||||
return rcv._tab.GetInt64(o + rcv._tab.Pos)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (rcv *AccountView) MutateUpdatedAtMs(n int64) bool {
|
||||
return rcv._tab.MutateInt64Slot(26, n)
|
||||
}
|
||||
|
||||
func AccountViewStart(builder *flatbuffers.Builder) {
|
||||
builder.StartObject(11)
|
||||
builder.StartObject(12)
|
||||
}
|
||||
func AccountViewAddUserId(builder *flatbuffers.Builder, userId flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(userId), 0)
|
||||
@@ -175,38 +183,41 @@ func AccountViewAddUserId(builder *flatbuffers.Builder, userId flatbuffers.UOffs
|
||||
func AccountViewAddEmail(builder *flatbuffers.Builder, email flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(email), 0)
|
||||
}
|
||||
func AccountViewAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(raceName), 0)
|
||||
func AccountViewAddUserName(builder *flatbuffers.Builder, userName flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(userName), 0)
|
||||
}
|
||||
func AccountViewAddDisplayName(builder *flatbuffers.Builder, displayName flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(displayName), 0)
|
||||
}
|
||||
func AccountViewAddPreferredLanguage(builder *flatbuffers.Builder, preferredLanguage flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(preferredLanguage), 0)
|
||||
builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(preferredLanguage), 0)
|
||||
}
|
||||
func AccountViewAddTimeZone(builder *flatbuffers.Builder, timeZone flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(timeZone), 0)
|
||||
builder.PrependUOffsetTSlot(5, flatbuffers.UOffsetT(timeZone), 0)
|
||||
}
|
||||
func AccountViewAddDeclaredCountry(builder *flatbuffers.Builder, declaredCountry flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(5, flatbuffers.UOffsetT(declaredCountry), 0)
|
||||
builder.PrependUOffsetTSlot(6, flatbuffers.UOffsetT(declaredCountry), 0)
|
||||
}
|
||||
func AccountViewAddEntitlement(builder *flatbuffers.Builder, entitlement flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(6, flatbuffers.UOffsetT(entitlement), 0)
|
||||
builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(entitlement), 0)
|
||||
}
|
||||
func AccountViewAddActiveSanctions(builder *flatbuffers.Builder, activeSanctions flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(activeSanctions), 0)
|
||||
builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(activeSanctions), 0)
|
||||
}
|
||||
func AccountViewStartActiveSanctionsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
|
||||
return builder.StartVector(4, numElems, 4)
|
||||
}
|
||||
func AccountViewAddActiveLimits(builder *flatbuffers.Builder, activeLimits flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(activeLimits), 0)
|
||||
builder.PrependUOffsetTSlot(9, flatbuffers.UOffsetT(activeLimits), 0)
|
||||
}
|
||||
func AccountViewStartActiveLimitsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
|
||||
return builder.StartVector(4, numElems, 4)
|
||||
}
|
||||
func AccountViewAddCreatedAtMs(builder *flatbuffers.Builder, createdAtMs int64) {
|
||||
builder.PrependInt64Slot(9, createdAtMs, 0)
|
||||
builder.PrependInt64Slot(10, createdAtMs, 0)
|
||||
}
|
||||
func AccountViewAddUpdatedAtMs(builder *flatbuffers.Builder, updatedAtMs int64) {
|
||||
builder.PrependInt64Slot(10, updatedAtMs, 0)
|
||||
builder.PrependInt64Slot(11, updatedAtMs, 0)
|
||||
}
|
||||
func AccountViewEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||
return builder.EndObject()
|
||||
|
||||
@@ -41,7 +41,7 @@ func (rcv *UpdateMyProfileRequest) Table() flatbuffers.Table {
|
||||
return rcv._tab
|
||||
}
|
||||
|
||||
func (rcv *UpdateMyProfileRequest) RaceName() []byte {
|
||||
func (rcv *UpdateMyProfileRequest) DisplayName() []byte {
|
||||
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
|
||||
if o != 0 {
|
||||
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||
@@ -52,8 +52,8 @@ func (rcv *UpdateMyProfileRequest) RaceName() []byte {
|
||||
func UpdateMyProfileRequestStart(builder *flatbuffers.Builder) {
|
||||
builder.StartObject(1)
|
||||
}
|
||||
func UpdateMyProfileRequestAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(raceName), 0)
|
||||
func UpdateMyProfileRequestAddDisplayName(builder *flatbuffers.Builder, displayName flatbuffers.UOffsetT) {
|
||||
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(displayName), 0)
|
||||
}
|
||||
func UpdateMyProfileRequestEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||
return builder.EndObject()
|
||||
|
||||
@@ -42,6 +42,16 @@ type LobbyMembershipRejectedEvent struct {
|
||||
GameID string
|
||||
}
|
||||
|
||||
// LobbyMembershipBlockedEvent is the independent Go representation of
|
||||
// `notification.LobbyMembershipBlockedEvent`. Reason carries the upstream
|
||||
// lifecycle event that triggered the cascade
|
||||
// (`permanent_blocked`, `deleted`).
|
||||
type LobbyMembershipBlockedEvent struct {
|
||||
GameID string
|
||||
MembershipUserID string
|
||||
Reason string
|
||||
}
|
||||
|
||||
// LobbyInviteCreatedEvent is the independent Go representation of
|
||||
// `notification.LobbyInviteCreatedEvent`.
|
||||
type LobbyInviteCreatedEvent struct {
|
||||
@@ -56,6 +66,20 @@ type LobbyInviteRedeemedEvent struct {
|
||||
InviteeUserID string
|
||||
}
|
||||
|
||||
// LobbyRaceNameRegistrationEligibleEvent is the independent Go
|
||||
// representation of `notification.LobbyRaceNameRegistrationEligibleEvent`.
|
||||
type LobbyRaceNameRegistrationEligibleEvent struct {
|
||||
GameID string
|
||||
RaceName string
|
||||
EligibleUntilMs int64
|
||||
}
|
||||
|
||||
// LobbyRaceNameRegisteredEvent is the independent Go representation of
|
||||
// `notification.LobbyRaceNameRegisteredEvent`.
|
||||
type LobbyRaceNameRegisteredEvent struct {
|
||||
RaceName string
|
||||
}
|
||||
|
||||
// GameTurnReadyEventToPayload converts GameTurnReadyEvent to FlatBuffers bytes
|
||||
// suitable for the authenticated gateway push transport.
|
||||
func GameTurnReadyEventToPayload(event *GameTurnReadyEvent) ([]byte, error) {
|
||||
@@ -272,6 +296,68 @@ func PayloadToLobbyMembershipRejectedEvent(data []byte) (result *LobbyMembership
|
||||
return &LobbyMembershipRejectedEvent{GameID: gameID}, nil
|
||||
}
|
||||
|
||||
// LobbyMembershipBlockedEventToPayload converts LobbyMembershipBlockedEvent
|
||||
// to FlatBuffers bytes suitable for the authenticated gateway push
|
||||
// transport.
|
||||
func LobbyMembershipBlockedEventToPayload(event *LobbyMembershipBlockedEvent) ([]byte, error) {
|
||||
if event == nil {
|
||||
return nil, errors.New("encode lobby membership blocked payload: event is nil")
|
||||
}
|
||||
if event.GameID == "" {
|
||||
return nil, errors.New("encode lobby membership blocked payload: game_id is empty")
|
||||
}
|
||||
if event.MembershipUserID == "" {
|
||||
return nil, errors.New("encode lobby membership blocked payload: membership_user_id is empty")
|
||||
}
|
||||
if event.Reason == "" {
|
||||
return nil, errors.New("encode lobby membership blocked payload: reason is empty")
|
||||
}
|
||||
|
||||
builder := flatbuffers.NewBuilder(96)
|
||||
gameID := builder.CreateString(event.GameID)
|
||||
membershipUserID := builder.CreateString(event.MembershipUserID)
|
||||
reason := builder.CreateString(event.Reason)
|
||||
|
||||
notificationfbs.LobbyMembershipBlockedEventStart(builder)
|
||||
notificationfbs.LobbyMembershipBlockedEventAddGameId(builder, gameID)
|
||||
notificationfbs.LobbyMembershipBlockedEventAddMembershipUserId(builder, membershipUserID)
|
||||
notificationfbs.LobbyMembershipBlockedEventAddReason(builder, reason)
|
||||
offset := notificationfbs.LobbyMembershipBlockedEventEnd(builder)
|
||||
notificationfbs.FinishLobbyMembershipBlockedEventBuffer(builder, offset)
|
||||
|
||||
return builder.FinishedBytes(), nil
|
||||
}
|
||||
|
||||
// PayloadToLobbyMembershipBlockedEvent converts FlatBuffers payload bytes
|
||||
// into LobbyMembershipBlockedEvent.
|
||||
func PayloadToLobbyMembershipBlockedEvent(data []byte) (result *LobbyMembershipBlockedEvent, err error) {
|
||||
if len(data) == 0 {
|
||||
return nil, errors.New("decode lobby membership blocked payload: data is empty")
|
||||
}
|
||||
|
||||
defer recoverNotificationDecodePanic("decode lobby membership blocked payload", &result, &err)
|
||||
|
||||
event := notificationfbs.GetRootAsLobbyMembershipBlockedEvent(data, 0)
|
||||
gameID, err := requiredNotificationString(event.GameId(), "game_id")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("decode lobby membership blocked payload: %w", err)
|
||||
}
|
||||
membershipUserID, err := requiredNotificationString(event.MembershipUserId(), "membership_user_id")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("decode lobby membership blocked payload: %w", err)
|
||||
}
|
||||
reason, err := requiredNotificationString(event.Reason(), "reason")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("decode lobby membership blocked payload: %w", err)
|
||||
}
|
||||
|
||||
return &LobbyMembershipBlockedEvent{
|
||||
GameID: gameID,
|
||||
MembershipUserID: membershipUserID,
|
||||
Reason: reason,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// LobbyInviteCreatedEventToPayload converts LobbyInviteCreatedEvent to
|
||||
// FlatBuffers bytes suitable for the authenticated gateway push transport.
|
||||
func LobbyInviteCreatedEventToPayload(event *LobbyInviteCreatedEvent) ([]byte, error) {
|
||||
@@ -374,6 +460,99 @@ func PayloadToLobbyInviteRedeemedEvent(data []byte) (result *LobbyInviteRedeemed
|
||||
}, nil
|
||||
}
|
||||
|
||||
// LobbyRaceNameRegistrationEligibleEventToPayload converts
|
||||
// LobbyRaceNameRegistrationEligibleEvent to FlatBuffers bytes suitable for
|
||||
// the authenticated gateway push transport.
|
||||
func LobbyRaceNameRegistrationEligibleEventToPayload(event *LobbyRaceNameRegistrationEligibleEvent) ([]byte, error) {
|
||||
if event == nil {
|
||||
return nil, errors.New("encode lobby race name registration eligible payload: event is nil")
|
||||
}
|
||||
if event.GameID == "" {
|
||||
return nil, errors.New("encode lobby race name registration eligible payload: game_id is empty")
|
||||
}
|
||||
if event.RaceName == "" {
|
||||
return nil, errors.New("encode lobby race name registration eligible payload: race_name is empty")
|
||||
}
|
||||
|
||||
builder := flatbuffers.NewBuilder(96)
|
||||
gameID := builder.CreateString(event.GameID)
|
||||
raceName := builder.CreateString(event.RaceName)
|
||||
|
||||
notificationfbs.LobbyRaceNameRegistrationEligibleEventStart(builder)
|
||||
notificationfbs.LobbyRaceNameRegistrationEligibleEventAddGameId(builder, gameID)
|
||||
notificationfbs.LobbyRaceNameRegistrationEligibleEventAddRaceName(builder, raceName)
|
||||
notificationfbs.LobbyRaceNameRegistrationEligibleEventAddEligibleUntilMs(builder, event.EligibleUntilMs)
|
||||
offset := notificationfbs.LobbyRaceNameRegistrationEligibleEventEnd(builder)
|
||||
notificationfbs.FinishLobbyRaceNameRegistrationEligibleEventBuffer(builder, offset)
|
||||
|
||||
return builder.FinishedBytes(), nil
|
||||
}
|
||||
|
||||
// PayloadToLobbyRaceNameRegistrationEligibleEvent converts FlatBuffers
|
||||
// payload bytes into LobbyRaceNameRegistrationEligibleEvent.
|
||||
func PayloadToLobbyRaceNameRegistrationEligibleEvent(data []byte) (result *LobbyRaceNameRegistrationEligibleEvent, err error) {
|
||||
if len(data) == 0 {
|
||||
return nil, errors.New("decode lobby race name registration eligible payload: data is empty")
|
||||
}
|
||||
|
||||
defer recoverNotificationDecodePanic("decode lobby race name registration eligible payload", &result, &err)
|
||||
|
||||
event := notificationfbs.GetRootAsLobbyRaceNameRegistrationEligibleEvent(data, 0)
|
||||
gameID, err := requiredNotificationString(event.GameId(), "game_id")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("decode lobby race name registration eligible payload: %w", err)
|
||||
}
|
||||
raceName, err := requiredNotificationString(event.RaceName(), "race_name")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("decode lobby race name registration eligible payload: %w", err)
|
||||
}
|
||||
|
||||
return &LobbyRaceNameRegistrationEligibleEvent{
|
||||
GameID: gameID,
|
||||
RaceName: raceName,
|
||||
EligibleUntilMs: event.EligibleUntilMs(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// LobbyRaceNameRegisteredEventToPayload converts LobbyRaceNameRegisteredEvent
|
||||
// to FlatBuffers bytes suitable for the authenticated gateway push transport.
|
||||
func LobbyRaceNameRegisteredEventToPayload(event *LobbyRaceNameRegisteredEvent) ([]byte, error) {
|
||||
if event == nil {
|
||||
return nil, errors.New("encode lobby race name registered payload: event is nil")
|
||||
}
|
||||
if event.RaceName == "" {
|
||||
return nil, errors.New("encode lobby race name registered payload: race_name is empty")
|
||||
}
|
||||
|
||||
builder := flatbuffers.NewBuilder(48)
|
||||
raceName := builder.CreateString(event.RaceName)
|
||||
|
||||
notificationfbs.LobbyRaceNameRegisteredEventStart(builder)
|
||||
notificationfbs.LobbyRaceNameRegisteredEventAddRaceName(builder, raceName)
|
||||
offset := notificationfbs.LobbyRaceNameRegisteredEventEnd(builder)
|
||||
notificationfbs.FinishLobbyRaceNameRegisteredEventBuffer(builder, offset)
|
||||
|
||||
return builder.FinishedBytes(), nil
|
||||
}
|
||||
|
||||
// PayloadToLobbyRaceNameRegisteredEvent converts FlatBuffers payload bytes
|
||||
// into LobbyRaceNameRegisteredEvent.
|
||||
func PayloadToLobbyRaceNameRegisteredEvent(data []byte) (result *LobbyRaceNameRegisteredEvent, err error) {
|
||||
if len(data) == 0 {
|
||||
return nil, errors.New("decode lobby race name registered payload: data is empty")
|
||||
}
|
||||
|
||||
defer recoverNotificationDecodePanic("decode lobby race name registered payload", &result, &err)
|
||||
|
||||
event := notificationfbs.GetRootAsLobbyRaceNameRegisteredEvent(data, 0)
|
||||
raceName, err := requiredNotificationString(event.RaceName(), "race_name")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("decode lobby race name registered payload: %w", err)
|
||||
}
|
||||
|
||||
return &LobbyRaceNameRegisteredEvent{RaceName: raceName}, nil
|
||||
}
|
||||
|
||||
func requiredNotificationString(value []byte, field string) (string, error) {
|
||||
if len(value) == 0 {
|
||||
return "", fmt.Errorf("%s is missing", field)
|
||||
|
||||
@@ -71,6 +71,26 @@ func TestNotificationPayloadRoundTrips(t *testing.T) {
|
||||
},
|
||||
decode: func(data []byte) (any, error) { return PayloadToLobbyInviteRedeemedEvent(data) },
|
||||
},
|
||||
{
|
||||
name: "lobby race name registration eligible",
|
||||
source: &LobbyRaceNameRegistrationEligibleEvent{
|
||||
GameID: "game-8",
|
||||
RaceName: "Skylancer",
|
||||
EligibleUntilMs: 1775208100000,
|
||||
},
|
||||
encode: func(value any) ([]byte, error) {
|
||||
return LobbyRaceNameRegistrationEligibleEventToPayload(value.(*LobbyRaceNameRegistrationEligibleEvent))
|
||||
},
|
||||
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNameRegistrationEligibleEvent(data) },
|
||||
},
|
||||
{
|
||||
name: "lobby race name registered",
|
||||
source: &LobbyRaceNameRegisteredEvent{RaceName: "Skylancer"},
|
||||
encode: func(value any) ([]byte, error) {
|
||||
return LobbyRaceNameRegisteredEventToPayload(value.(*LobbyRaceNameRegisteredEvent))
|
||||
},
|
||||
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNameRegisteredEvent(data) },
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
@@ -151,6 +171,20 @@ func TestNotificationPayloadEncodersRejectNilInputs(t *testing.T) {
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "lobby race name registration eligible",
|
||||
call: func() error {
|
||||
_, err := LobbyRaceNameRegistrationEligibleEventToPayload(nil)
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "lobby race name registered",
|
||||
call: func() error {
|
||||
_, err := LobbyRaceNameRegisteredEventToPayload(nil)
|
||||
return err
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
+14
-6
@@ -47,10 +47,10 @@ func UpdateMyProfileRequestToPayload(request *usermodel.UpdateMyProfileRequest)
|
||||
}
|
||||
|
||||
builder := flatbuffers.NewBuilder(128)
|
||||
raceName := builder.CreateString(request.RaceName)
|
||||
displayName := builder.CreateString(request.DisplayName)
|
||||
|
||||
userfbs.UpdateMyProfileRequestStart(builder)
|
||||
userfbs.UpdateMyProfileRequestAddRaceName(builder, raceName)
|
||||
userfbs.UpdateMyProfileRequestAddDisplayName(builder, displayName)
|
||||
offset := userfbs.UpdateMyProfileRequestEnd(builder)
|
||||
userfbs.FinishUpdateMyProfileRequestBuffer(builder, offset)
|
||||
|
||||
@@ -68,7 +68,7 @@ func PayloadToUpdateMyProfileRequest(data []byte) (result *usermodel.UpdateMyPro
|
||||
|
||||
request := userfbs.GetRootAsUpdateMyProfileRequest(data, 0)
|
||||
return &usermodel.UpdateMyProfileRequest{
|
||||
RaceName: string(request.RaceName()),
|
||||
DisplayName: string(request.DisplayName()),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -236,7 +236,11 @@ func encodeAccount(builder *flatbuffers.Builder, account usermodel.Account) (fla
|
||||
|
||||
userID := builder.CreateString(account.UserID)
|
||||
email := builder.CreateString(account.Email)
|
||||
raceName := builder.CreateString(account.RaceName)
|
||||
userName := builder.CreateString(account.UserName)
|
||||
var displayName flatbuffers.UOffsetT
|
||||
if account.DisplayName != "" {
|
||||
displayName = builder.CreateString(account.DisplayName)
|
||||
}
|
||||
preferredLanguage := builder.CreateString(account.PreferredLanguage)
|
||||
timeZone := builder.CreateString(account.TimeZone)
|
||||
|
||||
@@ -248,7 +252,10 @@ func encodeAccount(builder *flatbuffers.Builder, account usermodel.Account) (fla
|
||||
userfbs.AccountViewStart(builder)
|
||||
userfbs.AccountViewAddUserId(builder, userID)
|
||||
userfbs.AccountViewAddEmail(builder, email)
|
||||
userfbs.AccountViewAddRaceName(builder, raceName)
|
||||
userfbs.AccountViewAddUserName(builder, userName)
|
||||
if displayName != 0 {
|
||||
userfbs.AccountViewAddDisplayName(builder, displayName)
|
||||
}
|
||||
userfbs.AccountViewAddPreferredLanguage(builder, preferredLanguage)
|
||||
userfbs.AccountViewAddTimeZone(builder, timeZone)
|
||||
if declaredCountry != 0 {
|
||||
@@ -284,7 +291,8 @@ func decodeAccount(account *userfbs.AccountView) (usermodel.Account, error) {
|
||||
result := usermodel.Account{
|
||||
UserID: string(account.UserId()),
|
||||
Email: string(account.Email()),
|
||||
RaceName: string(account.RaceName()),
|
||||
UserName: string(account.UserName()),
|
||||
DisplayName: string(account.DisplayName()),
|
||||
PreferredLanguage: string(account.PreferredLanguage()),
|
||||
TimeZone: string(account.TimeZone()),
|
||||
DeclaredCountry: string(account.DeclaredCountry()),
|
||||
|
||||
@@ -29,7 +29,7 @@ func TestUserRequestPayloadRoundTrips(t *testing.T) {
|
||||
t.Fatalf("get my account request mismatch: %#v", getDecoded)
|
||||
}
|
||||
|
||||
profileSource := &usermodel.UpdateMyProfileRequest{RaceName: "Nova Prime"}
|
||||
profileSource := &usermodel.UpdateMyProfileRequest{DisplayName: "NovaPrime"}
|
||||
profilePayload, err := UpdateMyProfileRequestToPayload(profileSource)
|
||||
if err != nil {
|
||||
t.Fatalf("encode update my profile request: %v", err)
|
||||
@@ -72,7 +72,8 @@ func TestAccountResponsePayloadRoundTrip(t *testing.T) {
|
||||
Account: usermodel.Account{
|
||||
UserID: "user-123",
|
||||
Email: "pilot@example.com",
|
||||
RaceName: "Pilot Nova",
|
||||
UserName: "player-abcdefgh",
|
||||
DisplayName: "PilotNova",
|
||||
PreferredLanguage: "en",
|
||||
TimeZone: "Europe/Kaliningrad",
|
||||
DeclaredCountry: "DE",
|
||||
@@ -342,14 +343,14 @@ func TestPayloadToAccountResponseRejectsMissingEntitlement(t *testing.T) {
|
||||
payload := buildAccountResponsePayload(func(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||
userID := builder.CreateString("user-123")
|
||||
email := builder.CreateString("pilot@example.com")
|
||||
raceName := builder.CreateString("Pilot Nova")
|
||||
userName := builder.CreateString("player-abcdefgh")
|
||||
preferredLanguage := builder.CreateString("en")
|
||||
timeZone := builder.CreateString("Europe/Kaliningrad")
|
||||
|
||||
userfbs.AccountViewStart(builder)
|
||||
userfbs.AccountViewAddUserId(builder, userID)
|
||||
userfbs.AccountViewAddEmail(builder, email)
|
||||
userfbs.AccountViewAddRaceName(builder, raceName)
|
||||
userfbs.AccountViewAddUserName(builder, userName)
|
||||
userfbs.AccountViewAddPreferredLanguage(builder, preferredLanguage)
|
||||
userfbs.AccountViewAddTimeZone(builder, timeZone)
|
||||
userfbs.AccountViewAddCreatedAtMs(builder, 1)
|
||||
@@ -411,14 +412,14 @@ func TestPayloadToAccountResponseRejectsOverflowLimitValue(t *testing.T) {
|
||||
|
||||
userID := builder.CreateString("user-123")
|
||||
email := builder.CreateString("pilot@example.com")
|
||||
raceName := builder.CreateString("Pilot Nova")
|
||||
userName := builder.CreateString("player-abcdefgh")
|
||||
preferredLanguage := builder.CreateString("en")
|
||||
timeZone := builder.CreateString("Europe/Kaliningrad")
|
||||
|
||||
userfbs.AccountViewStart(builder)
|
||||
userfbs.AccountViewAddUserId(builder, userID)
|
||||
userfbs.AccountViewAddEmail(builder, email)
|
||||
userfbs.AccountViewAddRaceName(builder, raceName)
|
||||
userfbs.AccountViewAddUserName(builder, userName)
|
||||
userfbs.AccountViewAddPreferredLanguage(builder, preferredLanguage)
|
||||
userfbs.AccountViewAddTimeZone(builder, timeZone)
|
||||
userfbs.AccountViewAddEntitlement(builder, entitlementOffset)
|
||||
|
||||
Reference in New Issue
Block a user