From 32bc037d3bd86dd555cc53743d75bfb0d55e1aa5 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 24 Jun 2025 16:13:43 +0100 Subject: [PATCH 01/28] xbox adapter validate changes --- apigrpc/apigrpc.proto | 8 +++ apigrpc/apigrpc.swagger.json | 50 ++++++++++++- apigrpc/apigrpc_grpc.pb.go | 40 +++++++++++ build/Dockerfile | 42 +++-------- console/console.swagger.json | 5 +- iap/iap.go | 29 ++++++++ server/api_purchase.go | 62 +++++++++++++++- server/config.go | 9 +++ server/core_subscription.go | 4 +- server/runtime.go | 40 ++++++++++- server/runtime_go.go | 70 +++++++++++++++++-- server/runtime_go_nakama.go | 1 + .../blugelabs/bluge/search/search.go | 5 -- 13 files changed, 315 insertions(+), 50 deletions(-) diff --git a/apigrpc/apigrpc.proto b/apigrpc/apigrpc.proto index 8995384646..bb48ab3086 100644 --- a/apigrpc/apigrpc.proto +++ b/apigrpc/apigrpc.proto @@ -725,6 +725,14 @@ service Nakama { }; } + // Validate Xbox Receipt + rpc ValidatePurchaseXbox (api.ValidatePurchaseXboxRequest) returns (api.ValidatePurchaseResponse) { + option (google.api.http) = { + post: "/v2/iap/purchase/xbox", + body: "*" + }; + } + // Write a record to a leaderboard. rpc WriteLeaderboardRecord (api.WriteLeaderboardRecordRequest) returns (api.LeaderboardRecord) { option (google.api.http) = { diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index 3c5cbd959d..be35a98e67 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -2371,6 +2371,39 @@ ] } }, + "/v2/iap/purchase/xbox": { + "post": { + "summary": "Validate Xbox Receipt", + "operationId": "Nakama_ValidatePurchaseXbox", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/apiValidatePurchaseResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/apiValidatePurchaseXboxRequest" + } + } + ], + "tags": [ + "Nakama" + ] + } + }, "/v2/iap/subscription": { "post": { "summary": "List user's subscriptions.", @@ -4827,10 +4860,11 @@ "APPLE_APP_STORE", "GOOGLE_PLAY_STORE", "HUAWEI_APP_GALLERY", - "FACEBOOK_INSTANT_STORE" + "FACEBOOK_INSTANT_STORE", + "XBOX_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store", "title": "Validation Provider," }, "apiSubscriptionList": { @@ -5224,6 +5258,18 @@ }, "description": "Validate IAP response." }, + "apiValidatePurchaseXboxRequest": { + "type": "object", + "properties": { + "productId": { + "type": "string" + }, + "persist": { + "type": "boolean" + } + }, + "title": "Xbox Purchase validation request" + }, "apiValidateSubscriptionAppleRequest": { "type": "object", "properties": { diff --git a/apigrpc/apigrpc_grpc.pb.go b/apigrpc/apigrpc_grpc.pb.go index 3781b3fa1a..147a78635a 100644 --- a/apigrpc/apigrpc_grpc.pb.go +++ b/apigrpc/apigrpc_grpc.pb.go @@ -118,6 +118,7 @@ const ( Nakama_ValidateSubscriptionGoogle_FullMethodName = "/nakama.api.Nakama/ValidateSubscriptionGoogle" Nakama_ValidatePurchaseHuawei_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseHuawei" Nakama_ValidatePurchaseFacebookInstant_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseFacebookInstant" + Nakama_ValidatePurchaseXbox_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseXbox" Nakama_WriteLeaderboardRecord_FullMethodName = "/nakama.api.Nakama/WriteLeaderboardRecord" Nakama_WriteStorageObjects_FullMethodName = "/nakama.api.Nakama/WriteStorageObjects" Nakama_WriteTournamentRecord_FullMethodName = "/nakama.api.Nakama/WriteTournamentRecord" @@ -287,6 +288,8 @@ type NakamaClient interface { ValidatePurchaseHuawei(ctx context.Context, in *api.ValidatePurchaseHuaweiRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Validate FB Instant IAP Receipt ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) + // Validate Xbox Receipt + ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePurchaseXboxRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Write a record to a leaderboard. WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) // Write objects into the storage engine. @@ -1023,6 +1026,16 @@ func (c *nakamaClient) ValidatePurchaseFacebookInstant(ctx context.Context, in * return out, nil } +func (c *nakamaClient) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePurchaseXboxRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(api.ValidatePurchaseResponse) + err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseXbox_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *nakamaClient) WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) { out := new(api.LeaderboardRecord) err := c.cc.Invoke(ctx, Nakama_WriteLeaderboardRecord_FullMethodName, in, out, opts...) @@ -1214,6 +1227,8 @@ type NakamaServer interface { ValidatePurchaseHuawei(context.Context, *api.ValidatePurchaseHuaweiRequest) (*api.ValidatePurchaseResponse, error) // Validate FB Instant IAP Receipt ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) + // Validate Xbox Receipt + ValidatePurchaseXbox(context.Context, *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseResponse, error) // Write a record to a leaderboard. WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error) // Write objects into the storage engine. @@ -1467,6 +1482,9 @@ func (UnimplementedNakamaServer) ValidatePurchaseHuawei(context.Context, *api.Va func (UnimplementedNakamaServer) ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseFacebookInstant not implemented") } +func (UnimplementedNakamaServer) ValidatePurchaseXbox(context.Context, *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseXbox not implemented") +} func (UnimplementedNakamaServer) WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error) { return nil, status.Errorf(codes.Unimplemented, "method WriteLeaderboardRecord not implemented") } @@ -2929,6 +2947,24 @@ func _Nakama_ValidatePurchaseFacebookInstant_Handler(srv interface{}, ctx contex return interceptor(ctx, in, info, handler) } +func _Nakama_ValidatePurchaseXbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(api.ValidatePurchaseXboxRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NakamaServer).ValidatePurchaseXbox(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Nakama_ValidatePurchaseXbox_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NakamaServer).ValidatePurchaseXbox(ctx, req.(*api.ValidatePurchaseXboxRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Nakama_WriteLeaderboardRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(api.WriteLeaderboardRecordRequest) if err := dec(in); err != nil { @@ -3310,6 +3346,10 @@ var Nakama_ServiceDesc = grpc.ServiceDesc{ MethodName: "ValidatePurchaseFacebookInstant", Handler: _Nakama_ValidatePurchaseFacebookInstant_Handler, }, + { + MethodName: "ValidatePurchaseXbox", + Handler: _Nakama_ValidatePurchaseXbox_Handler, + }, { MethodName: "WriteLeaderboardRecord", Handler: _Nakama_WriteLeaderboardRecord_Handler, diff --git a/build/Dockerfile b/build/Dockerfile index 40b9690f1e..f702194881 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,52 +1,28 @@ -## Copyright 2018 The Nakama Authors -## -## Licensed under the Apache License, Version 2.0 (the "License"); -## you may not use this file except in compliance with the License. -## You may obtain a copy of the License at -## -## http://www.apache.org/licenses/LICENSE-2.0 -## -## Unless required by applicable law or agreed to in writing, software -## distributed under the License is distributed on an "AS IS" BASIS, -## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -## See the License for the specific language governing permissions and -## limitations under the License. - -# docker build . --build-arg commit="$(git rev-parse --short HEAD)" --build-arg version=v2.1.1 -t heroiclabs/nakama:2.1.1 -# docker build . --build-arg commit="$(git rev-parse --short HEAD)" --build-arg version="$(git rev-parse --short HEAD)" -t heroiclabs/nakama-prerelease:"$(git rev-parse --short HEAD)" - FROM golang:1.24.3-bookworm AS builder -ARG COMMIT -ARG VERSION -ARG TARGETOS -ARG TARGETARCH - -ENV GOOS=$TARGETOS -ENV GOARCH=$TARGETARCH -ENV CGO_ENABLED=1 -ENV DEBIAN_FRONTEND=noninteractive +ENV GOOS linux +ENV CGO_ENABLED 1 RUN apt-get update && \ apt-get -y upgrade && \ apt-get install -y --no-install-recommends ca-certificates gcc libc6-dev WORKDIR /go/build/nakama + COPY . . -RUN go build -o /go/build-out/nakama -trimpath -mod=vendor -gcflags "-trimpath $PWD" -asmflags "-trimpath $PWD" -ldflags "-s -w -X main.version=$VERSION -X main.commitID=$COMMIT" + +RUN go build -o /go/build-out/nakama -trimpath -mod=vendor -gcflags "-trimpath $PWD" -asmflags "-trimpath $PWD" -ldflags "-s -w -X main.version=local" FROM debian:bookworm-slim -ARG VERSION +MAINTAINER Heroic Labs + +ARG version -LABEL maintainer="Heroic Labs" -LABEL contact="support@heroiclabs.com" -LABEL version=$VERSION +LABEL version=$version LABEL variant=nakama LABEL description="Distributed server for social and realtime games and apps." -ENV DEBIAN_FRONTEND=noninteractive - RUN mkdir -p /nakama/data/modules && \ apt-get update && \ apt-get -y upgrade && \ diff --git a/console/console.swagger.json b/console/console.swagger.json index 780255bab1..aef388cd62 100644 --- a/console/console.swagger.json +++ b/console/console.swagger.json @@ -3287,10 +3287,11 @@ "APPLE_APP_STORE", "GOOGLE_PLAY_STORE", "HUAWEI_APP_GALLERY", - "FACEBOOK_INSTANT_STORE" + "FACEBOOK_INSTANT_STORE", + "XBOX_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store", "title": "Validation Provider," }, "apiSubscriptionList": { diff --git a/iap/iap.go b/iap/iap.go index 9d3b3df4cf..c84f344f5c 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -59,6 +59,35 @@ var cachedTokensGoogle = &googleTokenCache{ } var cachedTokenHuawei accessTokenHuawei +type Platform int + +const ( + Unknown Platform = iota + Apple + Google + Facebook + Huawei + Xbox + Playstation + Steam + Epic + Discord +) + +func (enum Platform) String() string { + return [...]string{"apple", "google", "facebook", "huawei"}[enum] +} + +func FromString(s string) Platform { + return map[string]Platform{ + "apple": Apple, + "google": Google, + "facebook": Facebook, + "huawei": Huawei, + "xbox": Xbox, + }[s] +} + type googleTokenCache struct { sync.RWMutex tokenMap map[string]*accessTokenGoogle diff --git a/server/api_purchase.go b/server/api_purchase.go index 25e5fa3090..40c499cddf 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -16,7 +16,6 @@ package server import ( "context" - "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" "go.uber.org/zap" @@ -257,3 +256,64 @@ func (s *ApiServer) ValidatePurchaseFacebookInstant(ctx context.Context, in *api return validation, err } + +func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseResponse, error) { + userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + + s.logger.Info("ValidatePurchaseXbox hit") + // Before hook. + if fn := s.runtime.BeforeValidatePurchaseXbox(); fn != nil { + s.logger.Info("ValidatePurchaseXbox before hook hit") + + beforeFn := func(clientIP, clientPort string) error { + result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + if err != nil { + return status.Error(code, err.Error()) + } + if result == nil { + // If result is nil, requested resource is disabled. + s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) + return status.Error(codes.NotFound, "Requested resource was not found.") + } + in = result + return nil + } + + // Execute the before function lambda wrapped in a trace for stats measurement. + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + if err != nil { + return nil, err + } + } + + if s.config.GetIAP().Xbox.Token == "" { + return nil, status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") + } + + if len(in.ProductId) < 1 { + return nil, status.Error(codes.InvalidArgument, "ProductId required.") + } + + persist := true + if in.Persist != nil { + persist = in.Persist.GetValue() + } + + //validation, err := ValidatePurchaseFacebookInstant(ctx, s.logger, s.db, userID, s.config.GetIAP().FacebookInstant, in.SignedRequest, persist) + validation, err := s.runtime.iapXboxManager.PurchaseValidateXbox(ctx, s.logger, s.db, s.config.GetIAP().Xbox.Token, in.ProductId, userID, persist) + if err != nil { + return nil, err + } + + // After hook. + if fn := s.runtime.AfterValidatePurchaseXbox(); fn != nil { + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) + } + + // Execute the after function lambda wrapped in a trace for stats measurement. + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + } + + return validation, err +} diff --git a/server/config.go b/server/config.go index b78b048bf4..a07bb33613 100644 --- a/server/config.go +++ b/server/config.go @@ -1338,6 +1338,7 @@ type IAPConfig struct { Google *IAPGoogleConfig `yaml:"google" json:"google" usage:"Google Play Store purchase validation configuration."` Huawei *IAPHuaweiConfig `yaml:"huawei" json:"huawei" usage:"Huawei purchase validation configuration."` FacebookInstant *IAPFacebookInstantConfig `yaml:"facebook_instant" json:"facebook_instant" usage:"Facebook Instant purchase validation configuration."` + Xbox *IAPXboxConfig `yaml:"xbox" json:"xbox" usage:"Xbox Configuration."` } func (cfg *IAPConfig) GetApple() runtime.IAPAppleConfig { @@ -1356,6 +1357,8 @@ func (cfg *IAPConfig) GetFacebookInstant() runtime.IAPFacebookInstantConfig { return cfg.FacebookInstant } +func (cfg *IAPConfig) GetXbox() runtime.IAPXboxConfig { return cfg.Xbox } + func (cfg *IAPConfig) Clone() *IAPConfig { if cfg == nil { return nil @@ -1534,6 +1537,12 @@ func (i IAPFacebookInstantConfig) GetAppSecret() string { return i.AppSecret } +type IAPXboxConfig struct { + Token string `yaml:"token" json:"token" usage:"Xbox credentials token"` +} + +func (i IAPXboxConfig) GetToken() string { return i.Token } + var _ runtime.GoogleAuthConfig = &GoogleAuthConfig{} type GoogleAuthConfig struct { diff --git a/server/core_subscription.go b/server/core_subscription.go index a4c45319ab..453e3088ab 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -24,6 +24,8 @@ import ( "encoding/json" "errors" "fmt" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "io" "net/http" "strconv" @@ -38,8 +40,6 @@ import ( "github.com/jackc/pgx/v5/pgconn" "github.com/jackc/pgx/v5/pgtype" "go.uber.org/zap" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" ) diff --git a/server/runtime.go b/server/runtime.go index 52ce4bdd30..829b635d36 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -209,6 +209,8 @@ type ( RuntimeAfterValidatePurchaseHuaweiFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseHuaweiRequest) error RuntimeBeforeValidatePurchaseFacebookInstantFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error, codes.Code) RuntimeAfterValidatePurchaseFacebookInstantFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error + RuntimeBeforeValidatePurchaseXboxFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error, codes.Code) + RuntimeAfterValidatePurchaseXboxFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error RuntimeBeforeListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListSubscriptionsRequest) (*api.ListSubscriptionsRequest, error, codes.Code) RuntimeAfterListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.SubscriptionList, in *api.ListSubscriptionsRequest) error RuntimeBeforeGetSubscriptionFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.GetSubscriptionRequest) (*api.GetSubscriptionRequest, error, codes.Code) @@ -430,6 +432,7 @@ type RuntimeBeforeReqFunctions struct { beforeValidateSubscriptionGoogleFunction RuntimeBeforeValidateSubscriptionGoogleFunction beforeValidatePurchaseHuaweiFunction RuntimeBeforeValidatePurchaseHuaweiFunction beforeValidatePurchaseFacebookInstantFunction RuntimeBeforeValidatePurchaseFacebookInstantFunction + beforeValidatePurchaseXboxFunction RuntimeBeforeValidatePurchaseXboxFunction beforeListSubscriptionsFunction RuntimeBeforeListSubscriptionsFunction beforeGetSubscriptionFunction RuntimeBeforeGetSubscriptionFunction beforeGetMatchmakerStatsFunction RuntimeBeforeGetMatchmakerStatsFunction @@ -514,6 +517,7 @@ type RuntimeAfterReqFunctions struct { afterValidateSubscriptionGoogleFunction RuntimeAfterValidateSubscriptionGoogleFunction afterValidatePurchaseHuaweiFunction RuntimeAfterValidatePurchaseHuaweiFunction afterValidatePurchaseFacebookInstantFunction RuntimeAfterValidatePurchaseFacebookInstantFunction + afterValidatePurchaseXboxFunction RuntimeAfterValidatePurchaseXboxFunction afterListSubscriptionsFunction RuntimeAfterListSubscriptionsFunction afterGetSubscriptionFunction RuntimeAfterGetSubscriptionFunction afterGetMatchmakerStatsFunction RuntimeAfterGetMatchmakerStatsFunction @@ -551,6 +555,8 @@ type Runtime struct { shutdownFunction RuntimeShutdownFunction fleetManager runtime.FleetManager + + iapXboxManager runtime.IAPXboxManager } type MatchNamesListFunction func() []string @@ -677,7 +683,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. config.GetSatori().CacheEnabled, ) - goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goIndexFilterFns, fleetManager, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) + goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goIndexFilterFns, fleetManager, iapXboxManager, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) if err != nil { startupLogger.Error("Error initialising Go runtime provider", zap.Error(err)) return nil, nil, err @@ -992,6 +998,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if allBeforeReqFunctions.beforeValidatePurchaseXboxFunction != nil { + startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasexbox")) + } if allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -1309,6 +1318,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = luaBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if luaBeforeReqFns.beforeValidatePurchaseXboxFunction != nil { + allBeforeReqFunctions.beforeValidatePurchaseXboxFunction = luaBeforeReqFns.beforeValidatePurchaseXboxFunction + startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasexbox")) + } if luaBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = luaBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1631,6 +1644,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = goBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if goBeforeReqFns.beforeValidatePurchaseXboxFunction != nil { + allBeforeReqFunctions.beforeValidatePurchaseXboxFunction = goBeforeReqFns.beforeValidatePurchaseXboxFunction + startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasexbox")) + } if goBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = goBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1879,6 +1896,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction != nil { startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if allAfterReqFunctions.afterValidatePurchaseXboxFunction != nil { + startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasexbox")) + } if allAfterReqFunctions.afterValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -2192,6 +2212,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = luaAfterReqFns.afterValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if luaAfterReqFns.afterValidatePurchaseXboxFunction != nil { + allAfterReqFunctions.afterValidatePurchaseXboxFunction = luaAfterReqFns.afterValidatePurchaseXboxFunction + startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasexbox")) + } if luaAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = luaAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2514,6 +2538,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = goAfterReqFns.afterValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if goAfterReqFns.afterValidatePurchaseXboxFunction != nil { + allAfterReqFunctions.afterValidatePurchaseXboxFunction = goAfterReqFns.afterValidatePurchaseXboxFunction + startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasexbox")) + } if goAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = goAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2717,6 +2745,8 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. fleetManager: fleetManager, + iapXboxManager: iapXboxManager, + eventFunctions: allEventFns, }, rInfo, nil } @@ -3443,6 +3473,14 @@ func (r *Runtime) AfterValidatePurchaseFacebookInstant() RuntimeAfterValidatePur return r.afterReqFunctions.afterValidatePurchaseFacebookInstantFunction } +func (r *Runtime) BeforeValidatePurchaseXbox() RuntimeBeforeValidatePurchaseXboxFunction { + return r.beforeReqFunctions.beforeValidatePurchaseXboxFunction +} + +func (r *Runtime) AfterValidatePurchaseXbox() RuntimeAfterValidatePurchaseXboxFunction { + return r.afterReqFunctions.afterValidatePurchaseXboxFunction +} + func (r *Runtime) BeforeEvent() RuntimeBeforeEventFunction { return r.beforeReqFunctions.beforeEventFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index 161e5d2a0f..960992d247 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -19,9 +19,11 @@ import ( "database/sql" "errors" "fmt" + "github.com/heroiclabs/nakama/v3/iap" "net/http" "path/filepath" "plugin" + "slices" "strings" "sync" @@ -78,6 +80,9 @@ type RuntimeGoInitializer struct { matchLock *sync.RWMutex fmCallbackHandler runtime.FmCallbackHandler + + iapXboxManager runtime.IAPXboxManager + registeredIAPs []string } func (ri *RuntimeGoInitializer) GetConfig() (runtime.Config, error) { @@ -2379,6 +2384,40 @@ func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseApple(fn func(ctx c return nil } +func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchaseXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error)) error { + ri.logger.Info("registerbeforevalidatepurchasexbox hit in the nakama core") + ri.beforeReq.beforeValidatePurchaseXboxFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error, codes.Code) { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchasexbox", "mode": RuntimeExecutionModeBefore.String()} + result, fnErr := fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, in) + if fnErr != nil { + var runtimeErr *runtime.Error + if errors.As(fnErr, &runtimeErr) { + if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { + // If error is present but code is invalid then default to 13 (Internal) as the error code. + return result, runtimeErr, codes.Internal + } + return result, runtimeErr, codes.Code(runtimeErr.Code) + } + // Not a runtime error that contains a code. + return result, fnErr, codes.Internal + } + return result, nil, codes.OK + } + ri.logger.Info("registerbeforevalidatepurchasexbox hit in the nakama core 2") + + return nil +} + +func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error) error { + ri.afterReq.afterValidatePurchaseXboxFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchasexbox", "mode": RuntimeExecutionModeAfter.String()} + return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) + } + return nil +} + func (ri *RuntimeGoInitializer) RegisterBeforeValidateSubscriptionApple(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error)) error { ri.beforeReq.beforeValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") @@ -2795,6 +2834,29 @@ func (ri *RuntimeGoInitializer) RegisterFleetManager(fleetManager runtime.FleetM return nil } +func (ri *RuntimeGoInitializer) RegisterIAPManager(platform string, iapManager interface{}) error { + if slices.Contains(ri.registeredIAPs, platform) { + return errors.New("platform already registered") + } + + p := iap.FromString(platform) + + switch p { + case iap.Xbox: + if iapMan, ok := iapManager.(runtime.IAPXboxManager); ok { + if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { + ri.iapXboxManager = iapMan + nk.IAPXboxManager = iapMan + ri.registeredIAPs = append(ri.registeredIAPs, platform) + } + } + default: + return errors.New("platform not valid") + } + + return nil +} + func (ri *RuntimeGoInitializer) RegisterShutdown(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule)) error { ri.shutdownFunction = func(ctx context.Context) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeShutdown, nil, nil, 0, "", "", nil, "", "", "", "") @@ -2821,7 +2883,7 @@ func (ri *RuntimeGoInitializer) RegisterMatch(name string, fn func(ctx context.C return nil } -func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { +func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, runtime.IAPXboxManager, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { runtimeLogger := NewRuntimeGoLogger(logger) node := config.GetName() env := config.GetRuntime().Environment @@ -2910,13 +2972,13 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger relPath, name, fn, err := openGoModule(startupLogger, rootPath, path) if err != nil { // Errors are already logged in the function above. - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err } // Run the initialisation. if err = fn(ctx, runtimeLogger, db, nk, initializer); err != nil { startupLogger.Fatal("Error returned by InitModule function in Go module", zap.String("name", name), zap.Error(err)) - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") } modulePaths = append(modulePaths, relPath) } @@ -2964,7 +3026,7 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger } } - return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.storageIndexFunctions, initializer.fleetManager, initializer.httpHandlers, events, matchNamesListFn, nil + return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.storageIndexFunctions, initializer.fleetManager, initializer.iapXboxManager, initializer.httpHandlers, events, matchNamesListFn, nil } func CheckRuntimeProviderGo(logger *zap.Logger, rootPath string, paths []string) error { diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index 13e65840f6..3f58821473 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -64,6 +64,7 @@ type RuntimeGoNakamaModule struct { satori runtime.Satori fleetManager runtime.FleetManager storageIndex StorageIndex + IAPXboxManager runtime.IAPXboxManager } func NewRuntimeGoNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori) *RuntimeGoNakamaModule { diff --git a/vendor/github.com/blugelabs/bluge/search/search.go b/vendor/github.com/blugelabs/bluge/search/search.go index 7a00305b1d..3e1de027c8 100644 --- a/vendor/github.com/blugelabs/bluge/search/search.go +++ b/vendor/github.com/blugelabs/bluge/search/search.go @@ -140,17 +140,12 @@ func (dm *DocumentMatch) Reset() *DocumentMatch { sortValue := dm.SortValue // remember the FieldTermLocations backing array ftls := dm.FieldTermLocations - docValues := dm.docValues // idiom to copy over from empty DocumentMatch (0 allocations) *dm = DocumentMatch{} // reuse the [][]byte already allocated (and reset len to 0) dm.SortValue = sortValue[:0] // reuse the FieldTermLocations already allocated (and reset len to 0) dm.FieldTermLocations = ftls[:0] - for key, slice := range docValues { - docValues[key] = slice[:0] - } - dm.docValues = docValues return dm } From a096c669b42582f47b31c163451540e8da1fd3f5 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 1 Jul 2025 17:56:55 +0100 Subject: [PATCH 02/28] xbox poller setup and now handling generic iap interface --- apigrpc/apigrpc.pb.go | 1055 +-- apigrpc/apigrpc.pb.gw.go | 4957 ++++--------- apigrpc/apigrpc.swagger.json | 105 +- apigrpc/apigrpc_grpc.pb.go | 282 +- console/console.pb.go | 3927 +++-------- console/console.pb.gw.go | 3999 +++-------- console/console.swagger.json | 364 +- console/console_grpc.pb.go | 240 +- console/ui/src/app/console.service.ts | 1 + go.mod | 2 +- go.sum | 6 +- main.go | 2 + server/api_purchase.go | 2 +- server/config.go | 3 +- server/console.go | 2 + server/runtime.go | 21 +- server/runtime_go.go | 21 +- server/runtime_go_nakama.go | 2 +- server/xbox_refund_poller.go | 75 + .../heroiclabs/nakama-common/api/api.pb.go | 6192 +++++------------ .../heroiclabs/nakama-common/api/api.proto | 8 + .../nakama-common/rtapi/realtime.pb.go | 2978 +++----- .../nakama-common/runtime/config.go | 5 + .../nakama-common/runtime/runtime.go | 22 + vendor/golang.org/x/net/http2/frame.go | 11 + vendor/golang.org/x/net/http2/server.go | 5 +- vendor/modules.txt | 5 +- 27 files changed, 7565 insertions(+), 16727 deletions(-) create mode 100644 server/xbox_refund_poller.go diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index 1d1cac930a..8e614ec816 100644 --- a/apigrpc/apigrpc.pb.go +++ b/apigrpc/apigrpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.29.3 +// protoc-gen-go v1.36.6 +// protoc v4.24.3 // source: apigrpc.proto package apigrpc @@ -31,6 +31,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" + unsafe "unsafe" ) const ( @@ -42,684 +43,144 @@ const ( var File_apigrpc_proto protoreflect.FileDescriptor -var file_apigrpc_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x61, 0x70, 0x69, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x0a, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, - 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x9f, 0x4f, 0x0a, 0x06, 0x4e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x12, 0x57, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x22, 0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x6b, 0x0a, - 0x0d, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x20, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x64, 0x64, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x22, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x0e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x21, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, - 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x12, 0x68, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x6f, - 0x75, 0x74, 0x12, 0x20, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x93, 0x01, 0x0a, 0x11, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, - 0x65, 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x92, 0x41, - 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, - 0x65, 0x12, 0x96, 0x01, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x44, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, - 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, - 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1f, 0x2f, 0x76, 0x32, 0x2f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x96, 0x01, 0x0a, 0x12, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x44, 0x92, - 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, - 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x1f, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, - 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, - 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, - 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x9c, 0x01, 0x0a, 0x14, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, - 0x6f, 0x6b, 0x12, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x46, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, - 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x21, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2f, - 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0xbd, 0x01, 0x0a, 0x1f, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, - 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x37, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2c, 0x2f, 0x76, 0x32, 0x2f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x74, 0x67, 0x61, 0x6d, 0x65, 0x12, 0xa2, 0x01, 0x0a, 0x16, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x47, 0x61, 0x6d, - 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x48, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x61, - 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x96, 0x01, - 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x44, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, - 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1f, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2f, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x24, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x92, 0x41, 0x11, 0x62, 0x0f, 0x0a, 0x0d, - 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x29, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x2f, 0x76, - 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2f, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x6b, 0x0a, 0x0d, - 0x42, 0x61, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x20, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x61, 0x6e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, - 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x61, 0x6e, 0x12, 0x61, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x1f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x10, 0x2f, 0x76, 0x32, 0x2f, - 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x56, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x76, 0x32, 0x2f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x12, 0x54, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x2a, 0x0b, 0x2f, - 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x2a, 0x0a, 0x2f, - 0x76, 0x32, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x63, 0x0a, 0x0b, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x2a, 0x14, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x87, - 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x2a, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x2a, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x6f, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x2a, 0x10, 0x2f, 0x76, 0x32, 0x2f, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x83, 0x01, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x2a, - 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, - 0x7b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0x76, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, - 0x3a, 0x01, 0x2a, 0x1a, 0x12, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x4e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x4c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x22, 0x10, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x76, 0x32, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, - 0x83, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x23, 0x12, 0x21, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x67, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x53, - 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x7f, 0x0a, 0x15, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x61, 0x63, - 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x28, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x2f, 0x66, 0x61, 0x63, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x76, 0x0a, 0x12, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, - 0x65, 0x61, 0x6d, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x25, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, - 0x65, 0x61, 0x6d, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1b, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x10, 0x2f, 0x76, 0x32, 0x2f, - 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x2f, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x64, 0x0a, 0x09, - 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6a, 0x6f, - 0x69, 0x6e, 0x12, 0x78, 0x0a, 0x0e, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x23, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x12, 0x6e, 0x0a, 0x0e, - 0x4b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x21, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x69, 0x63, 0x6b, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1b, 0x22, 0x19, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x69, 0x63, 0x6b, 0x12, 0x67, 0x0a, 0x0a, - 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x76, 0x32, 0x2f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x6c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x70, 0x70, - 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, - 0x16, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6c, 0x69, 0x6e, - 0x6b, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x63, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x6b, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, - 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x63, 0x0a, 0x0a, - 0x4c, 0x69, 0x6e, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x32, - 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x12, 0x73, 0x0a, 0x0c, 0x4c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x63, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x12, 0x1f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x19, 0x2f, - 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, - 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x8a, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x6e, - 0x6b, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, - 0x47, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, - 0x24, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6c, 0x69, 0x6e, - 0x6b, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x67, 0x61, 0x6d, 0x65, 0x12, 0x6f, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x6b, 0x47, 0x61, 0x6d, - 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, - 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x26, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x32, 0x2f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x67, 0x61, 0x6d, 0x65, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x63, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x6b, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, - 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, - 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x09, 0x4c, - 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x32, 0x2f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x73, 0x74, 0x65, 0x61, - 0x6d, 0x12, 0x7f, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, - 0x64, 0x7d, 0x12, 0x59, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x12, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x7d, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, - 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x32, 0x2f, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x55, 0x0a, 0x0a, - 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x32, - 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x90, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb7, 0x01, 0x0a, 0x21, 0x4c, 0x69, - 0x73, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x73, 0x41, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x34, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x73, 0x41, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, - 0x12, 0x31, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x2f, 0x7b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x7d, 0x12, 0x57, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x71, 0x0a, 0x11, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, - 0x76, 0x32, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0xa2, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x46, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x40, 0x5a, 0x24, 0x12, 0x22, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, - 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x18, 0x2f, 0x76, 0x32, 0x2f, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x78, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1f, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x61, - 0x70, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x69, - 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x76, 0x32, 0x2f, 0x74, - 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x8b, 0x01, 0x0a, 0x15, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x73, 0x12, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb2, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x41, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, - 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x41, - 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, - 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x76, 0x32, - 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x2f, 0x7b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x70, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x21, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x20, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x7b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x77, - 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x22, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x74, 0x0a, 0x10, 0x44, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x23, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, - 0x22, 0x1b, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x6f, 0x0a, - 0x12, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, - 0x2a, 0x22, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x7f, - 0x0a, 0x07, 0x52, 0x70, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x12, 0x0f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x70, 0x63, 0x1a, 0x0f, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x70, 0x63, 0x22, 0x52, 0x92, 0x41, 0x22, - 0x62, 0x20, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, 0x12, - 0x00, 0x0a, 0x0f, 0x0a, 0x0b, 0x48, 0x74, 0x74, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x5a, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x32, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x22, 0x0c, 0x2f, 0x76, 0x32, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0x64, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x32, - 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, - 0x61, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x67, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, - 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x67, - 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, - 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, - 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x69, 0x6e, - 0x6b, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, - 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x6d, 0x0a, - 0x0e, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, - 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, - 0x1b, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x75, 0x6e, 0x6c, - 0x69, 0x6e, 0x6b, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x8e, 0x01, 0x0a, - 0x19, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, - 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, - 0x6d, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, - 0x6f, 0x6b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x67, 0x61, 0x6d, 0x65, 0x12, 0x73, 0x0a, - 0x10, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x12, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, - 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x12, 0x67, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x47, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, - 0x22, 0x19, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x75, 0x6e, - 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x55, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x74, 0x65, 0x61, 0x6d, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x73, 0x74, 0x65, 0x61, - 0x6d, 0x12, 0x61, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x1a, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x66, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x1a, 0x14, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8a, 0x01, 0x0a, - 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, - 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, - 0x68, 0x61, 0x73, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, - 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x70, 0x75, 0x72, 0x63, 0x68, - 0x61, 0x73, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x19, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, 0x32, 0x2f, - 0x69, 0x61, 0x70, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x47, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, - 0x76, 0x32, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x2f, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x2d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x32, 0x2f, 0x69, - 0x61, 0x70, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x48, 0x75, 0x61, 0x77, 0x65, - 0x69, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x48, - 0x75, 0x61, 0x77, 0x65, 0x69, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, - 0x76, 0x32, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x2f, - 0x68, 0x75, 0x61, 0x77, 0x65, 0x69, 0x12, 0xa8, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x32, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, - 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, - 0x65, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x12, 0x94, 0x01, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x29, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x06, - 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x41, 0x63, 0x6b, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, - 0x2a, 0x1a, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0xba, - 0x01, 0x0a, 0x15, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x3a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x5a, 0x28, 0x3a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x1e, 0x2f, 0x76, 0x32, - 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x1a, 0x1e, 0x2f, 0x76, 0x32, - 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xba, 0x03, 0x92, 0x41, - 0xcf, 0x02, 0x12, 0x75, 0x0a, 0x0d, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x76, 0x32, 0x22, 0x5f, 0x0a, 0x21, 0x54, 0x68, 0x65, 0x20, 0x4e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x26, 0x20, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x24, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, - 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, - 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x1a, 0x14, - 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x40, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x32, 0x03, 0x32, 0x2e, 0x30, 0x1a, 0x0e, 0x31, 0x32, 0x37, 0x2e, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x37, 0x33, 0x35, 0x30, 0x2a, 0x01, 0x01, 0x32, 0x10, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, - 0x5a, 0x52, 0x0a, 0x0f, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x02, 0x08, 0x01, 0x0a, 0x20, 0x0a, 0x09, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, - 0x12, 0x13, 0x08, 0x02, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x0a, 0x1d, 0x0a, 0x0b, 0x48, 0x74, 0x74, 0x70, 0x4b, 0x65, 0x79, - 0x41, 0x75, 0x74, 0x68, 0x12, 0x0e, 0x08, 0x02, 0x1a, 0x08, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6b, - 0x65, 0x79, 0x20, 0x02, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x4a, 0x77, 0x74, 0x12, 0x00, 0x72, 0x3a, 0x0a, 0x1b, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x68, 0x65, - 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x6f, 0x63, - 0x73, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, - 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0d, 0x4e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x41, 0x70, 0x69, 0x47, 0x72, 0x70, 0x63, 0x50, 0x01, 0x5a, 0x27, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, - 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x61, - 0x70, 0x69, 0x67, 0x72, 0x70, 0x63, 0xaa, 0x02, 0x0f, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_apigrpc_proto_rawDesc = "" + + "\n" + + "\rapigrpc.proto\x12\n" + + "nakama.api\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\x1a1github.com/heroiclabs/nakama-common/api/api.proto2\xa9P\n" + + "\x06Nakama\x12W\n" + + "\n" + + "AddFriends\x12\x1d.nakama.api.AddFriendsRequest\x1a\x16.google.protobuf.Empty\"\x12\x82\xd3\xe4\x93\x02\f\"\n" + + "/v2/friend\x12k\n" + + "\rAddGroupUsers\x12 .nakama.api.AddGroupUsersRequest\x1a\x16.google.protobuf.Empty\" \x82\xd3\xe4\x93\x02\x1a\"\x18/v2/group/{group_id}/add\x12\x84\x01\n" + + "\x0eSessionRefresh\x12!.nakama.api.SessionRefreshRequest\x1a\x13.nakama.api.Session\":\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v2/account/session/refresh\x12h\n" + + "\rSessionLogout\x12 .nakama.api.SessionLogoutRequest\x1a\x16.google.protobuf.Empty\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/v2/session/logout\x12\x93\x01\n" + + "\x11AuthenticateApple\x12$.nakama.api.AuthenticateAppleRequest\x1a\x13.nakama.api.Session\"C\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02):\aaccount\"\x1e/v2/account/authenticate/apple\x12\x96\x01\n" + + "\x12AuthenticateCustom\x12%.nakama.api.AuthenticateCustomRequest\x1a\x13.nakama.api.Session\"D\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02*:\aaccount\"\x1f/v2/account/authenticate/custom\x12\x96\x01\n" + + "\x12AuthenticateDevice\x12%.nakama.api.AuthenticateDeviceRequest\x1a\x13.nakama.api.Session\"D\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02*:\aaccount\"\x1f/v2/account/authenticate/device\x12\x93\x01\n" + + "\x11AuthenticateEmail\x12$.nakama.api.AuthenticateEmailRequest\x1a\x13.nakama.api.Session\"C\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02):\aaccount\"\x1e/v2/account/authenticate/email\x12\x9c\x01\n" + + "\x14AuthenticateFacebook\x12'.nakama.api.AuthenticateFacebookRequest\x1a\x13.nakama.api.Session\"F\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02,:\aaccount\"!/v2/account/authenticate/facebook\x12\xbd\x01\n" + + "\x1fAuthenticateFacebookInstantGame\x122.nakama.api.AuthenticateFacebookInstantGameRequest\x1a\x13.nakama.api.Session\"Q\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x027:\aaccount\",/v2/account/authenticate/facebookinstantgame\x12\xa2\x01\n" + + "\x16AuthenticateGameCenter\x12).nakama.api.AuthenticateGameCenterRequest\x1a\x13.nakama.api.Session\"H\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02.:\aaccount\"#/v2/account/authenticate/gamecenter\x12\x96\x01\n" + + "\x12AuthenticateGoogle\x12%.nakama.api.AuthenticateGoogleRequest\x1a\x13.nakama.api.Session\"D\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02*:\aaccount\"\x1f/v2/account/authenticate/google\x12\x93\x01\n" + + "\x11AuthenticateSteam\x12$.nakama.api.AuthenticateSteamRequest\x1a\x13.nakama.api.Session\"C\x92A\x11b\x0f\n" + + "\r\n" + + "\tBasicAuth\x12\x00\x82\xd3\xe4\x93\x02):\aaccount\"\x1e/v2/account/authenticate/steam\x12k\n" + + "\rBanGroupUsers\x12 .nakama.api.BanGroupUsersRequest\x1a\x16.google.protobuf.Empty\" \x82\xd3\xe4\x93\x02\x1a\"\x18/v2/group/{group_id}/ban\x12a\n" + + "\fBlockFriends\x12\x1f.nakama.api.BlockFriendsRequest\x1a\x16.google.protobuf.Empty\"\x18\x82\xd3\xe4\x93\x02\x12\"\x10/v2/friend/block\x12V\n" + + "\vCreateGroup\x12\x1e.nakama.api.CreateGroupRequest\x1a\x11.nakama.api.Group\"\x14\x82\xd3\xe4\x93\x02\x0e:\x01*\"\t/v2/group\x12T\n" + + "\rDeleteAccount\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x13\x82\xd3\xe4\x93\x02\r*\v/v2/account\x12]\n" + + "\rDeleteFriends\x12 .nakama.api.DeleteFriendsRequest\x1a\x16.google.protobuf.Empty\"\x12\x82\xd3\xe4\x93\x02\f*\n" + + "/v2/friend\x12c\n" + + "\vDeleteGroup\x12\x1e.nakama.api.DeleteGroupRequest\x1a\x16.google.protobuf.Empty\"\x1c\x82\xd3\xe4\x93\x02\x16*\x14/v2/group/{group_id}\x12\x87\x01\n" + + "\x17DeleteLeaderboardRecord\x12*.nakama.api.DeleteLeaderboardRecordRequest\x1a\x16.google.protobuf.Empty\"(\x82\xd3\xe4\x93\x02\"* /v2/leaderboard/{leaderboard_id}\x12o\n" + + "\x13DeleteNotifications\x12&.nakama.api.DeleteNotificationsRequest\x1a\x16.google.protobuf.Empty\"\x18\x82\xd3\xe4\x93\x02\x12*\x10/v2/notification\x12\x83\x01\n" + + "\x16DeleteTournamentRecord\x12).nakama.api.DeleteTournamentRecordRequest\x1a\x16.google.protobuf.Empty\"&\x82\xd3\xe4\x93\x02 *\x1e/v2/tournament/{tournament_id}\x12v\n" + + "\x14DeleteStorageObjects\x12'.nakama.api.DeleteStorageObjectsRequest\x1a\x16.google.protobuf.Empty\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\x1a\x12/v2/storage/delete\x12H\n" + + "\x05Event\x12\x11.nakama.api.Event\x1a\x16.google.protobuf.Empty\"\x14\x82\xd3\xe4\x93\x02\x0e:\x01*\"\t/v2/event\x12N\n" + + "\n" + + "GetAccount\x12\x16.google.protobuf.Empty\x1a\x13.nakama.api.Account\"\x13\x82\xd3\xe4\x93\x02\r\x12\v/v2/account\x12L\n" + + "\bGetUsers\x12\x1b.nakama.api.GetUsersRequest\x1a\x11.nakama.api.Users\"\x10\x82\xd3\xe4\x93\x02\n" + + "\x12\b/v2/user\x12\x83\x01\n" + + "\x0fGetSubscription\x12\".nakama.api.GetSubscriptionRequest\x1a!.nakama.api.ValidatedSubscription\")\x82\xd3\xe4\x93\x02#\x12!/v2/iap/subscription/{product_id}\x12g\n" + + "\x12GetMatchmakerStats\x12\x16.google.protobuf.Empty\x1a\x1b.nakama.api.MatchmakerStats\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/v2/matchmaker/stats\x12S\n" + + "\vHealthcheck\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x14\x82\xd3\xe4\x93\x02\x0e\x12\f/healthcheck\x12\x7f\n" + + "\x15ImportFacebookFriends\x12(.nakama.api.ImportFacebookFriendsRequest\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e:\aaccount\"\x13/v2/friend/facebook\x12v\n" + + "\x12ImportSteamFriends\x12%.nakama.api.ImportSteamFriendsRequest\x1a\x16.google.protobuf.Empty\"!\x82\xd3\xe4\x93\x02\x1b:\aaccount\"\x10/v2/friend/steam\x12d\n" + + "\tJoinGroup\x12\x1c.nakama.api.JoinGroupRequest\x1a\x16.google.protobuf.Empty\"!\x82\xd3\xe4\x93\x02\x1b\"\x19/v2/group/{group_id}/join\x12x\n" + + "\x0eJoinTournament\x12!.nakama.api.JoinTournamentRequest\x1a\x16.google.protobuf.Empty\"+\x82\xd3\xe4\x93\x02%\"#/v2/tournament/{tournament_id}/join\x12n\n" + + "\x0eKickGroupUsers\x12!.nakama.api.KickGroupUsersRequest\x1a\x16.google.protobuf.Empty\"!\x82\xd3\xe4\x93\x02\x1b\"\x19/v2/group/{group_id}/kick\x12g\n" + + "\n" + + "LeaveGroup\x12\x1d.nakama.api.LeaveGroupRequest\x1a\x16.google.protobuf.Empty\"\"\x82\xd3\xe4\x93\x02\x1c\"\x1a/v2/group/{group_id}/leave\x12`\n" + + "\tLinkApple\x12\x18.nakama.api.AccountApple\x1a\x16.google.protobuf.Empty\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/account/link/apple\x12c\n" + + "\n" + + "LinkCustom\x12\x19.nakama.api.AccountCustom\x1a\x16.google.protobuf.Empty\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/account/link/custom\x12c\n" + + "\n" + + "LinkDevice\x12\x19.nakama.api.AccountDevice\x1a\x16.google.protobuf.Empty\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/account/link/device\x12`\n" + + "\tLinkEmail\x12\x18.nakama.api.AccountEmail\x1a\x16.google.protobuf.Empty\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/account/link/email\x12s\n" + + "\fLinkFacebook\x12\x1f.nakama.api.LinkFacebookRequest\x1a\x16.google.protobuf.Empty\"*\x82\xd3\xe4\x93\x02$:\aaccount\"\x19/v2/account/link/facebook\x12\x8a\x01\n" + + "\x17LinkFacebookInstantGame\x12&.nakama.api.AccountFacebookInstantGame\x1a\x16.google.protobuf.Empty\"/\x82\xd3\xe4\x93\x02):\x01*\"$/v2/account/link/facebookinstantgame\x12o\n" + + "\x0eLinkGameCenter\x12\x1d.nakama.api.AccountGameCenter\x1a\x16.google.protobuf.Empty\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v2/account/link/gamecenter\x12c\n" + + "\n" + + "LinkGoogle\x12\x19.nakama.api.AccountGoogle\x1a\x16.google.protobuf.Empty\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/account/link/google\x12d\n" + + "\tLinkSteam\x12\x1c.nakama.api.LinkSteamRequest\x1a\x16.google.protobuf.Empty\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/account/link/steam\x12\x7f\n" + + "\x13ListChannelMessages\x12&.nakama.api.ListChannelMessagesRequest\x1a\x1e.nakama.api.ChannelMessageList\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/v2/channel/{channel_id}\x12Y\n" + + "\vListFriends\x12\x1e.nakama.api.ListFriendsRequest\x1a\x16.nakama.api.FriendList\"\x12\x82\xd3\xe4\x93\x02\f\x12\n" + + "/v2/friend\x12}\n" + + "\x14ListFriendsOfFriends\x12'.nakama.api.ListFriendsOfFriendsRequest\x1a .nakama.api.FriendsOfFriendsList\"\x1a\x82\xd3\xe4\x93\x02\x14\x12\x12/v2/friend/friends\x12U\n" + + "\n" + + "ListGroups\x12\x1d.nakama.api.ListGroupsRequest\x1a\x15.nakama.api.GroupList\"\x11\x82\xd3\xe4\x93\x02\v\x12\t/v2/group\x12q\n" + + "\x0eListGroupUsers\x12!.nakama.api.ListGroupUsersRequest\x1a\x19.nakama.api.GroupUserList\"!\x82\xd3\xe4\x93\x02\x1b\x12\x19/v2/group/{group_id}/user\x12\x90\x01\n" + + "\x16ListLeaderboardRecords\x12).nakama.api.ListLeaderboardRecordsRequest\x1a!.nakama.api.LeaderboardRecordList\"(\x82\xd3\xe4\x93\x02\"\x12 /v2/leaderboard/{leaderboard_id}\x12\xb7\x01\n" + + "!ListLeaderboardRecordsAroundOwner\x124.nakama.api.ListLeaderboardRecordsAroundOwnerRequest\x1a!.nakama.api.LeaderboardRecordList\"9\x82\xd3\xe4\x93\x023\x121/v2/leaderboard/{leaderboard_id}/owner/{owner_id}\x12W\n" + + "\vListMatches\x12\x1e.nakama.api.ListMatchesRequest\x1a\x15.nakama.api.MatchList\"\x11\x82\xd3\xe4\x93\x02\v\x12\t/v2/match\x12q\n" + + "\x11ListNotifications\x12$.nakama.api.ListNotificationsRequest\x1a\x1c.nakama.api.NotificationList\"\x18\x82\xd3\xe4\x93\x02\x12\x12\x10/v2/notification\x12\xa2\x01\n" + + "\x12ListStorageObjects\x12%.nakama.api.ListStorageObjectsRequest\x1a\x1d.nakama.api.StorageObjectList\"F\x82\xd3\xe4\x93\x02@Z$\x12\"/v2/storage/{collection}/{user_id}\x12\x18/v2/storage/{collection}\x12x\n" + + "\x11ListSubscriptions\x12$.nakama.api.ListSubscriptionsRequest\x1a\x1c.nakama.api.SubscriptionList\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/v2/iap/subscription\x12i\n" + + "\x0fListTournaments\x12\".nakama.api.ListTournamentsRequest\x1a\x1a.nakama.api.TournamentList\"\x16\x82\xd3\xe4\x93\x02\x10\x12\x0e/v2/tournament\x12\x8b\x01\n" + + "\x15ListTournamentRecords\x12(.nakama.api.ListTournamentRecordsRequest\x1a .nakama.api.TournamentRecordList\"&\x82\xd3\xe4\x93\x02 \x12\x1e/v2/tournament/{tournament_id}\x12\xb2\x01\n" + + " ListTournamentRecordsAroundOwner\x123.nakama.api.ListTournamentRecordsAroundOwnerRequest\x1a .nakama.api.TournamentRecordList\"7\x82\xd3\xe4\x93\x021\x12//v2/tournament/{tournament_id}/owner/{owner_id}\x12p\n" + + "\x0eListUserGroups\x12!.nakama.api.ListUserGroupsRequest\x1a\x19.nakama.api.UserGroupList\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/v2/user/{user_id}/group\x12w\n" + + "\x11PromoteGroupUsers\x12$.nakama.api.PromoteGroupUsersRequest\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e\"\x1c/v2/group/{group_id}/promote\x12t\n" + + "\x10DemoteGroupUsers\x12#.nakama.api.DemoteGroupUsersRequest\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d\"\x1b/v2/group/{group_id}/demote\x12o\n" + + "\x12ReadStorageObjects\x12%.nakama.api.ReadStorageObjectsRequest\x1a\x1a.nakama.api.StorageObjects\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/v2/storage\x12\x7f\n" + + "\aRpcFunc\x12\x0f.nakama.api.Rpc\x1a\x0f.nakama.api.Rpc\"R\x92A\"b \n" + + "\r\n" + + "\tBearerJwt\x12\x00\n" + + "\x0f\n" + + "\vHttpKeyAuth\x12\x00\x82\xd3\xe4\x93\x02':\apayloadZ\x0e\x12\f/v2/rpc/{id}\"\f/v2/rpc/{id}\x12d\n" + + "\vUnlinkApple\x12\x18.nakama.api.AccountApple\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/account/unlink/apple\x12g\n" + + "\fUnlinkCustom\x12\x19.nakama.api.AccountCustom\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/v2/account/unlink/custom\x12g\n" + + "\fUnlinkDevice\x12\x19.nakama.api.AccountDevice\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/v2/account/unlink/device\x12d\n" + + "\vUnlinkEmail\x12\x18.nakama.api.AccountEmail\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/account/unlink/email\x12m\n" + + "\x0eUnlinkFacebook\x12\x1b.nakama.api.AccountFacebook\x1a\x16.google.protobuf.Empty\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v2/account/unlink/facebook\x12\x8e\x01\n" + + "\x19UnlinkFacebookInstantGame\x12&.nakama.api.AccountFacebookInstantGame\x1a\x16.google.protobuf.Empty\"1\x82\xd3\xe4\x93\x02+:\x01*\"&/v2/account/unlink/facebookinstantgame\x12s\n" + + "\x10UnlinkGameCenter\x12\x1d.nakama.api.AccountGameCenter\x1a\x16.google.protobuf.Empty\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/v2/account/unlink/gamecenter\x12g\n" + + "\fUnlinkGoogle\x12\x19.nakama.api.AccountGoogle\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/v2/account/unlink/google\x12d\n" + + "\vUnlinkSteam\x12\x18.nakama.api.AccountSteam\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/account/unlink/steam\x12a\n" + + "\rUpdateAccount\x12 .nakama.api.UpdateAccountRequest\x1a\x16.google.protobuf.Empty\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\x1a\v/v2/account\x12f\n" + + "\vUpdateGroup\x12\x1e.nakama.api.UpdateGroupRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\x1a\x14/v2/group/{group_id}\x12\x8a\x01\n" + + "\x15ValidatePurchaseApple\x12(.nakama.api.ValidatePurchaseAppleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/iap/purchase/apple\x12\x9a\x01\n" + + "\x19ValidateSubscriptionApple\x12,.nakama.api.ValidateSubscriptionAppleRequest\x1a(.nakama.api.ValidateSubscriptionResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v2/iap/subscription/apple\x12\x8d\x01\n" + + "\x16ValidatePurchaseGoogle\x12).nakama.api.ValidatePurchaseGoogleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/iap/purchase/google\x12\x9d\x01\n" + + "\x1aValidateSubscriptionGoogle\x12-.nakama.api.ValidateSubscriptionGoogleRequest\x1a(.nakama.api.ValidateSubscriptionResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v2/iap/subscription/google\x12\x8d\x01\n" + + "\x16ValidatePurchaseHuawei\x12).nakama.api.ValidatePurchaseHuaweiRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/iap/purchase/huawei\x12\xa8\x01\n" + + "\x1fValidatePurchaseFacebookInstant\x122.nakama.api.ValidatePurchaseFacebookInstantRequest\x1a$.nakama.api.ValidatePurchaseResponse\"+\x82\xd3\xe4\x93\x02%:\x01*\" /v2/iap/purchase/facebookinstant\x12\x87\x01\n" + + "\x14ValidatePurchaseXbox\x12'.nakama.api.ValidatePurchaseXboxRequest\x1a$.nakama.api.ValidatePurchaseResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/v2/iap/purchase/xbox\x12\x94\x01\n" + + "\x16WriteLeaderboardRecord\x12).nakama.api.WriteLeaderboardRecordRequest\x1a\x1d.nakama.api.LeaderboardRecord\"0\x82\xd3\xe4\x93\x02*:\x06record\" /v2/leaderboard/{leaderboard_id}\x12t\n" + + "\x13WriteStorageObjects\x12&.nakama.api.WriteStorageObjectsRequest\x1a\x1d.nakama.api.StorageObjectAcks\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\x1a\v/v2/storage\x12\xba\x01\n" + + "\x15WriteTournamentRecord\x12(.nakama.api.WriteTournamentRecordRequest\x1a\x1d.nakama.api.LeaderboardRecord\"X\x82\xd3\xe4\x93\x02R:\x06recordZ(:\x06record\"\x1e/v2/tournament/{tournament_id}\x1a\x1e/v2/tournament/{tournament_id}B\xba\x03\x92A\xcf\x02\x12u\n" + + "\rNakama API v2\"_\n" + + "!The Nakama Authors & Contributors\x12$https://github.com/heroiclabs/nakama\x1a\x14hello@heroiclabs.com2\x032.0\x1a\x0e127.0.0.1:7350*\x01\x012\x10application/json:\x10application/jsonZR\n" + + "\x0f\n" + + "\tBasicAuth\x12\x02\b\x01\n" + + " \n" + + "\tBearerJwt\x12\x13\b\x02\x1a\rAuthorization \x02\n" + + "\x1d\n" + + "\vHttpKeyAuth\x12\x0e\b\x02\x1a\bhttp_key \x02b\x0f\n" + + "\r\n" + + "\tBearerJwt\x12\x00r:\n" + + "\x1bNakama server documentation\x12\x1bhttps://heroiclabs.com/docs\n" + + "\x19com.heroiclabs.nakama.apiB\rNakamaApiGrpcP\x01Z'github.com/heroiclabs/nakama/v3/apigrpc\xaa\x02\x0fNakama.Protobufb\x06proto3" -var file_apigrpc_proto_goTypes = []interface{}{ +var file_apigrpc_proto_goTypes = []any{ (*api.AddFriendsRequest)(nil), // 0: nakama.api.AddFriendsRequest (*api.AddGroupUsersRequest)(nil), // 1: nakama.api.AddGroupUsersRequest (*api.SessionRefreshRequest)(nil), // 2: nakama.api.SessionRefreshRequest @@ -790,33 +251,34 @@ var file_apigrpc_proto_goTypes = []interface{}{ (*api.ValidateSubscriptionGoogleRequest)(nil), // 67: nakama.api.ValidateSubscriptionGoogleRequest (*api.ValidatePurchaseHuaweiRequest)(nil), // 68: nakama.api.ValidatePurchaseHuaweiRequest (*api.ValidatePurchaseFacebookInstantRequest)(nil), // 69: nakama.api.ValidatePurchaseFacebookInstantRequest - (*api.WriteLeaderboardRecordRequest)(nil), // 70: nakama.api.WriteLeaderboardRecordRequest - (*api.WriteStorageObjectsRequest)(nil), // 71: nakama.api.WriteStorageObjectsRequest - (*api.WriteTournamentRecordRequest)(nil), // 72: nakama.api.WriteTournamentRecordRequest - (*api.Session)(nil), // 73: nakama.api.Session - (*api.Group)(nil), // 74: nakama.api.Group - (*api.Account)(nil), // 75: nakama.api.Account - (*api.Users)(nil), // 76: nakama.api.Users - (*api.ValidatedSubscription)(nil), // 77: nakama.api.ValidatedSubscription - (*api.MatchmakerStats)(nil), // 78: nakama.api.MatchmakerStats - (*api.ChannelMessageList)(nil), // 79: nakama.api.ChannelMessageList - (*api.FriendList)(nil), // 80: nakama.api.FriendList - (*api.FriendsOfFriendsList)(nil), // 81: nakama.api.FriendsOfFriendsList - (*api.GroupList)(nil), // 82: nakama.api.GroupList - (*api.GroupUserList)(nil), // 83: nakama.api.GroupUserList - (*api.LeaderboardRecordList)(nil), // 84: nakama.api.LeaderboardRecordList - (*api.MatchList)(nil), // 85: nakama.api.MatchList - (*api.NotificationList)(nil), // 86: nakama.api.NotificationList - (*api.StorageObjectList)(nil), // 87: nakama.api.StorageObjectList - (*api.SubscriptionList)(nil), // 88: nakama.api.SubscriptionList - (*api.TournamentList)(nil), // 89: nakama.api.TournamentList - (*api.TournamentRecordList)(nil), // 90: nakama.api.TournamentRecordList - (*api.UserGroupList)(nil), // 91: nakama.api.UserGroupList - (*api.StorageObjects)(nil), // 92: nakama.api.StorageObjects - (*api.ValidatePurchaseResponse)(nil), // 93: nakama.api.ValidatePurchaseResponse - (*api.ValidateSubscriptionResponse)(nil), // 94: nakama.api.ValidateSubscriptionResponse - (*api.LeaderboardRecord)(nil), // 95: nakama.api.LeaderboardRecord - (*api.StorageObjectAcks)(nil), // 96: nakama.api.StorageObjectAcks + (*api.ValidatePurchaseXboxRequest)(nil), // 70: nakama.api.ValidatePurchaseXboxRequest + (*api.WriteLeaderboardRecordRequest)(nil), // 71: nakama.api.WriteLeaderboardRecordRequest + (*api.WriteStorageObjectsRequest)(nil), // 72: nakama.api.WriteStorageObjectsRequest + (*api.WriteTournamentRecordRequest)(nil), // 73: nakama.api.WriteTournamentRecordRequest + (*api.Session)(nil), // 74: nakama.api.Session + (*api.Group)(nil), // 75: nakama.api.Group + (*api.Account)(nil), // 76: nakama.api.Account + (*api.Users)(nil), // 77: nakama.api.Users + (*api.ValidatedSubscription)(nil), // 78: nakama.api.ValidatedSubscription + (*api.MatchmakerStats)(nil), // 79: nakama.api.MatchmakerStats + (*api.ChannelMessageList)(nil), // 80: nakama.api.ChannelMessageList + (*api.FriendList)(nil), // 81: nakama.api.FriendList + (*api.FriendsOfFriendsList)(nil), // 82: nakama.api.FriendsOfFriendsList + (*api.GroupList)(nil), // 83: nakama.api.GroupList + (*api.GroupUserList)(nil), // 84: nakama.api.GroupUserList + (*api.LeaderboardRecordList)(nil), // 85: nakama.api.LeaderboardRecordList + (*api.MatchList)(nil), // 86: nakama.api.MatchList + (*api.NotificationList)(nil), // 87: nakama.api.NotificationList + (*api.StorageObjectList)(nil), // 88: nakama.api.StorageObjectList + (*api.SubscriptionList)(nil), // 89: nakama.api.SubscriptionList + (*api.TournamentList)(nil), // 90: nakama.api.TournamentList + (*api.TournamentRecordList)(nil), // 91: nakama.api.TournamentRecordList + (*api.UserGroupList)(nil), // 92: nakama.api.UserGroupList + (*api.StorageObjects)(nil), // 93: nakama.api.StorageObjects + (*api.ValidatePurchaseResponse)(nil), // 94: nakama.api.ValidatePurchaseResponse + (*api.ValidateSubscriptionResponse)(nil), // 95: nakama.api.ValidateSubscriptionResponse + (*api.LeaderboardRecord)(nil), // 96: nakama.api.LeaderboardRecord + (*api.StorageObjectAcks)(nil), // 97: nakama.api.StorageObjectAcks } var file_apigrpc_proto_depIdxs = []int32{ 0, // 0: nakama.api.Nakama.AddFriends:input_type -> nakama.api.AddFriendsRequest @@ -899,94 +361,96 @@ var file_apigrpc_proto_depIdxs = []int32{ 67, // 77: nakama.api.Nakama.ValidateSubscriptionGoogle:input_type -> nakama.api.ValidateSubscriptionGoogleRequest 68, // 78: nakama.api.Nakama.ValidatePurchaseHuawei:input_type -> nakama.api.ValidatePurchaseHuaweiRequest 69, // 79: nakama.api.Nakama.ValidatePurchaseFacebookInstant:input_type -> nakama.api.ValidatePurchaseFacebookInstantRequest - 70, // 80: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest - 71, // 81: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest - 72, // 82: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest - 16, // 83: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty - 16, // 84: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty - 73, // 85: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session - 16, // 86: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty - 73, // 87: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session - 73, // 88: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session - 73, // 89: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session - 73, // 90: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session - 73, // 91: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session - 73, // 92: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session - 73, // 93: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session - 73, // 94: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session - 73, // 95: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session - 16, // 96: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty - 16, // 97: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty - 74, // 98: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group - 16, // 99: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty - 16, // 100: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty - 16, // 101: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty - 16, // 102: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty - 16, // 103: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty - 16, // 104: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty - 16, // 105: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty - 16, // 106: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty - 75, // 107: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account - 76, // 108: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users - 77, // 109: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription - 78, // 110: nakama.api.Nakama.GetMatchmakerStats:output_type -> nakama.api.MatchmakerStats - 16, // 111: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty - 16, // 112: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty - 16, // 113: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty - 16, // 114: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty - 16, // 115: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty - 16, // 116: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty - 16, // 117: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty - 16, // 118: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty - 16, // 119: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty - 16, // 120: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty - 16, // 121: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty - 16, // 122: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty - 16, // 123: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 124: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty - 16, // 125: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty - 16, // 126: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty - 79, // 127: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList - 80, // 128: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList - 81, // 129: nakama.api.Nakama.ListFriendsOfFriends:output_type -> nakama.api.FriendsOfFriendsList - 82, // 130: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList - 83, // 131: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList - 84, // 132: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList - 84, // 133: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList - 85, // 134: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList - 86, // 135: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList - 87, // 136: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList - 88, // 137: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList - 89, // 138: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList - 90, // 139: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList - 90, // 140: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList - 91, // 141: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList - 16, // 142: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty - 16, // 143: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty - 92, // 144: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects - 59, // 145: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc - 16, // 146: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty - 16, // 147: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty - 16, // 148: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty - 16, // 149: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty - 16, // 150: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty - 16, // 151: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 152: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty - 16, // 153: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty - 16, // 154: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty - 16, // 155: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty - 16, // 156: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty - 93, // 157: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse - 94, // 158: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse - 93, // 159: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse - 94, // 160: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse - 93, // 161: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse - 93, // 162: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 163: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord - 96, // 164: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks - 95, // 165: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord - 83, // [83:166] is the sub-list for method output_type - 0, // [0:83] is the sub-list for method input_type + 70, // 80: nakama.api.Nakama.ValidatePurchaseXbox:input_type -> nakama.api.ValidatePurchaseXboxRequest + 71, // 81: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest + 72, // 82: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest + 73, // 83: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest + 16, // 84: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty + 16, // 85: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty + 74, // 86: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session + 16, // 87: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty + 74, // 88: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session + 74, // 89: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session + 74, // 90: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session + 74, // 91: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session + 74, // 92: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session + 74, // 93: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session + 74, // 94: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session + 74, // 95: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session + 74, // 96: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session + 16, // 97: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty + 16, // 98: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty + 75, // 99: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group + 16, // 100: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty + 16, // 101: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty + 16, // 102: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty + 16, // 103: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty + 16, // 104: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty + 16, // 105: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty + 16, // 106: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty + 16, // 107: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty + 76, // 108: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account + 77, // 109: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users + 78, // 110: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription + 79, // 111: nakama.api.Nakama.GetMatchmakerStats:output_type -> nakama.api.MatchmakerStats + 16, // 112: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty + 16, // 113: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty + 16, // 114: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty + 16, // 115: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty + 16, // 116: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty + 16, // 117: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty + 16, // 118: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty + 16, // 119: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty + 16, // 120: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty + 16, // 121: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty + 16, // 122: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty + 16, // 123: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty + 16, // 124: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 125: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty + 16, // 126: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty + 16, // 127: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty + 80, // 128: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList + 81, // 129: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList + 82, // 130: nakama.api.Nakama.ListFriendsOfFriends:output_type -> nakama.api.FriendsOfFriendsList + 83, // 131: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList + 84, // 132: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList + 85, // 133: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList + 85, // 134: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList + 86, // 135: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList + 87, // 136: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList + 88, // 137: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList + 89, // 138: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList + 90, // 139: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList + 91, // 140: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList + 91, // 141: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList + 92, // 142: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList + 16, // 143: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty + 16, // 144: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty + 93, // 145: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects + 59, // 146: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc + 16, // 147: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty + 16, // 148: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty + 16, // 149: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty + 16, // 150: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty + 16, // 151: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty + 16, // 152: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 153: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty + 16, // 154: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty + 16, // 155: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty + 16, // 156: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty + 16, // 157: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty + 94, // 158: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 159: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse + 94, // 160: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 161: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse + 94, // 162: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse + 94, // 163: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse + 94, // 164: nakama.api.Nakama.ValidatePurchaseXbox:output_type -> nakama.api.ValidatePurchaseResponse + 96, // 165: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord + 97, // 166: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks + 96, // 167: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord + 84, // [84:168] is the sub-list for method output_type + 0, // [0:84] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name @@ -1001,7 +465,7 @@ func file_apigrpc_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_apigrpc_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_apigrpc_proto_rawDesc), len(file_apigrpc_proto_rawDesc)), NumEnums: 0, NumMessages: 0, NumExtensions: 0, @@ -1011,7 +475,6 @@ func file_apigrpc_proto_init() { DependencyIndexes: file_apigrpc_proto_depIdxs, }.Build() File_apigrpc_proto = out.File - file_apigrpc_proto_rawDesc = nil file_apigrpc_proto_goTypes = nil file_apigrpc_proto_depIdxs = nil } diff --git a/apigrpc/apigrpc.pb.gw.go b/apigrpc/apigrpc.pb.gw.go index 26c5d83889..b1cbdfb170 100644 --- a/apigrpc/apigrpc.pb.gw.go +++ b/apigrpc/apigrpc.pb.gw.go @@ -10,6 +10,7 @@ package apigrpc import ( "context" + "errors" "io" "net/http" @@ -26,4040 +27,3012 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join - var ( - filter_Nakama_AddFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join ) -func request_Nakama_AddFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AddFriendsRequest - var metadata runtime.ServerMetadata +var filter_Nakama_AddFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +func request_Nakama_AddFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq api.AddFriendsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AddFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AddFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AddFriends_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AddFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.AddFriendsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AddFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AddFriends(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AddGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0, "groupId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_AddGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AddGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AddGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.AddGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AddGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AddGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AddGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AddGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.AddGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AddGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AddGroupUsers(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_SessionRefresh_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.SessionRefreshRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.SessionRefreshRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.SessionRefresh(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_SessionRefresh_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.SessionRefreshRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.SessionRefreshRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.SessionRefresh(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_SessionLogout_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.SessionLogoutRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.SessionLogoutRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.SessionLogout(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_SessionLogout_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.SessionLogoutRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.SessionLogoutRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.SessionLogout(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateApple_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateApple_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateApple_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateAppleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateAppleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateApple_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateApple(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateApple_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateAppleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateAppleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateApple_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateApple(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateCustom_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateCustom_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateCustom_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateCustomRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateCustomRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateCustom_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateCustom(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateCustom_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateCustomRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateCustomRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateCustom_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateCustom(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateDevice_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateDevice_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateDevice_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateDeviceRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateDeviceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateDevice_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateDevice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateDevice_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateDeviceRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateDeviceRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateDevice_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateDevice(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateEmail_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateEmail_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateEmail_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateEmailRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateEmailRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateEmail_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateEmail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateEmail_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateEmailRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateEmailRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateEmail_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateEmail(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateFacebook_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateFacebook_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateFacebook_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateFacebookRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateFacebookRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateFacebook_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateFacebook(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateFacebook_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateFacebookRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateFacebookRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateFacebook_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateFacebook(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateFacebookInstantGame_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateFacebookInstantGame_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateFacebookInstantGameRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateFacebookInstantGameRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateFacebookInstantGame_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateFacebookInstantGame(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateFacebookInstantGameRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateFacebookInstantGameRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateFacebookInstantGame_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateFacebookInstantGame(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateGameCenter_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateGameCenter_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateGameCenterRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateGameCenterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateGameCenter_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateGameCenter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateGameCenterRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateGameCenterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateGameCenter_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateGameCenter(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateGoogle_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateGoogle_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateGoogle_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateGoogleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateGoogleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateGoogle_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateGoogle(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateGoogle_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateGoogleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateGoogleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateGoogle_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateGoogle(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_AuthenticateSteam_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_AuthenticateSteam_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_AuthenticateSteam_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateSteamRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateSteamRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateSteam_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateSteam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_AuthenticateSteam_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AuthenticateSteamRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.AuthenticateSteamRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_AuthenticateSteam_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateSteam(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_BanGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0, "groupId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_BanGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_BanGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.BanGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.BanGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_BanGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.BanGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_BanGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.BanGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.BanGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_BanGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.BanGroupUsers(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_BlockFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_BlockFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_BlockFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.BlockFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.BlockFriendsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_BlockFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.BlockFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_BlockFriends_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.BlockFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.BlockFriendsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_BlockFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.BlockFriends(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_CreateGroup_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.CreateGroupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.CreateGroupRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_CreateGroup_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.CreateGroupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.CreateGroupRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateGroup(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_DeleteAccount_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.DeleteAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DeleteAccount_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.DeleteAccount(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_DeleteFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_DeleteFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_DeleteFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.DeleteFriendsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_DeleteFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DeleteFriends_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.DeleteFriendsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_DeleteFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteFriends(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_DeleteGroup_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DeleteGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := client.DeleteGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DeleteGroup_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DeleteGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := server.DeleteGroup(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_DeleteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteLeaderboardRecordRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DeleteLeaderboardRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - msg, err := client.DeleteLeaderboardRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DeleteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteLeaderboardRecordRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DeleteLeaderboardRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - msg, err := server.DeleteLeaderboardRecord(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_DeleteNotifications_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_DeleteNotifications_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_DeleteNotifications_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteNotificationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.DeleteNotificationsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_DeleteNotifications_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteNotifications(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DeleteNotifications_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteNotificationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.DeleteNotificationsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_DeleteNotifications_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteNotifications(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_DeleteTournamentRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteTournamentRecordRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DeleteTournamentRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := client.DeleteTournamentRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DeleteTournamentRecord_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteTournamentRecordRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DeleteTournamentRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := server.DeleteTournamentRecord(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_DeleteStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteStorageObjectsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.DeleteStorageObjectsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteStorageObjects(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DeleteStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DeleteStorageObjectsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.DeleteStorageObjectsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteStorageObjects(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_Event_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.Event - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.Event + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Event(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_Event_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.Event - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.Event + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Event(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_GetAccount_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.GetAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_GetAccount_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.GetAccount(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_GetUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_GetUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_GetUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.GetUsersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.GetUsersRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_GetUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_GetUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.GetUsersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.GetUsersRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_GetUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetUsers(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_GetSubscription_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.GetSubscriptionRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.GetSubscriptionRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["product_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["product_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "product_id") } - protoReq.ProductId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "product_id", err) } - msg, err := client.GetSubscription(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_GetSubscription_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.GetSubscriptionRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.GetSubscriptionRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["product_id"] + val, ok := pathParams["product_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "product_id") } - protoReq.ProductId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "product_id", err) } - msg, err := server.GetSubscription(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_GetMatchmakerStats_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.GetMatchmakerStats(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_GetMatchmakerStats_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.GetMatchmakerStats(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_Healthcheck_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.Healthcheck(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_Healthcheck_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.Healthcheck(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ImportFacebookFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_ImportFacebookFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ImportFacebookFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ImportFacebookFriendsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.ImportFacebookFriendsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ImportFacebookFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ImportFacebookFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ImportFacebookFriends_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ImportFacebookFriendsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.ImportFacebookFriendsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ImportFacebookFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ImportFacebookFriends(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ImportSteamFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_ImportSteamFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ImportSteamFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ImportSteamFriendsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.ImportSteamFriendsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ImportSteamFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ImportSteamFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ImportSteamFriends_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ImportSteamFriendsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.ImportSteamFriendsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ImportSteamFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ImportSteamFriends(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_JoinGroup_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.JoinGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.JoinGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := client.JoinGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_JoinGroup_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.JoinGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.JoinGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := server.JoinGroup(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_JoinTournament_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.JoinTournamentRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.JoinTournamentRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := client.JoinTournament(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_JoinTournament_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.JoinTournamentRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.JoinTournamentRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := server.JoinTournament(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_KickGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0, "groupId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_KickGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_KickGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.KickGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.KickGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_KickGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.KickGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_KickGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.KickGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.KickGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_KickGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.KickGroupUsers(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LeaveGroup_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.LeaveGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.LeaveGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := client.LeaveGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LeaveGroup_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.LeaveGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.LeaveGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := server.LeaveGroup(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkApple_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountApple - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountApple + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkApple(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkApple_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountApple - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountApple + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkApple(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkCustom_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountCustom - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountCustom + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkCustom(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkCustom_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountCustom - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountCustom + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkCustom(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkDevice_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountDevice - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountDevice + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkDevice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkDevice_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountDevice - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountDevice + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkDevice(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkEmail_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountEmail - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountEmail + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkEmail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkEmail_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountEmail - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountEmail + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkEmail(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_LinkFacebook_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_LinkFacebook_0 = &utilities.DoubleArray{Encoding: map[string]int{"account": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_LinkFacebook_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.LinkFacebookRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.LinkFacebookRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_LinkFacebook_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkFacebook(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkFacebook_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.LinkFacebookRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Account); err != nil && err != io.EOF { + var ( + protoReq api.LinkFacebookRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Account); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_LinkFacebook_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkFacebook(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountFacebookInstantGame - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountFacebookInstantGame + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkFacebookInstantGame(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountFacebookInstantGame - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountFacebookInstantGame + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkFacebookInstantGame(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGameCenter - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGameCenter + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkGameCenter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGameCenter - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGameCenter + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkGameCenter(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkGoogle_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGoogle - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGoogle + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkGoogle(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkGoogle_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGoogle - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGoogle + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkGoogle(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_LinkSteam_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.LinkSteamRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.LinkSteamRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.LinkSteam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_LinkSteam_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.LinkSteamRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.LinkSteamRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.LinkSteam(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListChannelMessages_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_id": 0, "channelId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_ListChannelMessages_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ListChannelMessages_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListChannelMessagesRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListChannelMessagesRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["channel_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["channel_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") } - protoReq.ChannelId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListChannelMessages_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListChannelMessages(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListChannelMessages_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListChannelMessagesRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListChannelMessagesRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["channel_id"] + val, ok := pathParams["channel_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") } - protoReq.ChannelId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListChannelMessages_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListChannelMessages(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_ListFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_ListFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListFriendsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListFriends_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListFriendsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListFriends(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListFriendsOfFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_ListFriendsOfFriends_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_ListFriendsOfFriends_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListFriendsOfFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListFriendsOfFriendsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListFriendsOfFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListFriendsOfFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListFriendsOfFriends_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListFriendsOfFriendsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListFriendsOfFriendsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListFriendsOfFriends_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListFriendsOfFriends(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListGroups_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_ListGroups_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_ListGroups_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListGroupsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListGroupsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListGroups_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListGroups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListGroups_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListGroupsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListGroupsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListGroups_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListGroups(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0, "groupId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_ListGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ListGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListGroupUsers(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListLeaderboardRecords_0 = &utilities.DoubleArray{Encoding: map[string]int{"leaderboard_id": 0, "leaderboardId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_ListLeaderboardRecords_0 = &utilities.DoubleArray{Encoding: map[string]int{"leaderboard_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ListLeaderboardRecords_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListLeaderboardRecordsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListLeaderboardRecordsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListLeaderboardRecords_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListLeaderboardRecords(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListLeaderboardRecords_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListLeaderboardRecordsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListLeaderboardRecordsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListLeaderboardRecords_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListLeaderboardRecords(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListLeaderboardRecordsAroundOwner_0 = &utilities.DoubleArray{Encoding: map[string]int{"leaderboard_id": 0, "leaderboardId": 1, "owner_id": 2, "ownerId": 3}, Base: []int{1, 1, 2, 3, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 1, 1, 2, 3, 4, 5}} -) +var filter_Nakama_ListLeaderboardRecordsAroundOwner_0 = &utilities.DoubleArray{Encoding: map[string]int{"leaderboard_id": 0, "owner_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_Nakama_ListLeaderboardRecordsAroundOwner_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListLeaderboardRecordsAroundOwnerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListLeaderboardRecordsAroundOwnerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - val, ok = pathParams["owner_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "owner_id") } - protoReq.OwnerId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "owner_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListLeaderboardRecordsAroundOwner_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListLeaderboardRecordsAroundOwner(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListLeaderboardRecordsAroundOwner_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListLeaderboardRecordsAroundOwnerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListLeaderboardRecordsAroundOwnerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - val, ok = pathParams["owner_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "owner_id") } - protoReq.OwnerId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "owner_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListLeaderboardRecordsAroundOwner_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListLeaderboardRecordsAroundOwner(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListMatches_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_ListMatches_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_ListMatches_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListMatchesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListMatchesRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListMatches_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListMatches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListMatches_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListMatchesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListMatchesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListMatches_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListMatches(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListNotifications_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_ListNotifications_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_ListNotifications_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListNotificationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListNotificationsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListNotifications_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListNotifications(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListNotifications_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListNotificationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListNotificationsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListNotifications_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListNotifications(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListStorageObjects_0 = &utilities.DoubleArray{Encoding: map[string]int{"collection": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_ListStorageObjects_0 = &utilities.DoubleArray{Encoding: map[string]int{"collection": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ListStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListStorageObjectsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListStorageObjectsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListStorageObjects_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListStorageObjects(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListStorageObjectsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListStorageObjectsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListStorageObjects_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListStorageObjects(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListStorageObjects_1 = &utilities.DoubleArray{Encoding: map[string]int{"collection": 0, "user_id": 1, "userId": 2}, Base: []int{1, 2, 3, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 1, 2, 2, 3, 4}} -) +var filter_Nakama_ListStorageObjects_1 = &utilities.DoubleArray{Encoding: map[string]int{"collection": 0, "user_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_Nakama_ListStorageObjects_1(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListStorageObjectsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListStorageObjectsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListStorageObjects_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListStorageObjects(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListStorageObjects_1(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListStorageObjectsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListStorageObjectsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListStorageObjects_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListStorageObjects(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ListSubscriptions_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListSubscriptionsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ListSubscriptionsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListSubscriptions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListSubscriptions_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListSubscriptionsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ListSubscriptionsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListSubscriptions(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListTournaments_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Nakama_ListTournaments_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Nakama_ListTournaments_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListTournamentsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListTournamentsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListTournaments_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListTournaments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListTournaments_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListTournamentsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq api.ListTournamentsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListTournaments_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListTournaments(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListTournamentRecords_0 = &utilities.DoubleArray{Encoding: map[string]int{"tournament_id": 0, "tournamentId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_ListTournamentRecords_0 = &utilities.DoubleArray{Encoding: map[string]int{"tournament_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ListTournamentRecords_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListTournamentRecordsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListTournamentRecordsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListTournamentRecords_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListTournamentRecords(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListTournamentRecords_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListTournamentRecordsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListTournamentRecordsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListTournamentRecords_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListTournamentRecords(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListTournamentRecordsAroundOwner_0 = &utilities.DoubleArray{Encoding: map[string]int{"tournament_id": 0, "tournamentId": 1, "owner_id": 2, "ownerId": 3}, Base: []int{1, 1, 2, 3, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 1, 1, 2, 3, 4, 5}} -) +var filter_Nakama_ListTournamentRecordsAroundOwner_0 = &utilities.DoubleArray{Encoding: map[string]int{"tournament_id": 0, "owner_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_Nakama_ListTournamentRecordsAroundOwner_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListTournamentRecordsAroundOwnerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListTournamentRecordsAroundOwnerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - val, ok = pathParams["owner_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "owner_id") } - protoReq.OwnerId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "owner_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListTournamentRecordsAroundOwner_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListTournamentRecordsAroundOwner(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListTournamentRecordsAroundOwner_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListTournamentRecordsAroundOwnerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListTournamentRecordsAroundOwnerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - val, ok = pathParams["owner_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "owner_id") } - protoReq.OwnerId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "owner_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListTournamentRecordsAroundOwner_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListTournamentRecordsAroundOwner(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_ListUserGroups_0 = &utilities.DoubleArray{Encoding: map[string]int{"user_id": 0, "userId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_ListUserGroups_0 = &utilities.DoubleArray{Encoding: map[string]int{"user_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_ListUserGroups_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListUserGroupsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListUserGroupsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["user_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListUserGroups_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListUserGroups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ListUserGroups_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListUserGroupsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListUserGroupsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["user_id"] + val, ok := pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_ListUserGroups_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListUserGroups(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_PromoteGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0, "groupId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_PromoteGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_PromoteGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.PromoteGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.PromoteGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_PromoteGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.PromoteGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_PromoteGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.PromoteGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.PromoteGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_PromoteGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.PromoteGroupUsers(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_DemoteGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0, "groupId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Nakama_DemoteGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_DemoteGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DemoteGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DemoteGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_DemoteGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DemoteGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_DemoteGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.DemoteGroupUsersRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.DemoteGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_DemoteGroupUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DemoteGroupUsers(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ReadStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ReadStorageObjectsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ReadStorageObjectsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ReadStorageObjects(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ReadStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ReadStorageObjectsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ReadStorageObjectsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ReadStorageObjects(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_RpcFunc_0 = &utilities.DoubleArray{Encoding: map[string]int{"payload": 0, "id": 1}, Base: []int{1, 2, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 2, 3, 3}} -) +var filter_Nakama_RpcFunc_0 = &utilities.DoubleArray{Encoding: map[string]int{"payload": 0, "id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_Nakama_RpcFunc_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.Rpc - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Payload); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.Rpc + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Payload); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_RpcFunc_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.RpcFunc(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_RpcFunc_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.Rpc - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Payload); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.Rpc + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Payload); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_RpcFunc_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.RpcFunc(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Nakama_RpcFunc_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Nakama_RpcFunc_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Nakama_RpcFunc_1(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.Rpc - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.Rpc + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_RpcFunc_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.RpcFunc(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_RpcFunc_1(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.Rpc - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.Rpc + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_RpcFunc_1); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.RpcFunc(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkApple_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountApple - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountApple + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkApple(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkApple_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountApple - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountApple + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkApple(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkCustom_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountCustom - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountCustom + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkCustom(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkCustom_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountCustom - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountCustom + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkCustom(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkDevice_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountDevice - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountDevice + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkDevice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkDevice_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountDevice - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountDevice + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkDevice(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkEmail_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountEmail - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountEmail + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkEmail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkEmail_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountEmail - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountEmail + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkEmail(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkFacebook_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountFacebook - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountFacebook + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkFacebook(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkFacebook_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountFacebook - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountFacebook + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkFacebook(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountFacebookInstantGame - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountFacebookInstantGame + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkFacebookInstantGame(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountFacebookInstantGame - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountFacebookInstantGame + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkFacebookInstantGame(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGameCenter - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGameCenter + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkGameCenter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGameCenter - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGameCenter + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkGameCenter(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkGoogle_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGoogle - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGoogle + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkGoogle(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkGoogle_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountGoogle - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountGoogle + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkGoogle(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UnlinkSteam_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountSteam - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountSteam + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UnlinkSteam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UnlinkSteam_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.AccountSteam - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.AccountSteam + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UnlinkSteam(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UpdateAccount_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.UpdateAccountRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.UpdateAccountRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UpdateAccount_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.UpdateAccountRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.UpdateAccountRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateAccount(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_UpdateGroup_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.UpdateGroupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.UpdateGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := client.UpdateGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_UpdateGroup_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.UpdateGroupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.UpdateGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := server.UpdateGroup(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ValidatePurchaseApple_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseAppleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseAppleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ValidatePurchaseApple(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ValidatePurchaseApple_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseAppleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseAppleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ValidatePurchaseApple(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ValidateSubscriptionApple_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidateSubscriptionAppleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidateSubscriptionAppleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ValidateSubscriptionApple(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ValidateSubscriptionApple_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidateSubscriptionAppleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidateSubscriptionAppleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ValidateSubscriptionApple(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ValidatePurchaseGoogle_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseGoogleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseGoogleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ValidatePurchaseGoogle(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ValidatePurchaseGoogle_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseGoogleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseGoogleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ValidatePurchaseGoogle(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ValidateSubscriptionGoogle_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidateSubscriptionGoogleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidateSubscriptionGoogleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ValidateSubscriptionGoogle(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ValidateSubscriptionGoogle_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidateSubscriptionGoogleRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidateSubscriptionGoogleRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ValidateSubscriptionGoogle(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ValidatePurchaseHuawei_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseHuaweiRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseHuaweiRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ValidatePurchaseHuawei(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ValidatePurchaseHuawei_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseHuaweiRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseHuaweiRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ValidatePurchaseHuawei(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_ValidatePurchaseFacebookInstant_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseFacebookInstantRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseFacebookInstantRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ValidatePurchaseFacebookInstant(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_ValidatePurchaseFacebookInstant_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ValidatePurchaseFacebookInstantRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.ValidatePurchaseFacebookInstantRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ValidatePurchaseFacebookInstant(ctx, &protoReq) return msg, metadata, err - } -func request_Nakama_WriteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteLeaderboardRecordRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Record); err != nil && err != io.EOF { +func request_Nakama_ValidatePurchaseXbox_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq api.ValidatePurchaseXboxRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + msg, err := client.ValidatePurchaseXbox(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} +func local_request_Nakama_ValidatePurchaseXbox_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - val string - ok bool - err error - _ = err + protoReq api.ValidatePurchaseXboxRequest + metadata runtime.ServerMetadata ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ValidatePurchaseXbox(ctx, &protoReq) + return msg, metadata, err +} - val, ok = pathParams["leaderboard_id"] +func request_Nakama_WriteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq api.WriteLeaderboardRecordRequest + metadata runtime.ServerMetadata + err error + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Record); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - msg, err := client.WriteLeaderboardRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_WriteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteLeaderboardRecordRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Record); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.WriteLeaderboardRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Record); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - msg, err := server.WriteLeaderboardRecord(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_WriteStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteStorageObjectsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.WriteStorageObjectsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.WriteStorageObjects(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_WriteStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteStorageObjectsRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq api.WriteStorageObjectsRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.WriteStorageObjects(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_WriteTournamentRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteTournamentRecordRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Record); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.WriteTournamentRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Record); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := client.WriteTournamentRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_WriteTournamentRecord_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteTournamentRecordRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Record); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.WriteTournamentRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Record); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := server.WriteTournamentRecord(ctx, &protoReq) return msg, metadata, err - } func request_Nakama_WriteTournamentRecord_1(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteTournamentRecordRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Record); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.WriteTournamentRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Record); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := client.WriteTournamentRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Nakama_WriteTournamentRecord_1(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.WriteTournamentRecordRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Record); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq api.WriteTournamentRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["tournament_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Record); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["tournament_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "tournament_id") } - protoReq.TournamentId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "tournament_id", err) } - msg, err := server.WriteTournamentRecord(ctx, &protoReq) return msg, metadata, err - } // RegisterNakamaHandlerServer registers the http handlers for service Nakama to "mux". // UnaryRPC :call NakamaServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterNakamaHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, server NakamaServer) error { - - mux.Handle("POST", pattern_Nakama_AddFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AddFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AddFriends", runtime.WithHTTPPathPattern("/v2/friend")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AddFriends", runtime.WithHTTPPathPattern("/v2/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4071,20 +3044,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AddFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/add")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/add")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4096,20 +3064,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AddGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_SessionRefresh_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_SessionRefresh_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/SessionRefresh", runtime.WithHTTPPathPattern("/v2/account/session/refresh")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/SessionRefresh", runtime.WithHTTPPathPattern("/v2/account/session/refresh")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4121,20 +3084,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_SessionRefresh_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_SessionLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_SessionLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/SessionLogout", runtime.WithHTTPPathPattern("/v2/session/logout")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/SessionLogout", runtime.WithHTTPPathPattern("/v2/session/logout")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4146,20 +3104,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_SessionLogout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateApple", runtime.WithHTTPPathPattern("/v2/account/authenticate/apple")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateApple", runtime.WithHTTPPathPattern("/v2/account/authenticate/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4171,20 +3124,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateCustom", runtime.WithHTTPPathPattern("/v2/account/authenticate/custom")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateCustom", runtime.WithHTTPPathPattern("/v2/account/authenticate/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4196,20 +3144,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateDevice", runtime.WithHTTPPathPattern("/v2/account/authenticate/device")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateDevice", runtime.WithHTTPPathPattern("/v2/account/authenticate/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4221,20 +3164,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateEmail", runtime.WithHTTPPathPattern("/v2/account/authenticate/email")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateEmail", runtime.WithHTTPPathPattern("/v2/account/authenticate/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4246,20 +3184,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebook", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebook")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebook", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4271,20 +3204,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4296,20 +3224,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGameCenter", runtime.WithHTTPPathPattern("/v2/account/authenticate/gamecenter")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGameCenter", runtime.WithHTTPPathPattern("/v2/account/authenticate/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4321,20 +3244,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGoogle", runtime.WithHTTPPathPattern("/v2/account/authenticate/google")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGoogle", runtime.WithHTTPPathPattern("/v2/account/authenticate/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4346,20 +3264,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateSteam", runtime.WithHTTPPathPattern("/v2/account/authenticate/steam")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateSteam", runtime.WithHTTPPathPattern("/v2/account/authenticate/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4371,20 +3284,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_BanGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_BanGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/BanGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/ban")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/BanGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/ban")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4396,20 +3304,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_BanGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_BlockFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_BlockFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/BlockFriends", runtime.WithHTTPPathPattern("/v2/friend/block")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/BlockFriends", runtime.WithHTTPPathPattern("/v2/friend/block")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4421,20 +3324,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_BlockFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_CreateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_CreateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/CreateGroup", runtime.WithHTTPPathPattern("/v2/group")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/CreateGroup", runtime.WithHTTPPathPattern("/v2/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4446,20 +3344,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_CreateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteAccount", runtime.WithHTTPPathPattern("/v2/account")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteAccount", runtime.WithHTTPPathPattern("/v2/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4471,20 +3364,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteFriends", runtime.WithHTTPPathPattern("/v2/friend")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteFriends", runtime.WithHTTPPathPattern("/v2/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4496,20 +3384,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4521,20 +3404,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4546,20 +3424,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteLeaderboardRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteNotifications", runtime.WithHTTPPathPattern("/v2/notification")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteNotifications", runtime.WithHTTPPathPattern("/v2/notification")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4571,20 +3444,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteNotifications_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4596,20 +3464,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteTournamentRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_DeleteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_DeleteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/delete")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DeleteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4621,20 +3484,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_Event_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_Event_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/Event", runtime.WithHTTPPathPattern("/v2/event")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/Event", runtime.WithHTTPPathPattern("/v2/event")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4646,20 +3504,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_Event_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetAccount", runtime.WithHTTPPathPattern("/v2/account")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetAccount", runtime.WithHTTPPathPattern("/v2/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4671,20 +3524,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetUsers", runtime.WithHTTPPathPattern("/v2/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetUsers", runtime.WithHTTPPathPattern("/v2/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4696,20 +3544,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetSubscription", runtime.WithHTTPPathPattern("/v2/iap/subscription/{product_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetSubscription", runtime.WithHTTPPathPattern("/v2/iap/subscription/{product_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4721,20 +3564,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetMatchmakerStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetMatchmakerStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetMatchmakerStats", runtime.WithHTTPPathPattern("/v2/matchmaker/stats")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/GetMatchmakerStats", runtime.WithHTTPPathPattern("/v2/matchmaker/stats")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4746,20 +3584,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetMatchmakerStats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_Healthcheck_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_Healthcheck_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/Healthcheck", runtime.WithHTTPPathPattern("/healthcheck")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/Healthcheck", runtime.WithHTTPPathPattern("/healthcheck")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4771,20 +3604,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_Healthcheck_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ImportFacebookFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ImportFacebookFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ImportFacebookFriends", runtime.WithHTTPPathPattern("/v2/friend/facebook")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ImportFacebookFriends", runtime.WithHTTPPathPattern("/v2/friend/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4796,20 +3624,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ImportFacebookFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ImportSteamFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ImportSteamFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ImportSteamFriends", runtime.WithHTTPPathPattern("/v2/friend/steam")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ImportSteamFriends", runtime.WithHTTPPathPattern("/v2/friend/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4821,20 +3644,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ImportSteamFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_JoinGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_JoinGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/JoinGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/join")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/JoinGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/join")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4846,20 +3664,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_JoinGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_JoinTournament_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_JoinTournament_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/JoinTournament", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/join")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/JoinTournament", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/join")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4871,20 +3684,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_JoinTournament_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_KickGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_KickGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/KickGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/kick")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/KickGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/kick")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4896,20 +3704,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_KickGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LeaveGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LeaveGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LeaveGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/leave")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LeaveGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/leave")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4921,20 +3724,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LeaveGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkApple", runtime.WithHTTPPathPattern("/v2/account/link/apple")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkApple", runtime.WithHTTPPathPattern("/v2/account/link/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4946,20 +3744,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkCustom", runtime.WithHTTPPathPattern("/v2/account/link/custom")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkCustom", runtime.WithHTTPPathPattern("/v2/account/link/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4971,20 +3764,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkDevice", runtime.WithHTTPPathPattern("/v2/account/link/device")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkDevice", runtime.WithHTTPPathPattern("/v2/account/link/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4996,20 +3784,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkEmail", runtime.WithHTTPPathPattern("/v2/account/link/email")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkEmail", runtime.WithHTTPPathPattern("/v2/account/link/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5021,20 +3804,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebook", runtime.WithHTTPPathPattern("/v2/account/link/facebook")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebook", runtime.WithHTTPPathPattern("/v2/account/link/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5046,20 +3824,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/link/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/link/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5071,20 +3844,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/link/gamecenter")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/link/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5096,20 +3864,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkGoogle", runtime.WithHTTPPathPattern("/v2/account/link/google")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkGoogle", runtime.WithHTTPPathPattern("/v2/account/link/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5121,20 +3884,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkSteam", runtime.WithHTTPPathPattern("/v2/account/link/steam")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/LinkSteam", runtime.WithHTTPPathPattern("/v2/account/link/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5146,20 +3904,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/channel/{channel_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/channel/{channel_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5171,20 +3924,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListChannelMessages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListFriends", runtime.WithHTTPPathPattern("/v2/friend")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListFriends", runtime.WithHTTPPathPattern("/v2/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5196,20 +3944,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListFriendsOfFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListFriendsOfFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListFriendsOfFriends", runtime.WithHTTPPathPattern("/v2/friend/friends")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListFriendsOfFriends", runtime.WithHTTPPathPattern("/v2/friend/friends")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5221,20 +3964,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListFriendsOfFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListGroups", runtime.WithHTTPPathPattern("/v2/group")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListGroups", runtime.WithHTTPPathPattern("/v2/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5246,20 +3984,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5271,20 +4004,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5296,20 +4024,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListLeaderboardRecords_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListLeaderboardRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListLeaderboardRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}/owner/{owner_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}/owner/{owner_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5321,20 +4044,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListLeaderboardRecordsAroundOwner_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListMatches", runtime.WithHTTPPathPattern("/v2/match")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListMatches", runtime.WithHTTPPathPattern("/v2/match")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5346,20 +4064,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListMatches_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListNotifications", runtime.WithHTTPPathPattern("/v2/notification")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListNotifications", runtime.WithHTTPPathPattern("/v2/notification")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5371,20 +4084,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListNotifications_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5396,20 +4104,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListStorageObjects_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListStorageObjects_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}/{user_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5421,20 +4124,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListStorageObjects_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/iap/subscription")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/iap/subscription")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5446,20 +4144,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListSubscriptions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListTournaments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListTournaments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListTournaments", runtime.WithHTTPPathPattern("/v2/tournament")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListTournaments", runtime.WithHTTPPathPattern("/v2/tournament")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5471,20 +4164,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListTournaments_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListTournamentRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListTournamentRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecords", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecords", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5496,20 +4184,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListTournamentRecords_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListTournamentRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListTournamentRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/owner/{owner_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/owner/{owner_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5521,20 +4204,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListTournamentRecordsAroundOwner_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListUserGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListUserGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListUserGroups", runtime.WithHTTPPathPattern("/v2/user/{user_id}/group")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ListUserGroups", runtime.WithHTTPPathPattern("/v2/user/{user_id}/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5546,20 +4224,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListUserGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_PromoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_PromoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/PromoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/promote")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/PromoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/promote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5571,20 +4244,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_PromoteGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_DemoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_DemoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DemoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/demote")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/DemoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/demote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5596,20 +4264,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DemoteGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ReadStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ReadStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ReadStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ReadStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5621,20 +4284,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ReadStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_RpcFunc_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_RpcFunc_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5646,20 +4304,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_RpcFunc_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_RpcFunc_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_RpcFunc_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5671,20 +4324,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_RpcFunc_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkApple", runtime.WithHTTPPathPattern("/v2/account/unlink/apple")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkApple", runtime.WithHTTPPathPattern("/v2/account/unlink/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5696,20 +4344,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/account/unlink/custom")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/account/unlink/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5721,20 +4364,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/account/unlink/device")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/account/unlink/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5746,20 +4384,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/account/unlink/email")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/account/unlink/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5771,20 +4404,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/account/unlink/facebook")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/account/unlink/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5796,20 +4424,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/unlink/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/unlink/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5821,20 +4444,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/unlink/gamecenter")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/unlink/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5846,20 +4464,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/account/unlink/google")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/account/unlink/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5871,20 +4484,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/account/unlink/steam")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/account/unlink/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5896,20 +4504,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UpdateAccount", runtime.WithHTTPPathPattern("/v2/account")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UpdateAccount", runtime.WithHTTPPathPattern("/v2/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5921,20 +4524,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UpdateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UpdateGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/UpdateGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5946,20 +4544,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseApple", runtime.WithHTTPPathPattern("/v2/iap/purchase/apple")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseApple", runtime.WithHTTPPathPattern("/v2/iap/purchase/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5971,20 +4564,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidateSubscriptionApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidateSubscriptionApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionApple", runtime.WithHTTPPathPattern("/v2/iap/subscription/apple")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionApple", runtime.WithHTTPPathPattern("/v2/iap/subscription/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5996,20 +4584,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidateSubscriptionApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseGoogle", runtime.WithHTTPPathPattern("/v2/iap/purchase/google")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseGoogle", runtime.WithHTTPPathPattern("/v2/iap/purchase/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6021,20 +4604,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidateSubscriptionGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidateSubscriptionGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionGoogle", runtime.WithHTTPPathPattern("/v2/iap/subscription/google")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionGoogle", runtime.WithHTTPPathPattern("/v2/iap/subscription/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6046,20 +4624,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidateSubscriptionGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseHuawei_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseHuawei_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseHuawei", runtime.WithHTTPPathPattern("/v2/iap/purchase/huawei")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseHuawei", runtime.WithHTTPPathPattern("/v2/iap/purchase/huawei")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6071,20 +4644,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseHuawei_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6096,20 +4664,35 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseXbox_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseXbox", runtime.WithHTTPPathPattern("/v2/iap/purchase/xbox")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Nakama_ValidatePurchaseXbox_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Nakama_ValidatePurchaseXbox_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6121,20 +4704,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteLeaderboardRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_WriteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_WriteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6146,20 +4724,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_WriteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_WriteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6171,20 +4744,15 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteTournamentRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_WriteTournamentRecord_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_WriteTournamentRecord_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6196,9 +4764,7 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteTournamentRecord_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -6207,25 +4773,24 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser // RegisterNakamaHandlerFromEndpoint is same as RegisterNakamaHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterNakamaHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() - return RegisterNakamaHandler(ctx, mux, conn) } @@ -6239,16 +4804,13 @@ func RegisterNakamaHandler(ctx context.Context, mux *runtime.ServeMux, conn *grp // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "NakamaClient". // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "NakamaClient" // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "NakamaClient" to call the correct interceptors. +// "NakamaClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, client NakamaClient) error { - - mux.Handle("POST", pattern_Nakama_AddFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AddFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AddFriends", runtime.WithHTTPPathPattern("/v2/friend")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AddFriends", runtime.WithHTTPPathPattern("/v2/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6259,18 +4821,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AddFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/add")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/add")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6281,18 +4838,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AddGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_SessionRefresh_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_SessionRefresh_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/SessionRefresh", runtime.WithHTTPPathPattern("/v2/account/session/refresh")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/SessionRefresh", runtime.WithHTTPPathPattern("/v2/account/session/refresh")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6303,18 +4855,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_SessionRefresh_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_SessionLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_SessionLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/SessionLogout", runtime.WithHTTPPathPattern("/v2/session/logout")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/SessionLogout", runtime.WithHTTPPathPattern("/v2/session/logout")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6325,18 +4872,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_SessionLogout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateApple", runtime.WithHTTPPathPattern("/v2/account/authenticate/apple")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateApple", runtime.WithHTTPPathPattern("/v2/account/authenticate/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6347,18 +4889,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateCustom", runtime.WithHTTPPathPattern("/v2/account/authenticate/custom")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateCustom", runtime.WithHTTPPathPattern("/v2/account/authenticate/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6369,18 +4906,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateDevice", runtime.WithHTTPPathPattern("/v2/account/authenticate/device")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateDevice", runtime.WithHTTPPathPattern("/v2/account/authenticate/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6391,18 +4923,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateEmail", runtime.WithHTTPPathPattern("/v2/account/authenticate/email")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateEmail", runtime.WithHTTPPathPattern("/v2/account/authenticate/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6413,18 +4940,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebook", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebook")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebook", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6435,18 +4957,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/authenticate/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6457,18 +4974,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGameCenter", runtime.WithHTTPPathPattern("/v2/account/authenticate/gamecenter")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGameCenter", runtime.WithHTTPPathPattern("/v2/account/authenticate/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6479,18 +4991,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGoogle", runtime.WithHTTPPathPattern("/v2/account/authenticate/google")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateGoogle", runtime.WithHTTPPathPattern("/v2/account/authenticate/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6501,18 +5008,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_AuthenticateSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_AuthenticateSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateSteam", runtime.WithHTTPPathPattern("/v2/account/authenticate/steam")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/AuthenticateSteam", runtime.WithHTTPPathPattern("/v2/account/authenticate/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6523,18 +5025,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_AuthenticateSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_BanGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_BanGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/BanGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/ban")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/BanGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/ban")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6545,18 +5042,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_BanGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_BlockFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_BlockFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/BlockFriends", runtime.WithHTTPPathPattern("/v2/friend/block")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/BlockFriends", runtime.WithHTTPPathPattern("/v2/friend/block")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6567,18 +5059,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_BlockFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_CreateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_CreateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/CreateGroup", runtime.WithHTTPPathPattern("/v2/group")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/CreateGroup", runtime.WithHTTPPathPattern("/v2/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6589,18 +5076,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_CreateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteAccount", runtime.WithHTTPPathPattern("/v2/account")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteAccount", runtime.WithHTTPPathPattern("/v2/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6611,18 +5093,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteFriends", runtime.WithHTTPPathPattern("/v2/friend")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteFriends", runtime.WithHTTPPathPattern("/v2/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6633,18 +5110,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6655,18 +5127,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6677,18 +5144,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteLeaderboardRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteNotifications", runtime.WithHTTPPathPattern("/v2/notification")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteNotifications", runtime.WithHTTPPathPattern("/v2/notification")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6699,18 +5161,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteNotifications_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Nakama_DeleteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Nakama_DeleteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6721,18 +5178,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteTournamentRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_DeleteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_DeleteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/delete")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DeleteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6743,18 +5195,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DeleteStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_Event_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_Event_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/Event", runtime.WithHTTPPathPattern("/v2/event")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/Event", runtime.WithHTTPPathPattern("/v2/event")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6765,18 +5212,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_Event_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetAccount", runtime.WithHTTPPathPattern("/v2/account")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetAccount", runtime.WithHTTPPathPattern("/v2/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6787,18 +5229,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetUsers", runtime.WithHTTPPathPattern("/v2/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetUsers", runtime.WithHTTPPathPattern("/v2/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6809,18 +5246,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetSubscription", runtime.WithHTTPPathPattern("/v2/iap/subscription/{product_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetSubscription", runtime.WithHTTPPathPattern("/v2/iap/subscription/{product_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6831,18 +5263,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_GetMatchmakerStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_GetMatchmakerStats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetMatchmakerStats", runtime.WithHTTPPathPattern("/v2/matchmaker/stats")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/GetMatchmakerStats", runtime.WithHTTPPathPattern("/v2/matchmaker/stats")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6853,18 +5280,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_GetMatchmakerStats_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_Healthcheck_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_Healthcheck_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/Healthcheck", runtime.WithHTTPPathPattern("/healthcheck")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/Healthcheck", runtime.WithHTTPPathPattern("/healthcheck")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6875,18 +5297,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_Healthcheck_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ImportFacebookFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ImportFacebookFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ImportFacebookFriends", runtime.WithHTTPPathPattern("/v2/friend/facebook")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ImportFacebookFriends", runtime.WithHTTPPathPattern("/v2/friend/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6897,18 +5314,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ImportFacebookFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ImportSteamFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ImportSteamFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ImportSteamFriends", runtime.WithHTTPPathPattern("/v2/friend/steam")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ImportSteamFriends", runtime.WithHTTPPathPattern("/v2/friend/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6919,18 +5331,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ImportSteamFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_JoinGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_JoinGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/JoinGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/join")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/JoinGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/join")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6941,18 +5348,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_JoinGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_JoinTournament_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_JoinTournament_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/JoinTournament", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/join")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/JoinTournament", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/join")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6963,18 +5365,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_JoinTournament_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_KickGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_KickGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/KickGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/kick")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/KickGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/kick")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6985,18 +5382,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_KickGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LeaveGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LeaveGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LeaveGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/leave")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LeaveGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}/leave")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7007,18 +5399,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LeaveGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkApple", runtime.WithHTTPPathPattern("/v2/account/link/apple")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkApple", runtime.WithHTTPPathPattern("/v2/account/link/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7029,18 +5416,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkCustom", runtime.WithHTTPPathPattern("/v2/account/link/custom")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkCustom", runtime.WithHTTPPathPattern("/v2/account/link/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7051,18 +5433,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkDevice", runtime.WithHTTPPathPattern("/v2/account/link/device")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkDevice", runtime.WithHTTPPathPattern("/v2/account/link/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7073,18 +5450,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkEmail", runtime.WithHTTPPathPattern("/v2/account/link/email")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkEmail", runtime.WithHTTPPathPattern("/v2/account/link/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7095,18 +5467,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebook", runtime.WithHTTPPathPattern("/v2/account/link/facebook")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebook", runtime.WithHTTPPathPattern("/v2/account/link/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7117,18 +5484,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/link/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/link/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7139,18 +5501,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/link/gamecenter")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/link/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7161,18 +5518,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkGoogle", runtime.WithHTTPPathPattern("/v2/account/link/google")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkGoogle", runtime.WithHTTPPathPattern("/v2/account/link/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7183,18 +5535,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_LinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_LinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkSteam", runtime.WithHTTPPathPattern("/v2/account/link/steam")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/LinkSteam", runtime.WithHTTPPathPattern("/v2/account/link/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7205,18 +5552,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_LinkSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/channel/{channel_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/channel/{channel_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7227,18 +5569,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListChannelMessages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListFriends", runtime.WithHTTPPathPattern("/v2/friend")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListFriends", runtime.WithHTTPPathPattern("/v2/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7249,18 +5586,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListFriendsOfFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListFriendsOfFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListFriendsOfFriends", runtime.WithHTTPPathPattern("/v2/friend/friends")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListFriendsOfFriends", runtime.WithHTTPPathPattern("/v2/friend/friends")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7271,18 +5603,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListFriendsOfFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListGroups", runtime.WithHTTPPathPattern("/v2/group")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListGroups", runtime.WithHTTPPathPattern("/v2/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7293,18 +5620,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7315,18 +5637,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7337,18 +5654,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListLeaderboardRecords_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListLeaderboardRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListLeaderboardRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}/owner/{owner_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListLeaderboardRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}/owner/{owner_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7359,18 +5671,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListLeaderboardRecordsAroundOwner_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListMatches", runtime.WithHTTPPathPattern("/v2/match")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListMatches", runtime.WithHTTPPathPattern("/v2/match")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7381,18 +5688,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListMatches_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListNotifications", runtime.WithHTTPPathPattern("/v2/notification")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListNotifications", runtime.WithHTTPPathPattern("/v2/notification")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7403,18 +5705,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListNotifications_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7425,18 +5722,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListStorageObjects_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListStorageObjects_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}/{user_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListStorageObjects", runtime.WithHTTPPathPattern("/v2/storage/{collection}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7447,18 +5739,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListStorageObjects_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/iap/subscription")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/iap/subscription")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7469,18 +5756,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListSubscriptions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListTournaments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListTournaments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListTournaments", runtime.WithHTTPPathPattern("/v2/tournament")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListTournaments", runtime.WithHTTPPathPattern("/v2/tournament")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7491,18 +5773,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListTournaments_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListTournamentRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListTournamentRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecords", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecords", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7513,18 +5790,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListTournamentRecords_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListTournamentRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListTournamentRecordsAroundOwner_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/owner/{owner_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListTournamentRecordsAroundOwner", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}/owner/{owner_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7535,18 +5807,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListTournamentRecordsAroundOwner_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_ListUserGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_ListUserGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListUserGroups", runtime.WithHTTPPathPattern("/v2/user/{user_id}/group")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ListUserGroups", runtime.WithHTTPPathPattern("/v2/user/{user_id}/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7557,18 +5824,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ListUserGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_PromoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_PromoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/PromoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/promote")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/PromoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/promote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7579,18 +5841,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_PromoteGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_DemoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_DemoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DemoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/demote")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/DemoteGroupUsers", runtime.WithHTTPPathPattern("/v2/group/{group_id}/demote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7601,18 +5858,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_DemoteGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ReadStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ReadStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ReadStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ReadStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7623,18 +5875,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ReadStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_RpcFunc_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_RpcFunc_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7645,18 +5892,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_RpcFunc_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Nakama_RpcFunc_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Nakama_RpcFunc_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/RpcFunc", runtime.WithHTTPPathPattern("/v2/rpc/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7667,18 +5909,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_RpcFunc_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkApple", runtime.WithHTTPPathPattern("/v2/account/unlink/apple")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkApple", runtime.WithHTTPPathPattern("/v2/account/unlink/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7689,18 +5926,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/account/unlink/custom")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/account/unlink/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7711,18 +5943,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/account/unlink/device")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/account/unlink/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7733,18 +5960,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/account/unlink/email")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/account/unlink/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7755,18 +5977,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/account/unlink/facebook")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/account/unlink/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7777,18 +5994,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/unlink/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/account/unlink/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7799,18 +6011,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/unlink/gamecenter")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/account/unlink/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7821,18 +6028,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/account/unlink/google")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/account/unlink/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7843,18 +6045,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/account/unlink/steam")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/account/unlink/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7865,18 +6062,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UnlinkSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UpdateAccount", runtime.WithHTTPPathPattern("/v2/account")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UpdateAccount", runtime.WithHTTPPathPattern("/v2/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7887,18 +6079,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UpdateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UpdateGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/UpdateGroup", runtime.WithHTTPPathPattern("/v2/group/{group_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7909,18 +6096,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseApple", runtime.WithHTTPPathPattern("/v2/iap/purchase/apple")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseApple", runtime.WithHTTPPathPattern("/v2/iap/purchase/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7931,18 +6113,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidateSubscriptionApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidateSubscriptionApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionApple", runtime.WithHTTPPathPattern("/v2/iap/subscription/apple")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionApple", runtime.WithHTTPPathPattern("/v2/iap/subscription/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7953,18 +6130,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidateSubscriptionApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseGoogle", runtime.WithHTTPPathPattern("/v2/iap/purchase/google")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseGoogle", runtime.WithHTTPPathPattern("/v2/iap/purchase/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7975,18 +6147,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidateSubscriptionGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidateSubscriptionGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionGoogle", runtime.WithHTTPPathPattern("/v2/iap/subscription/google")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidateSubscriptionGoogle", runtime.WithHTTPPathPattern("/v2/iap/subscription/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -7997,18 +6164,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidateSubscriptionGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseHuawei_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseHuawei_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseHuawei", runtime.WithHTTPPathPattern("/v2/iap/purchase/huawei")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseHuawei", runtime.WithHTTPPathPattern("/v2/iap/purchase/huawei")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -8019,18 +6181,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseHuawei_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -8041,18 +6198,30 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseXbox_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseXbox", runtime.WithHTTPPathPattern("/v2/iap/purchase/xbox")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Nakama_ValidatePurchaseXbox_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Nakama_ValidatePurchaseXbox_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + mux.Handle(http.MethodPost, pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/leaderboard/{leaderboard_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -8063,18 +6232,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteLeaderboardRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_WriteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_WriteStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteStorageObjects", runtime.WithHTTPPathPattern("/v2/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -8085,18 +6249,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteStorageObjects_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Nakama_WriteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Nakama_WriteTournamentRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -8107,18 +6266,13 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteTournamentRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Nakama_WriteTournamentRecord_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_WriteTournamentRecord_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/WriteTournamentRecord", runtime.WithHTTPPathPattern("/v2/tournament/{tournament_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -8129,358 +6283,187 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Nakama_WriteTournamentRecord_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_Nakama_AddFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "friend"}, "")) - - pattern_Nakama_AddGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "add"}, "")) - - pattern_Nakama_SessionRefresh_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "session", "refresh"}, "")) - - pattern_Nakama_SessionLogout_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "session", "logout"}, "")) - - pattern_Nakama_AuthenticateApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "apple"}, "")) - - pattern_Nakama_AuthenticateCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "custom"}, "")) - - pattern_Nakama_AuthenticateDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "device"}, "")) - - pattern_Nakama_AuthenticateEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "email"}, "")) - - pattern_Nakama_AuthenticateFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "facebook"}, "")) - - pattern_Nakama_AuthenticateFacebookInstantGame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "facebookinstantgame"}, "")) - - pattern_Nakama_AuthenticateGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "gamecenter"}, "")) - - pattern_Nakama_AuthenticateGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "google"}, "")) - - pattern_Nakama_AuthenticateSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "steam"}, "")) - - pattern_Nakama_BanGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "ban"}, "")) - - pattern_Nakama_BlockFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "block"}, "")) - - pattern_Nakama_CreateGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "group"}, "")) - - pattern_Nakama_DeleteAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "account"}, "")) - - pattern_Nakama_DeleteFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "friend"}, "")) - - pattern_Nakama_DeleteGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "group", "group_id"}, "")) - - pattern_Nakama_DeleteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) - - pattern_Nakama_DeleteNotifications_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "notification"}, "")) - - pattern_Nakama_DeleteTournamentRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) - - pattern_Nakama_DeleteStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "storage", "delete"}, "")) - - pattern_Nakama_Event_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "event"}, "")) - - pattern_Nakama_GetAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "account"}, "")) - - pattern_Nakama_GetUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "user"}, "")) - - pattern_Nakama_GetSubscription_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "iap", "subscription", "product_id"}, "")) - - pattern_Nakama_GetMatchmakerStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "matchmaker", "stats"}, "")) - - pattern_Nakama_Healthcheck_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"healthcheck"}, "")) - - pattern_Nakama_ImportFacebookFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "facebook"}, "")) - - pattern_Nakama_ImportSteamFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "steam"}, "")) - - pattern_Nakama_JoinGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "join"}, "")) - - pattern_Nakama_JoinTournament_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "tournament", "tournament_id", "join"}, "")) - - pattern_Nakama_KickGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "kick"}, "")) - - pattern_Nakama_LeaveGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "leave"}, "")) - - pattern_Nakama_LinkApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "apple"}, "")) - - pattern_Nakama_LinkCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "custom"}, "")) - - pattern_Nakama_LinkDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "device"}, "")) - - pattern_Nakama_LinkEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "email"}, "")) - - pattern_Nakama_LinkFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "facebook"}, "")) - - pattern_Nakama_LinkFacebookInstantGame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "facebookinstantgame"}, "")) - - pattern_Nakama_LinkGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "gamecenter"}, "")) - - pattern_Nakama_LinkGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "google"}, "")) - - pattern_Nakama_LinkSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "steam"}, "")) - - pattern_Nakama_ListChannelMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "channel", "channel_id"}, "")) - - pattern_Nakama_ListFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "friend"}, "")) - - pattern_Nakama_ListFriendsOfFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "friends"}, "")) - - pattern_Nakama_ListGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "group"}, "")) - - pattern_Nakama_ListGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "user"}, "")) - - pattern_Nakama_ListLeaderboardRecords_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) - + pattern_Nakama_AddFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "friend"}, "")) + pattern_Nakama_AddGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "add"}, "")) + pattern_Nakama_SessionRefresh_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "session", "refresh"}, "")) + pattern_Nakama_SessionLogout_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "session", "logout"}, "")) + pattern_Nakama_AuthenticateApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "apple"}, "")) + pattern_Nakama_AuthenticateCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "custom"}, "")) + pattern_Nakama_AuthenticateDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "device"}, "")) + pattern_Nakama_AuthenticateEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "email"}, "")) + pattern_Nakama_AuthenticateFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "facebook"}, "")) + pattern_Nakama_AuthenticateFacebookInstantGame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "facebookinstantgame"}, "")) + pattern_Nakama_AuthenticateGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "gamecenter"}, "")) + pattern_Nakama_AuthenticateGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "google"}, "")) + pattern_Nakama_AuthenticateSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "authenticate", "steam"}, "")) + pattern_Nakama_BanGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "ban"}, "")) + pattern_Nakama_BlockFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "block"}, "")) + pattern_Nakama_CreateGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "group"}, "")) + pattern_Nakama_DeleteAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "account"}, "")) + pattern_Nakama_DeleteFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "friend"}, "")) + pattern_Nakama_DeleteGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "group", "group_id"}, "")) + pattern_Nakama_DeleteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) + pattern_Nakama_DeleteNotifications_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "notification"}, "")) + pattern_Nakama_DeleteTournamentRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) + pattern_Nakama_DeleteStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "storage", "delete"}, "")) + pattern_Nakama_Event_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "event"}, "")) + pattern_Nakama_GetAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "account"}, "")) + pattern_Nakama_GetUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "user"}, "")) + pattern_Nakama_GetSubscription_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "iap", "subscription", "product_id"}, "")) + pattern_Nakama_GetMatchmakerStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "matchmaker", "stats"}, "")) + pattern_Nakama_Healthcheck_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"healthcheck"}, "")) + pattern_Nakama_ImportFacebookFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "facebook"}, "")) + pattern_Nakama_ImportSteamFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "steam"}, "")) + pattern_Nakama_JoinGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "join"}, "")) + pattern_Nakama_JoinTournament_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "tournament", "tournament_id", "join"}, "")) + pattern_Nakama_KickGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "kick"}, "")) + pattern_Nakama_LeaveGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "leave"}, "")) + pattern_Nakama_LinkApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "apple"}, "")) + pattern_Nakama_LinkCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "custom"}, "")) + pattern_Nakama_LinkDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "device"}, "")) + pattern_Nakama_LinkEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "email"}, "")) + pattern_Nakama_LinkFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "facebook"}, "")) + pattern_Nakama_LinkFacebookInstantGame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "facebookinstantgame"}, "")) + pattern_Nakama_LinkGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "gamecenter"}, "")) + pattern_Nakama_LinkGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "google"}, "")) + pattern_Nakama_LinkSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "link", "steam"}, "")) + pattern_Nakama_ListChannelMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "channel", "channel_id"}, "")) + pattern_Nakama_ListFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "friend"}, "")) + pattern_Nakama_ListFriendsOfFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "friend", "friends"}, "")) + pattern_Nakama_ListGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "group"}, "")) + pattern_Nakama_ListGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "user"}, "")) + pattern_Nakama_ListLeaderboardRecords_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) pattern_Nakama_ListLeaderboardRecordsAroundOwner_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "leaderboard", "leaderboard_id", "owner", "owner_id"}, "")) - - pattern_Nakama_ListMatches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "match"}, "")) - - pattern_Nakama_ListNotifications_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "notification"}, "")) - - pattern_Nakama_ListStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "storage", "collection"}, "")) - - pattern_Nakama_ListStorageObjects_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "storage", "collection", "user_id"}, "")) - - pattern_Nakama_ListSubscriptions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "iap", "subscription"}, "")) - - pattern_Nakama_ListTournaments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "tournament"}, "")) - - pattern_Nakama_ListTournamentRecords_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) - - pattern_Nakama_ListTournamentRecordsAroundOwner_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "tournament", "tournament_id", "owner", "owner_id"}, "")) - - pattern_Nakama_ListUserGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "user", "user_id", "group"}, "")) - - pattern_Nakama_PromoteGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "promote"}, "")) - - pattern_Nakama_DemoteGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "demote"}, "")) - - pattern_Nakama_ReadStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, "")) - - pattern_Nakama_RpcFunc_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "rpc", "id"}, "")) - - pattern_Nakama_RpcFunc_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "rpc", "id"}, "")) - - pattern_Nakama_UnlinkApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "apple"}, "")) - - pattern_Nakama_UnlinkCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "custom"}, "")) - - pattern_Nakama_UnlinkDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "device"}, "")) - - pattern_Nakama_UnlinkEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "email"}, "")) - - pattern_Nakama_UnlinkFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "facebook"}, "")) - - pattern_Nakama_UnlinkFacebookInstantGame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "facebookinstantgame"}, "")) - - pattern_Nakama_UnlinkGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "gamecenter"}, "")) - - pattern_Nakama_UnlinkGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "google"}, "")) - - pattern_Nakama_UnlinkSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "steam"}, "")) - - pattern_Nakama_UpdateAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "account"}, "")) - - pattern_Nakama_UpdateGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "group", "group_id"}, "")) - - pattern_Nakama_ValidatePurchaseApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "apple"}, "")) - - pattern_Nakama_ValidateSubscriptionApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "subscription", "apple"}, "")) - - pattern_Nakama_ValidatePurchaseGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "google"}, "")) - - pattern_Nakama_ValidateSubscriptionGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "subscription", "google"}, "")) - - pattern_Nakama_ValidatePurchaseHuawei_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "huawei"}, "")) - - pattern_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "facebookinstant"}, "")) - - pattern_Nakama_WriteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) - - pattern_Nakama_WriteStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, "")) - - pattern_Nakama_WriteTournamentRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) - - pattern_Nakama_WriteTournamentRecord_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) + pattern_Nakama_ListMatches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "match"}, "")) + pattern_Nakama_ListNotifications_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "notification"}, "")) + pattern_Nakama_ListStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "storage", "collection"}, "")) + pattern_Nakama_ListStorageObjects_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "storage", "collection", "user_id"}, "")) + pattern_Nakama_ListSubscriptions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "iap", "subscription"}, "")) + pattern_Nakama_ListTournaments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "tournament"}, "")) + pattern_Nakama_ListTournamentRecords_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) + pattern_Nakama_ListTournamentRecordsAroundOwner_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "tournament", "tournament_id", "owner", "owner_id"}, "")) + pattern_Nakama_ListUserGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "user", "user_id", "group"}, "")) + pattern_Nakama_PromoteGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "promote"}, "")) + pattern_Nakama_DemoteGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "demote"}, "")) + pattern_Nakama_ReadStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, "")) + pattern_Nakama_RpcFunc_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "rpc", "id"}, "")) + pattern_Nakama_RpcFunc_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "rpc", "id"}, "")) + pattern_Nakama_UnlinkApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "apple"}, "")) + pattern_Nakama_UnlinkCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "custom"}, "")) + pattern_Nakama_UnlinkDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "device"}, "")) + pattern_Nakama_UnlinkEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "email"}, "")) + pattern_Nakama_UnlinkFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "facebook"}, "")) + pattern_Nakama_UnlinkFacebookInstantGame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "facebookinstantgame"}, "")) + pattern_Nakama_UnlinkGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "gamecenter"}, "")) + pattern_Nakama_UnlinkGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "google"}, "")) + pattern_Nakama_UnlinkSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "steam"}, "")) + pattern_Nakama_UpdateAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "account"}, "")) + pattern_Nakama_UpdateGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "group", "group_id"}, "")) + pattern_Nakama_ValidatePurchaseApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "apple"}, "")) + pattern_Nakama_ValidateSubscriptionApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "subscription", "apple"}, "")) + pattern_Nakama_ValidatePurchaseGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "google"}, "")) + pattern_Nakama_ValidateSubscriptionGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "subscription", "google"}, "")) + pattern_Nakama_ValidatePurchaseHuawei_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "huawei"}, "")) + pattern_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "facebookinstant"}, "")) + pattern_Nakama_ValidatePurchaseXbox_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "xbox"}, "")) + pattern_Nakama_WriteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) + pattern_Nakama_WriteStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, "")) + pattern_Nakama_WriteTournamentRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) + pattern_Nakama_WriteTournamentRecord_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) ) var ( - forward_Nakama_AddFriends_0 = runtime.ForwardResponseMessage - - forward_Nakama_AddGroupUsers_0 = runtime.ForwardResponseMessage - - forward_Nakama_SessionRefresh_0 = runtime.ForwardResponseMessage - - forward_Nakama_SessionLogout_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateApple_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateCustom_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateDevice_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateEmail_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateFacebook_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateFacebookInstantGame_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateGameCenter_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateGoogle_0 = runtime.ForwardResponseMessage - - forward_Nakama_AuthenticateSteam_0 = runtime.ForwardResponseMessage - - forward_Nakama_BanGroupUsers_0 = runtime.ForwardResponseMessage - - forward_Nakama_BlockFriends_0 = runtime.ForwardResponseMessage - - forward_Nakama_CreateGroup_0 = runtime.ForwardResponseMessage - - forward_Nakama_DeleteAccount_0 = runtime.ForwardResponseMessage - - forward_Nakama_DeleteFriends_0 = runtime.ForwardResponseMessage - - forward_Nakama_DeleteGroup_0 = runtime.ForwardResponseMessage - - forward_Nakama_DeleteLeaderboardRecord_0 = runtime.ForwardResponseMessage - - forward_Nakama_DeleteNotifications_0 = runtime.ForwardResponseMessage - - forward_Nakama_DeleteTournamentRecord_0 = runtime.ForwardResponseMessage - - forward_Nakama_DeleteStorageObjects_0 = runtime.ForwardResponseMessage - - forward_Nakama_Event_0 = runtime.ForwardResponseMessage - - forward_Nakama_GetAccount_0 = runtime.ForwardResponseMessage - - forward_Nakama_GetUsers_0 = runtime.ForwardResponseMessage - - forward_Nakama_GetSubscription_0 = runtime.ForwardResponseMessage - - forward_Nakama_GetMatchmakerStats_0 = runtime.ForwardResponseMessage - - forward_Nakama_Healthcheck_0 = runtime.ForwardResponseMessage - - forward_Nakama_ImportFacebookFriends_0 = runtime.ForwardResponseMessage - - forward_Nakama_ImportSteamFriends_0 = runtime.ForwardResponseMessage - - forward_Nakama_JoinGroup_0 = runtime.ForwardResponseMessage - - forward_Nakama_JoinTournament_0 = runtime.ForwardResponseMessage - - forward_Nakama_KickGroupUsers_0 = runtime.ForwardResponseMessage - - forward_Nakama_LeaveGroup_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkApple_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkCustom_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkDevice_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkEmail_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkFacebook_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkFacebookInstantGame_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkGameCenter_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkGoogle_0 = runtime.ForwardResponseMessage - - forward_Nakama_LinkSteam_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListChannelMessages_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListFriends_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListFriendsOfFriends_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListGroups_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListGroupUsers_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListLeaderboardRecords_0 = runtime.ForwardResponseMessage - + forward_Nakama_AddFriends_0 = runtime.ForwardResponseMessage + forward_Nakama_AddGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_SessionRefresh_0 = runtime.ForwardResponseMessage + forward_Nakama_SessionLogout_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateApple_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateCustom_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateDevice_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateEmail_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateFacebook_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateFacebookInstantGame_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateGameCenter_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateGoogle_0 = runtime.ForwardResponseMessage + forward_Nakama_AuthenticateSteam_0 = runtime.ForwardResponseMessage + forward_Nakama_BanGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_BlockFriends_0 = runtime.ForwardResponseMessage + forward_Nakama_CreateGroup_0 = runtime.ForwardResponseMessage + forward_Nakama_DeleteAccount_0 = runtime.ForwardResponseMessage + forward_Nakama_DeleteFriends_0 = runtime.ForwardResponseMessage + forward_Nakama_DeleteGroup_0 = runtime.ForwardResponseMessage + forward_Nakama_DeleteLeaderboardRecord_0 = runtime.ForwardResponseMessage + forward_Nakama_DeleteNotifications_0 = runtime.ForwardResponseMessage + forward_Nakama_DeleteTournamentRecord_0 = runtime.ForwardResponseMessage + forward_Nakama_DeleteStorageObjects_0 = runtime.ForwardResponseMessage + forward_Nakama_Event_0 = runtime.ForwardResponseMessage + forward_Nakama_GetAccount_0 = runtime.ForwardResponseMessage + forward_Nakama_GetUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_GetSubscription_0 = runtime.ForwardResponseMessage + forward_Nakama_GetMatchmakerStats_0 = runtime.ForwardResponseMessage + forward_Nakama_Healthcheck_0 = runtime.ForwardResponseMessage + forward_Nakama_ImportFacebookFriends_0 = runtime.ForwardResponseMessage + forward_Nakama_ImportSteamFriends_0 = runtime.ForwardResponseMessage + forward_Nakama_JoinGroup_0 = runtime.ForwardResponseMessage + forward_Nakama_JoinTournament_0 = runtime.ForwardResponseMessage + forward_Nakama_KickGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_LeaveGroup_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkApple_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkCustom_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkDevice_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkEmail_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkFacebook_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkFacebookInstantGame_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkGameCenter_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkGoogle_0 = runtime.ForwardResponseMessage + forward_Nakama_LinkSteam_0 = runtime.ForwardResponseMessage + forward_Nakama_ListChannelMessages_0 = runtime.ForwardResponseMessage + forward_Nakama_ListFriends_0 = runtime.ForwardResponseMessage + forward_Nakama_ListFriendsOfFriends_0 = runtime.ForwardResponseMessage + forward_Nakama_ListGroups_0 = runtime.ForwardResponseMessage + forward_Nakama_ListGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_ListLeaderboardRecords_0 = runtime.ForwardResponseMessage forward_Nakama_ListLeaderboardRecordsAroundOwner_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListMatches_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListNotifications_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListStorageObjects_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListStorageObjects_1 = runtime.ForwardResponseMessage - - forward_Nakama_ListSubscriptions_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListTournaments_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListTournamentRecords_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListTournamentRecordsAroundOwner_0 = runtime.ForwardResponseMessage - - forward_Nakama_ListUserGroups_0 = runtime.ForwardResponseMessage - - forward_Nakama_PromoteGroupUsers_0 = runtime.ForwardResponseMessage - - forward_Nakama_DemoteGroupUsers_0 = runtime.ForwardResponseMessage - - forward_Nakama_ReadStorageObjects_0 = runtime.ForwardResponseMessage - - forward_Nakama_RpcFunc_0 = runtime.ForwardResponseMessage - - forward_Nakama_RpcFunc_1 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkApple_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkCustom_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkDevice_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkEmail_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkFacebook_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkFacebookInstantGame_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkGameCenter_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkGoogle_0 = runtime.ForwardResponseMessage - - forward_Nakama_UnlinkSteam_0 = runtime.ForwardResponseMessage - - forward_Nakama_UpdateAccount_0 = runtime.ForwardResponseMessage - - forward_Nakama_UpdateGroup_0 = runtime.ForwardResponseMessage - - forward_Nakama_ValidatePurchaseApple_0 = runtime.ForwardResponseMessage - - forward_Nakama_ValidateSubscriptionApple_0 = runtime.ForwardResponseMessage - - forward_Nakama_ValidatePurchaseGoogle_0 = runtime.ForwardResponseMessage - - forward_Nakama_ValidateSubscriptionGoogle_0 = runtime.ForwardResponseMessage - - forward_Nakama_ValidatePurchaseHuawei_0 = runtime.ForwardResponseMessage - - forward_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.ForwardResponseMessage - - forward_Nakama_WriteLeaderboardRecord_0 = runtime.ForwardResponseMessage - - forward_Nakama_WriteStorageObjects_0 = runtime.ForwardResponseMessage - - forward_Nakama_WriteTournamentRecord_0 = runtime.ForwardResponseMessage - - forward_Nakama_WriteTournamentRecord_1 = runtime.ForwardResponseMessage + forward_Nakama_ListMatches_0 = runtime.ForwardResponseMessage + forward_Nakama_ListNotifications_0 = runtime.ForwardResponseMessage + forward_Nakama_ListStorageObjects_0 = runtime.ForwardResponseMessage + forward_Nakama_ListStorageObjects_1 = runtime.ForwardResponseMessage + forward_Nakama_ListSubscriptions_0 = runtime.ForwardResponseMessage + forward_Nakama_ListTournaments_0 = runtime.ForwardResponseMessage + forward_Nakama_ListTournamentRecords_0 = runtime.ForwardResponseMessage + forward_Nakama_ListTournamentRecordsAroundOwner_0 = runtime.ForwardResponseMessage + forward_Nakama_ListUserGroups_0 = runtime.ForwardResponseMessage + forward_Nakama_PromoteGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_DemoteGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_ReadStorageObjects_0 = runtime.ForwardResponseMessage + forward_Nakama_RpcFunc_0 = runtime.ForwardResponseMessage + forward_Nakama_RpcFunc_1 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkApple_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkCustom_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkDevice_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkEmail_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkFacebook_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkFacebookInstantGame_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkGameCenter_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkGoogle_0 = runtime.ForwardResponseMessage + forward_Nakama_UnlinkSteam_0 = runtime.ForwardResponseMessage + forward_Nakama_UpdateAccount_0 = runtime.ForwardResponseMessage + forward_Nakama_UpdateGroup_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidatePurchaseApple_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidateSubscriptionApple_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidatePurchaseGoogle_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidateSubscriptionGoogle_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidatePurchaseHuawei_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidatePurchaseXbox_0 = runtime.ForwardResponseMessage + forward_Nakama_WriteLeaderboardRecord_0 = runtime.ForwardResponseMessage + forward_Nakama_WriteStorageObjects_0 = runtime.ForwardResponseMessage + forward_Nakama_WriteTournamentRecord_0 = runtime.ForwardResponseMessage + forward_Nakama_WriteTournamentRecord_1 = runtime.ForwardResponseMessage ) diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index be35a98e67..e4de935d80 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -1374,7 +1374,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/apiEvent" + "$ref": "#/definitions/nakamaapiEvent" } } ], @@ -1866,30 +1866,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name." - }, - "description": { - "type": "string", - "description": "Description string." - }, - "langTag": { - "type": "string", - "description": "Lang tag." - }, - "avatarUrl": { - "type": "string", - "description": "Avatar URL." - }, - "open": { - "type": "boolean", - "description": "Open is true if anyone should be allowed to join, or false if joins must be approved by a group admin." - } - }, - "description": "Update fields in a given group." + "$ref": "#/definitions/NakamaUpdateGroupBody" } } ], @@ -3736,6 +3713,32 @@ }, "description": "A single user-role pair." }, + "NakamaUpdateGroupBody": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name." + }, + "description": { + "type": "string", + "description": "Description string." + }, + "langTag": { + "type": "string", + "description": "Lang tag." + }, + "avatarUrl": { + "type": "string", + "description": "Avatar URL." + }, + "open": { + "type": "boolean", + "description": "Open is true if anyone should be allowed to join, or false if joins must be approved by a group admin." + } + }, + "description": "Update fields in a given group." + }, "UserGroupListUserGroup": { "type": "object", "properties": { @@ -4167,32 +4170,6 @@ }, "description": "Batch delete storage objects." }, - "apiEvent": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "An event name, type, category, or identifier." - }, - "properties": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Arbitrary event property values." - }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "The time when the event was triggered." - }, - "external": { - "type": "boolean", - "description": "True if the event came directly from a client call, false otherwise." - } - }, - "description": "Represents an event to be passed through the server to registered event handlers." - }, "apiFriend": { "type": "object", "properties": { @@ -5469,6 +5446,32 @@ }, "description": "Write objects to the storage engine." }, + "nakamaapiEvent": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "An event name, type, category, or identifier." + }, + "properties": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Arbitrary event property values." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "The time when the event was triggered." + }, + "external": { + "type": "boolean", + "description": "True if the event came directly from a client call, false otherwise." + } + }, + "description": "Represents an event to be passed through the server to registered event handlers." + }, "protobufAny": { "type": "object", "properties": { diff --git a/apigrpc/apigrpc_grpc.pb.go b/apigrpc/apigrpc_grpc.pb.go index 147a78635a..5eb15807b1 100644 --- a/apigrpc/apigrpc_grpc.pb.go +++ b/apigrpc/apigrpc_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v5.29.3 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v4.24.3 // source: apigrpc.proto package apigrpc @@ -34,8 +34,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Nakama_AddFriends_FullMethodName = "/nakama.api.Nakama/AddFriends" @@ -127,6 +127,9 @@ const ( // NakamaClient is the client API for Nakama service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// * +// The Nakama RPC protocol service built with GRPC. type NakamaClient interface { // Add friends by ID or username to a user's account. AddFriends(ctx context.Context, in *api.AddFriendsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) @@ -307,8 +310,9 @@ func NewNakamaClient(cc grpc.ClientConnInterface) NakamaClient { } func (c *nakamaClient) AddFriends(ctx context.Context, in *api.AddFriendsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_AddFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AddFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -316,8 +320,9 @@ func (c *nakamaClient) AddFriends(ctx context.Context, in *api.AddFriendsRequest } func (c *nakamaClient) AddGroupUsers(ctx context.Context, in *api.AddGroupUsersRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_AddGroupUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AddGroupUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -325,8 +330,9 @@ func (c *nakamaClient) AddGroupUsers(ctx context.Context, in *api.AddGroupUsersR } func (c *nakamaClient) SessionRefresh(ctx context.Context, in *api.SessionRefreshRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_SessionRefresh_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_SessionRefresh_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -334,8 +340,9 @@ func (c *nakamaClient) SessionRefresh(ctx context.Context, in *api.SessionRefres } func (c *nakamaClient) SessionLogout(ctx context.Context, in *api.SessionLogoutRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_SessionLogout_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_SessionLogout_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -343,8 +350,9 @@ func (c *nakamaClient) SessionLogout(ctx context.Context, in *api.SessionLogoutR } func (c *nakamaClient) AuthenticateApple(ctx context.Context, in *api.AuthenticateAppleRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateApple_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateApple_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -352,8 +360,9 @@ func (c *nakamaClient) AuthenticateApple(ctx context.Context, in *api.Authentica } func (c *nakamaClient) AuthenticateCustom(ctx context.Context, in *api.AuthenticateCustomRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateCustom_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateCustom_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -361,8 +370,9 @@ func (c *nakamaClient) AuthenticateCustom(ctx context.Context, in *api.Authentic } func (c *nakamaClient) AuthenticateDevice(ctx context.Context, in *api.AuthenticateDeviceRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateDevice_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateDevice_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -370,8 +380,9 @@ func (c *nakamaClient) AuthenticateDevice(ctx context.Context, in *api.Authentic } func (c *nakamaClient) AuthenticateEmail(ctx context.Context, in *api.AuthenticateEmailRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateEmail_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -379,8 +390,9 @@ func (c *nakamaClient) AuthenticateEmail(ctx context.Context, in *api.Authentica } func (c *nakamaClient) AuthenticateFacebook(ctx context.Context, in *api.AuthenticateFacebookRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateFacebook_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateFacebook_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -388,8 +400,9 @@ func (c *nakamaClient) AuthenticateFacebook(ctx context.Context, in *api.Authent } func (c *nakamaClient) AuthenticateFacebookInstantGame(ctx context.Context, in *api.AuthenticateFacebookInstantGameRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateFacebookInstantGame_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateFacebookInstantGame_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -397,8 +410,9 @@ func (c *nakamaClient) AuthenticateFacebookInstantGame(ctx context.Context, in * } func (c *nakamaClient) AuthenticateGameCenter(ctx context.Context, in *api.AuthenticateGameCenterRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateGameCenter_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateGameCenter_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -406,8 +420,9 @@ func (c *nakamaClient) AuthenticateGameCenter(ctx context.Context, in *api.Authe } func (c *nakamaClient) AuthenticateGoogle(ctx context.Context, in *api.AuthenticateGoogleRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateGoogle_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateGoogle_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -415,8 +430,9 @@ func (c *nakamaClient) AuthenticateGoogle(ctx context.Context, in *api.Authentic } func (c *nakamaClient) AuthenticateSteam(ctx context.Context, in *api.AuthenticateSteamRequest, opts ...grpc.CallOption) (*api.Session, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Session) - err := c.cc.Invoke(ctx, Nakama_AuthenticateSteam_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_AuthenticateSteam_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -424,8 +440,9 @@ func (c *nakamaClient) AuthenticateSteam(ctx context.Context, in *api.Authentica } func (c *nakamaClient) BanGroupUsers(ctx context.Context, in *api.BanGroupUsersRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_BanGroupUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_BanGroupUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -433,8 +450,9 @@ func (c *nakamaClient) BanGroupUsers(ctx context.Context, in *api.BanGroupUsersR } func (c *nakamaClient) BlockFriends(ctx context.Context, in *api.BlockFriendsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_BlockFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_BlockFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -442,8 +460,9 @@ func (c *nakamaClient) BlockFriends(ctx context.Context, in *api.BlockFriendsReq } func (c *nakamaClient) CreateGroup(ctx context.Context, in *api.CreateGroupRequest, opts ...grpc.CallOption) (*api.Group, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Group) - err := c.cc.Invoke(ctx, Nakama_CreateGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_CreateGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -451,8 +470,9 @@ func (c *nakamaClient) CreateGroup(ctx context.Context, in *api.CreateGroupReque } func (c *nakamaClient) DeleteAccount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DeleteAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DeleteAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -460,8 +480,9 @@ func (c *nakamaClient) DeleteAccount(ctx context.Context, in *emptypb.Empty, opt } func (c *nakamaClient) DeleteFriends(ctx context.Context, in *api.DeleteFriendsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DeleteFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DeleteFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -469,8 +490,9 @@ func (c *nakamaClient) DeleteFriends(ctx context.Context, in *api.DeleteFriendsR } func (c *nakamaClient) DeleteGroup(ctx context.Context, in *api.DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DeleteGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DeleteGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -478,8 +500,9 @@ func (c *nakamaClient) DeleteGroup(ctx context.Context, in *api.DeleteGroupReque } func (c *nakamaClient) DeleteLeaderboardRecord(ctx context.Context, in *api.DeleteLeaderboardRecordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DeleteLeaderboardRecord_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DeleteLeaderboardRecord_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -487,8 +510,9 @@ func (c *nakamaClient) DeleteLeaderboardRecord(ctx context.Context, in *api.Dele } func (c *nakamaClient) DeleteNotifications(ctx context.Context, in *api.DeleteNotificationsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DeleteNotifications_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DeleteNotifications_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -496,8 +520,9 @@ func (c *nakamaClient) DeleteNotifications(ctx context.Context, in *api.DeleteNo } func (c *nakamaClient) DeleteTournamentRecord(ctx context.Context, in *api.DeleteTournamentRecordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DeleteTournamentRecord_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DeleteTournamentRecord_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -505,8 +530,9 @@ func (c *nakamaClient) DeleteTournamentRecord(ctx context.Context, in *api.Delet } func (c *nakamaClient) DeleteStorageObjects(ctx context.Context, in *api.DeleteStorageObjectsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DeleteStorageObjects_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DeleteStorageObjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -514,8 +540,9 @@ func (c *nakamaClient) DeleteStorageObjects(ctx context.Context, in *api.DeleteS } func (c *nakamaClient) Event(ctx context.Context, in *api.Event, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_Event_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_Event_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -523,8 +550,9 @@ func (c *nakamaClient) Event(ctx context.Context, in *api.Event, opts ...grpc.Ca } func (c *nakamaClient) GetAccount(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*api.Account, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Account) - err := c.cc.Invoke(ctx, Nakama_GetAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_GetAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -532,8 +560,9 @@ func (c *nakamaClient) GetAccount(ctx context.Context, in *emptypb.Empty, opts . } func (c *nakamaClient) GetUsers(ctx context.Context, in *api.GetUsersRequest, opts ...grpc.CallOption) (*api.Users, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Users) - err := c.cc.Invoke(ctx, Nakama_GetUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_GetUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -541,8 +570,9 @@ func (c *nakamaClient) GetUsers(ctx context.Context, in *api.GetUsersRequest, op } func (c *nakamaClient) GetSubscription(ctx context.Context, in *api.GetSubscriptionRequest, opts ...grpc.CallOption) (*api.ValidatedSubscription, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatedSubscription) - err := c.cc.Invoke(ctx, Nakama_GetSubscription_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_GetSubscription_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -550,8 +580,9 @@ func (c *nakamaClient) GetSubscription(ctx context.Context, in *api.GetSubscript } func (c *nakamaClient) GetMatchmakerStats(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*api.MatchmakerStats, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.MatchmakerStats) - err := c.cc.Invoke(ctx, Nakama_GetMatchmakerStats_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_GetMatchmakerStats_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -559,8 +590,9 @@ func (c *nakamaClient) GetMatchmakerStats(ctx context.Context, in *emptypb.Empty } func (c *nakamaClient) Healthcheck(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_Healthcheck_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_Healthcheck_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -568,8 +600,9 @@ func (c *nakamaClient) Healthcheck(ctx context.Context, in *emptypb.Empty, opts } func (c *nakamaClient) ImportFacebookFriends(ctx context.Context, in *api.ImportFacebookFriendsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_ImportFacebookFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ImportFacebookFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -577,8 +610,9 @@ func (c *nakamaClient) ImportFacebookFriends(ctx context.Context, in *api.Import } func (c *nakamaClient) ImportSteamFriends(ctx context.Context, in *api.ImportSteamFriendsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_ImportSteamFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ImportSteamFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -586,8 +620,9 @@ func (c *nakamaClient) ImportSteamFriends(ctx context.Context, in *api.ImportSte } func (c *nakamaClient) JoinGroup(ctx context.Context, in *api.JoinGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_JoinGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_JoinGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -595,8 +630,9 @@ func (c *nakamaClient) JoinGroup(ctx context.Context, in *api.JoinGroupRequest, } func (c *nakamaClient) JoinTournament(ctx context.Context, in *api.JoinTournamentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_JoinTournament_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_JoinTournament_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -604,8 +640,9 @@ func (c *nakamaClient) JoinTournament(ctx context.Context, in *api.JoinTournamen } func (c *nakamaClient) KickGroupUsers(ctx context.Context, in *api.KickGroupUsersRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_KickGroupUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_KickGroupUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -613,8 +650,9 @@ func (c *nakamaClient) KickGroupUsers(ctx context.Context, in *api.KickGroupUser } func (c *nakamaClient) LeaveGroup(ctx context.Context, in *api.LeaveGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LeaveGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LeaveGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -622,8 +660,9 @@ func (c *nakamaClient) LeaveGroup(ctx context.Context, in *api.LeaveGroupRequest } func (c *nakamaClient) LinkApple(ctx context.Context, in *api.AccountApple, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkApple_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkApple_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -631,8 +670,9 @@ func (c *nakamaClient) LinkApple(ctx context.Context, in *api.AccountApple, opts } func (c *nakamaClient) LinkCustom(ctx context.Context, in *api.AccountCustom, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkCustom_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkCustom_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -640,8 +680,9 @@ func (c *nakamaClient) LinkCustom(ctx context.Context, in *api.AccountCustom, op } func (c *nakamaClient) LinkDevice(ctx context.Context, in *api.AccountDevice, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkDevice_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkDevice_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -649,8 +690,9 @@ func (c *nakamaClient) LinkDevice(ctx context.Context, in *api.AccountDevice, op } func (c *nakamaClient) LinkEmail(ctx context.Context, in *api.AccountEmail, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkEmail_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -658,8 +700,9 @@ func (c *nakamaClient) LinkEmail(ctx context.Context, in *api.AccountEmail, opts } func (c *nakamaClient) LinkFacebook(ctx context.Context, in *api.LinkFacebookRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkFacebook_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkFacebook_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -667,8 +710,9 @@ func (c *nakamaClient) LinkFacebook(ctx context.Context, in *api.LinkFacebookReq } func (c *nakamaClient) LinkFacebookInstantGame(ctx context.Context, in *api.AccountFacebookInstantGame, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkFacebookInstantGame_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkFacebookInstantGame_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -676,8 +720,9 @@ func (c *nakamaClient) LinkFacebookInstantGame(ctx context.Context, in *api.Acco } func (c *nakamaClient) LinkGameCenter(ctx context.Context, in *api.AccountGameCenter, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkGameCenter_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkGameCenter_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -685,8 +730,9 @@ func (c *nakamaClient) LinkGameCenter(ctx context.Context, in *api.AccountGameCe } func (c *nakamaClient) LinkGoogle(ctx context.Context, in *api.AccountGoogle, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkGoogle_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkGoogle_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -694,8 +740,9 @@ func (c *nakamaClient) LinkGoogle(ctx context.Context, in *api.AccountGoogle, op } func (c *nakamaClient) LinkSteam(ctx context.Context, in *api.LinkSteamRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_LinkSteam_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_LinkSteam_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -703,8 +750,9 @@ func (c *nakamaClient) LinkSteam(ctx context.Context, in *api.LinkSteamRequest, } func (c *nakamaClient) ListChannelMessages(ctx context.Context, in *api.ListChannelMessagesRequest, opts ...grpc.CallOption) (*api.ChannelMessageList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ChannelMessageList) - err := c.cc.Invoke(ctx, Nakama_ListChannelMessages_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListChannelMessages_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -712,8 +760,9 @@ func (c *nakamaClient) ListChannelMessages(ctx context.Context, in *api.ListChan } func (c *nakamaClient) ListFriends(ctx context.Context, in *api.ListFriendsRequest, opts ...grpc.CallOption) (*api.FriendList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.FriendList) - err := c.cc.Invoke(ctx, Nakama_ListFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -721,8 +770,9 @@ func (c *nakamaClient) ListFriends(ctx context.Context, in *api.ListFriendsReque } func (c *nakamaClient) ListFriendsOfFriends(ctx context.Context, in *api.ListFriendsOfFriendsRequest, opts ...grpc.CallOption) (*api.FriendsOfFriendsList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.FriendsOfFriendsList) - err := c.cc.Invoke(ctx, Nakama_ListFriendsOfFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListFriendsOfFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -730,8 +780,9 @@ func (c *nakamaClient) ListFriendsOfFriends(ctx context.Context, in *api.ListFri } func (c *nakamaClient) ListGroups(ctx context.Context, in *api.ListGroupsRequest, opts ...grpc.CallOption) (*api.GroupList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.GroupList) - err := c.cc.Invoke(ctx, Nakama_ListGroups_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListGroups_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -739,8 +790,9 @@ func (c *nakamaClient) ListGroups(ctx context.Context, in *api.ListGroupsRequest } func (c *nakamaClient) ListGroupUsers(ctx context.Context, in *api.ListGroupUsersRequest, opts ...grpc.CallOption) (*api.GroupUserList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.GroupUserList) - err := c.cc.Invoke(ctx, Nakama_ListGroupUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListGroupUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -748,8 +800,9 @@ func (c *nakamaClient) ListGroupUsers(ctx context.Context, in *api.ListGroupUser } func (c *nakamaClient) ListLeaderboardRecords(ctx context.Context, in *api.ListLeaderboardRecordsRequest, opts ...grpc.CallOption) (*api.LeaderboardRecordList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.LeaderboardRecordList) - err := c.cc.Invoke(ctx, Nakama_ListLeaderboardRecords_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListLeaderboardRecords_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -757,8 +810,9 @@ func (c *nakamaClient) ListLeaderboardRecords(ctx context.Context, in *api.ListL } func (c *nakamaClient) ListLeaderboardRecordsAroundOwner(ctx context.Context, in *api.ListLeaderboardRecordsAroundOwnerRequest, opts ...grpc.CallOption) (*api.LeaderboardRecordList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.LeaderboardRecordList) - err := c.cc.Invoke(ctx, Nakama_ListLeaderboardRecordsAroundOwner_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListLeaderboardRecordsAroundOwner_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -766,8 +820,9 @@ func (c *nakamaClient) ListLeaderboardRecordsAroundOwner(ctx context.Context, in } func (c *nakamaClient) ListMatches(ctx context.Context, in *api.ListMatchesRequest, opts ...grpc.CallOption) (*api.MatchList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.MatchList) - err := c.cc.Invoke(ctx, Nakama_ListMatches_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListMatches_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -775,8 +830,9 @@ func (c *nakamaClient) ListMatches(ctx context.Context, in *api.ListMatchesReque } func (c *nakamaClient) ListNotifications(ctx context.Context, in *api.ListNotificationsRequest, opts ...grpc.CallOption) (*api.NotificationList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.NotificationList) - err := c.cc.Invoke(ctx, Nakama_ListNotifications_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListNotifications_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -784,8 +840,9 @@ func (c *nakamaClient) ListNotifications(ctx context.Context, in *api.ListNotifi } func (c *nakamaClient) ListStorageObjects(ctx context.Context, in *api.ListStorageObjectsRequest, opts ...grpc.CallOption) (*api.StorageObjectList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.StorageObjectList) - err := c.cc.Invoke(ctx, Nakama_ListStorageObjects_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListStorageObjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -793,8 +850,9 @@ func (c *nakamaClient) ListStorageObjects(ctx context.Context, in *api.ListStora } func (c *nakamaClient) ListSubscriptions(ctx context.Context, in *api.ListSubscriptionsRequest, opts ...grpc.CallOption) (*api.SubscriptionList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.SubscriptionList) - err := c.cc.Invoke(ctx, Nakama_ListSubscriptions_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListSubscriptions_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -802,8 +860,9 @@ func (c *nakamaClient) ListSubscriptions(ctx context.Context, in *api.ListSubscr } func (c *nakamaClient) ListTournaments(ctx context.Context, in *api.ListTournamentsRequest, opts ...grpc.CallOption) (*api.TournamentList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.TournamentList) - err := c.cc.Invoke(ctx, Nakama_ListTournaments_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListTournaments_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -811,8 +870,9 @@ func (c *nakamaClient) ListTournaments(ctx context.Context, in *api.ListTourname } func (c *nakamaClient) ListTournamentRecords(ctx context.Context, in *api.ListTournamentRecordsRequest, opts ...grpc.CallOption) (*api.TournamentRecordList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.TournamentRecordList) - err := c.cc.Invoke(ctx, Nakama_ListTournamentRecords_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListTournamentRecords_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -820,8 +880,9 @@ func (c *nakamaClient) ListTournamentRecords(ctx context.Context, in *api.ListTo } func (c *nakamaClient) ListTournamentRecordsAroundOwner(ctx context.Context, in *api.ListTournamentRecordsAroundOwnerRequest, opts ...grpc.CallOption) (*api.TournamentRecordList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.TournamentRecordList) - err := c.cc.Invoke(ctx, Nakama_ListTournamentRecordsAroundOwner_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListTournamentRecordsAroundOwner_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -829,8 +890,9 @@ func (c *nakamaClient) ListTournamentRecordsAroundOwner(ctx context.Context, in } func (c *nakamaClient) ListUserGroups(ctx context.Context, in *api.ListUserGroupsRequest, opts ...grpc.CallOption) (*api.UserGroupList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.UserGroupList) - err := c.cc.Invoke(ctx, Nakama_ListUserGroups_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ListUserGroups_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -838,8 +900,9 @@ func (c *nakamaClient) ListUserGroups(ctx context.Context, in *api.ListUserGroup } func (c *nakamaClient) PromoteGroupUsers(ctx context.Context, in *api.PromoteGroupUsersRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_PromoteGroupUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_PromoteGroupUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -847,8 +910,9 @@ func (c *nakamaClient) PromoteGroupUsers(ctx context.Context, in *api.PromoteGro } func (c *nakamaClient) DemoteGroupUsers(ctx context.Context, in *api.DemoteGroupUsersRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_DemoteGroupUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_DemoteGroupUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -856,8 +920,9 @@ func (c *nakamaClient) DemoteGroupUsers(ctx context.Context, in *api.DemoteGroup } func (c *nakamaClient) ReadStorageObjects(ctx context.Context, in *api.ReadStorageObjectsRequest, opts ...grpc.CallOption) (*api.StorageObjects, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.StorageObjects) - err := c.cc.Invoke(ctx, Nakama_ReadStorageObjects_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ReadStorageObjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -865,8 +930,9 @@ func (c *nakamaClient) ReadStorageObjects(ctx context.Context, in *api.ReadStora } func (c *nakamaClient) RpcFunc(ctx context.Context, in *api.Rpc, opts ...grpc.CallOption) (*api.Rpc, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Rpc) - err := c.cc.Invoke(ctx, Nakama_RpcFunc_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_RpcFunc_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -874,8 +940,9 @@ func (c *nakamaClient) RpcFunc(ctx context.Context, in *api.Rpc, opts ...grpc.Ca } func (c *nakamaClient) UnlinkApple(ctx context.Context, in *api.AccountApple, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkApple_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkApple_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -883,8 +950,9 @@ func (c *nakamaClient) UnlinkApple(ctx context.Context, in *api.AccountApple, op } func (c *nakamaClient) UnlinkCustom(ctx context.Context, in *api.AccountCustom, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkCustom_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkCustom_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -892,8 +960,9 @@ func (c *nakamaClient) UnlinkCustom(ctx context.Context, in *api.AccountCustom, } func (c *nakamaClient) UnlinkDevice(ctx context.Context, in *api.AccountDevice, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkDevice_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkDevice_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -901,8 +970,9 @@ func (c *nakamaClient) UnlinkDevice(ctx context.Context, in *api.AccountDevice, } func (c *nakamaClient) UnlinkEmail(ctx context.Context, in *api.AccountEmail, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkEmail_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -910,8 +980,9 @@ func (c *nakamaClient) UnlinkEmail(ctx context.Context, in *api.AccountEmail, op } func (c *nakamaClient) UnlinkFacebook(ctx context.Context, in *api.AccountFacebook, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkFacebook_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkFacebook_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -919,8 +990,9 @@ func (c *nakamaClient) UnlinkFacebook(ctx context.Context, in *api.AccountFacebo } func (c *nakamaClient) UnlinkFacebookInstantGame(ctx context.Context, in *api.AccountFacebookInstantGame, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkFacebookInstantGame_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkFacebookInstantGame_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -928,8 +1000,9 @@ func (c *nakamaClient) UnlinkFacebookInstantGame(ctx context.Context, in *api.Ac } func (c *nakamaClient) UnlinkGameCenter(ctx context.Context, in *api.AccountGameCenter, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkGameCenter_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkGameCenter_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -937,8 +1010,9 @@ func (c *nakamaClient) UnlinkGameCenter(ctx context.Context, in *api.AccountGame } func (c *nakamaClient) UnlinkGoogle(ctx context.Context, in *api.AccountGoogle, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkGoogle_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkGoogle_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -946,8 +1020,9 @@ func (c *nakamaClient) UnlinkGoogle(ctx context.Context, in *api.AccountGoogle, } func (c *nakamaClient) UnlinkSteam(ctx context.Context, in *api.AccountSteam, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UnlinkSteam_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UnlinkSteam_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -955,8 +1030,9 @@ func (c *nakamaClient) UnlinkSteam(ctx context.Context, in *api.AccountSteam, op } func (c *nakamaClient) UpdateAccount(ctx context.Context, in *api.UpdateAccountRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UpdateAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UpdateAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -964,8 +1040,9 @@ func (c *nakamaClient) UpdateAccount(ctx context.Context, in *api.UpdateAccountR } func (c *nakamaClient) UpdateGroup(ctx context.Context, in *api.UpdateGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Nakama_UpdateGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_UpdateGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -973,8 +1050,9 @@ func (c *nakamaClient) UpdateGroup(ctx context.Context, in *api.UpdateGroupReque } func (c *nakamaClient) ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatePurchaseResponse) - err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseApple_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseApple_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -982,8 +1060,9 @@ func (c *nakamaClient) ValidatePurchaseApple(ctx context.Context, in *api.Valida } func (c *nakamaClient) ValidateSubscriptionApple(ctx context.Context, in *api.ValidateSubscriptionAppleRequest, opts ...grpc.CallOption) (*api.ValidateSubscriptionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidateSubscriptionResponse) - err := c.cc.Invoke(ctx, Nakama_ValidateSubscriptionApple_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ValidateSubscriptionApple_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -991,8 +1070,9 @@ func (c *nakamaClient) ValidateSubscriptionApple(ctx context.Context, in *api.Va } func (c *nakamaClient) ValidatePurchaseGoogle(ctx context.Context, in *api.ValidatePurchaseGoogleRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatePurchaseResponse) - err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseGoogle_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseGoogle_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -1000,8 +1080,9 @@ func (c *nakamaClient) ValidatePurchaseGoogle(ctx context.Context, in *api.Valid } func (c *nakamaClient) ValidateSubscriptionGoogle(ctx context.Context, in *api.ValidateSubscriptionGoogleRequest, opts ...grpc.CallOption) (*api.ValidateSubscriptionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidateSubscriptionResponse) - err := c.cc.Invoke(ctx, Nakama_ValidateSubscriptionGoogle_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ValidateSubscriptionGoogle_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -1009,8 +1090,9 @@ func (c *nakamaClient) ValidateSubscriptionGoogle(ctx context.Context, in *api.V } func (c *nakamaClient) ValidatePurchaseHuawei(ctx context.Context, in *api.ValidatePurchaseHuaweiRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatePurchaseResponse) - err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseHuawei_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseHuawei_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -1018,8 +1100,9 @@ func (c *nakamaClient) ValidatePurchaseHuawei(ctx context.Context, in *api.Valid } func (c *nakamaClient) ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatePurchaseResponse) - err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseFacebookInstant_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseFacebookInstant_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -1037,8 +1120,9 @@ func (c *nakamaClient) ValidatePurchaseXbox(ctx context.Context, in *api.Validat } func (c *nakamaClient) WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.LeaderboardRecord) - err := c.cc.Invoke(ctx, Nakama_WriteLeaderboardRecord_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_WriteLeaderboardRecord_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -1046,8 +1130,9 @@ func (c *nakamaClient) WriteLeaderboardRecord(ctx context.Context, in *api.Write } func (c *nakamaClient) WriteStorageObjects(ctx context.Context, in *api.WriteStorageObjectsRequest, opts ...grpc.CallOption) (*api.StorageObjectAcks, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.StorageObjectAcks) - err := c.cc.Invoke(ctx, Nakama_WriteStorageObjects_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_WriteStorageObjects_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -1055,8 +1140,9 @@ func (c *nakamaClient) WriteStorageObjects(ctx context.Context, in *api.WriteSto } func (c *nakamaClient) WriteTournamentRecord(ctx context.Context, in *api.WriteTournamentRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.LeaderboardRecord) - err := c.cc.Invoke(ctx, Nakama_WriteTournamentRecord_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Nakama_WriteTournamentRecord_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -1065,7 +1151,10 @@ func (c *nakamaClient) WriteTournamentRecord(ctx context.Context, in *api.WriteT // NakamaServer is the server API for Nakama service. // All implementations must embed UnimplementedNakamaServer -// for forward compatibility +// for forward compatibility. +// +// * +// The Nakama RPC protocol service built with GRPC. type NakamaServer interface { // Add friends by ID or username to a user's account. AddFriends(context.Context, *api.AddFriendsRequest) (*emptypb.Empty, error) @@ -1238,9 +1327,12 @@ type NakamaServer interface { mustEmbedUnimplementedNakamaServer() } -// UnimplementedNakamaServer must be embedded to have forward compatible implementations. -type UnimplementedNakamaServer struct { -} +// UnimplementedNakamaServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedNakamaServer struct{} func (UnimplementedNakamaServer) AddFriends(context.Context, *api.AddFriendsRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method AddFriends not implemented") @@ -1495,6 +1587,7 @@ func (UnimplementedNakamaServer) WriteTournamentRecord(context.Context, *api.Wri return nil, status.Errorf(codes.Unimplemented, "method WriteTournamentRecord not implemented") } func (UnimplementedNakamaServer) mustEmbedUnimplementedNakamaServer() {} +func (UnimplementedNakamaServer) testEmbeddedByValue() {} // UnsafeNakamaServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to NakamaServer will @@ -1504,6 +1597,13 @@ type UnsafeNakamaServer interface { } func RegisterNakamaServer(s grpc.ServiceRegistrar, srv NakamaServer) { + // If the following call pancis, it indicates UnimplementedNakamaServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Nakama_ServiceDesc, srv) } diff --git a/console/console.pb.go b/console/console.pb.go index ca097ee4fb..bffa5c6119 100644 --- a/console/console.pb.go +++ b/console/console.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.29.3 +// protoc-gen-go v1.36.6 +// protoc v4.24.3 // source: console.proto package console @@ -35,6 +35,7 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -205,21 +206,18 @@ func (ListChannelMessagesRequest_Type) EnumDescriptor() ([]byte, []int) { // API Explorer List of Endpoints response message type ApiEndpointDescriptor struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` + BodyTemplate string `protobuf:"bytes,2,opt,name=body_template,json=bodyTemplate,proto3" json:"body_template,omitempty"` unknownFields protoimpl.UnknownFields - - Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` - BodyTemplate string `protobuf:"bytes,2,opt,name=body_template,json=bodyTemplate,proto3" json:"body_template,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ApiEndpointDescriptor) Reset() { *x = ApiEndpointDescriptor{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ApiEndpointDescriptor) String() string { @@ -230,7 +228,7 @@ func (*ApiEndpointDescriptor) ProtoMessage() {} func (x *ApiEndpointDescriptor) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -261,23 +259,20 @@ func (x *ApiEndpointDescriptor) GetBodyTemplate() string { // Account information. type Account struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user's account details. Account *api.Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // The UNIX time when the account was disabled. - DisableTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` + DisableTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Account) Reset() { *x = Account{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Account) String() string { @@ -288,7 +283,7 @@ func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -319,23 +314,20 @@ func (x *Account) GetDisableTime() *timestamppb.Timestamp { // Delete a user account. type AccountDeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The unique identifier of the user account. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Record the user deletion - used for GDPR compliance. RecordDeletion *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=record_deletion,json=recordDeletion,proto3" json:"record_deletion,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountDeleteRequest) Reset() { *x = AccountDeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountDeleteRequest) String() string { @@ -346,7 +338,7 @@ func (*AccountDeleteRequest) ProtoMessage() {} func (x *AccountDeleteRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -377,10 +369,7 @@ func (x *AccountDeleteRequest) GetRecordDeletion() *wrapperspb.BoolValue { // An export of all information stored for a user account. type AccountExport struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user's account details. Account *api.Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // The user's storage. @@ -397,15 +386,15 @@ type AccountExport struct { Notifications []*api.Notification `protobuf:"bytes,7,rep,name=notifications,proto3" json:"notifications,omitempty"` // The user's wallet ledger items. WalletLedgers []*WalletLedger `protobuf:"bytes,8,rep,name=wallet_ledgers,json=walletLedgers,proto3" json:"wallet_ledgers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountExport) Reset() { *x = AccountExport{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountExport) String() string { @@ -416,7 +405,7 @@ func (*AccountExport) ProtoMessage() {} func (x *AccountExport) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -489,21 +478,18 @@ func (x *AccountExport) GetWalletLedgers() []*WalletLedger { // The identifier for a user account. type AccountId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The unique identifier of the user account. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountId) Reset() { *x = AccountId{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountId) String() string { @@ -514,7 +500,7 @@ func (*AccountId) ProtoMessage() {} func (x *AccountId) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -538,25 +524,22 @@ func (x *AccountId) GetId() string { // A list of users. type AccountList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of users. Users []*api.User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` // Approximate total number of users. TotalCount int32 `protobuf:"varint,2,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` // Next cursor. - NextCursor string `protobuf:"bytes,3,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` + NextCursor string `protobuf:"bytes,3,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountList) Reset() { *x = AccountList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountList) String() string { @@ -567,7 +550,7 @@ func (*AccountList) ProtoMessage() {} func (x *AccountList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -605,21 +588,18 @@ func (x *AccountList) GetNextCursor() string { // The identifier for a group. type GroupId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The unique identifier of the group. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupId) Reset() { *x = GroupId{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupId) String() string { @@ -630,7 +610,7 @@ func (*GroupId) ProtoMessage() {} func (x *GroupId) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -654,25 +634,22 @@ func (x *GroupId) GetId() string { // A list of groups. type GroupList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of groups. Groups []*api.Group `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` // Approximate total number of groups. TotalCount int32 `protobuf:"varint,2,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` // Next cursor. - NextCursor string `protobuf:"bytes,3,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` + NextCursor string `protobuf:"bytes,3,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupList) Reset() { *x = GroupList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupList) String() string { @@ -683,7 +660,7 @@ func (*GroupList) ProtoMessage() {} func (x *GroupList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -721,23 +698,20 @@ func (x *GroupList) GetNextCursor() string { // An export of all information stored for a group. type GroupExport struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group details. Group *api.Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` // The group's list of members. - Members []*api.GroupUserList_GroupUser `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` + Members []*api.GroupUserList_GroupUser `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupExport) Reset() { *x = GroupExport{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupExport) String() string { @@ -748,7 +722,7 @@ func (*GroupExport) ProtoMessage() {} func (x *GroupExport) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -779,20 +753,17 @@ func (x *GroupExport) GetMembers() []*api.GroupUserList_GroupUser { // A list of realtime matches, with their node names. type MatchList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Matches []*MatchList_Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` unknownFields protoimpl.UnknownFields - - Matches []*MatchList_Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MatchList) Reset() { *x = MatchList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchList) String() string { @@ -803,7 +774,7 @@ func (*MatchList) ProtoMessage() {} func (x *MatchList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -827,10 +798,7 @@ func (x *MatchList) GetMatches() []*MatchList_Match { // Add a new console user type AddUserRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The username of the user. Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // The password of the user. @@ -843,15 +811,15 @@ type AddUserRequest struct { MfaRequired bool `protobuf:"varint,5,opt,name=mfa_required,json=mfaRequired,proto3" json:"mfa_required,omitempty"` // Subscribe to newsletters NewsletterSubscription bool `protobuf:"varint,6,opt,name=newsletter_subscription,json=newsletterSubscription,proto3" json:"newsletter_subscription,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddUserRequest) Reset() { *x = AddUserRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddUserRequest) String() string { @@ -862,7 +830,7 @@ func (*AddUserRequest) ProtoMessage() {} func (x *AddUserRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -921,25 +889,22 @@ func (x *AddUserRequest) GetNewsletterSubscription() bool { // Add/join users to a group. type AddGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Users to add/join. Ids string `protobuf:"bytes,1,opt,name=ids,proto3" json:"ids,omitempty"` // ID of the group to add them to. GroupId string `protobuf:"bytes,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // Whether it is a join request. - JoinRequest bool `protobuf:"varint,3,opt,name=join_request,json=joinRequest,proto3" json:"join_request,omitempty"` + JoinRequest bool `protobuf:"varint,3,opt,name=join_request,json=joinRequest,proto3" json:"join_request,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddGroupUsersRequest) Reset() { *x = AddGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddGroupUsersRequest) String() string { @@ -950,7 +915,7 @@ func (*AddGroupUsersRequest) ProtoMessage() {} func (x *AddGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -988,21 +953,18 @@ func (x *AddGroupUsersRequest) GetJoinRequest() bool { // API Explorer List of Endpoints type ApiEndpointList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Endpoints []*ApiEndpointDescriptor `protobuf:"bytes,1,rep,name=endpoints,proto3" json:"endpoints,omitempty"` + RpcEndpoints []*ApiEndpointDescriptor `protobuf:"bytes,2,rep,name=rpc_endpoints,json=rpcEndpoints,proto3" json:"rpc_endpoints,omitempty"` unknownFields protoimpl.UnknownFields - - Endpoints []*ApiEndpointDescriptor `protobuf:"bytes,1,rep,name=endpoints,proto3" json:"endpoints,omitempty"` - RpcEndpoints []*ApiEndpointDescriptor `protobuf:"bytes,2,rep,name=rpc_endpoints,json=rpcEndpoints,proto3" json:"rpc_endpoints,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ApiEndpointList) Reset() { *x = ApiEndpointList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ApiEndpointList) String() string { @@ -1013,7 +975,7 @@ func (*ApiEndpointList) ProtoMessage() {} func (x *ApiEndpointList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1044,25 +1006,22 @@ func (x *ApiEndpointList) GetRpcEndpoints() []*ApiEndpointDescriptor { // Authenticate a console user with username and password. type AuthenticateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The username of the user. Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // The password of the user. Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` // Multi-factor authentication code. - Mfa string `protobuf:"bytes,3,opt,name=mfa,proto3" json:"mfa,omitempty"` + Mfa string `protobuf:"bytes,3,opt,name=mfa,proto3" json:"mfa,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateRequest) Reset() { *x = AuthenticateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateRequest) String() string { @@ -1073,7 +1032,7 @@ func (*AuthenticateRequest) ProtoMessage() {} func (x *AuthenticateRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1111,23 +1070,20 @@ func (x *AuthenticateRequest) GetMfa() string { // Request to change MFA. type AuthenticateMFASetupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // MFA token. Mfa string `protobuf:"bytes,1,opt,name=mfa,proto3" json:"mfa,omitempty"` // MFA code. - Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateMFASetupRequest) Reset() { *x = AuthenticateMFASetupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateMFASetupRequest) String() string { @@ -1138,7 +1094,7 @@ func (*AuthenticateMFASetupRequest) ProtoMessage() {} func (x *AuthenticateMFASetupRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1169,21 +1125,18 @@ func (x *AuthenticateMFASetupRequest) GetCode() string { // Response to change MFA. type AuthenticateMFASetupResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // An one-time code to configure the MFA mechanism RecoveryCodes []string `protobuf:"bytes,1,rep,name=recovery_codes,json=recoveryCodes,proto3" json:"recovery_codes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateMFASetupResponse) Reset() { *x = AuthenticateMFASetupResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateMFASetupResponse) String() string { @@ -1194,7 +1147,7 @@ func (*AuthenticateMFASetupResponse) ProtoMessage() {} func (x *AuthenticateMFASetupResponse) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1218,21 +1171,18 @@ func (x *AuthenticateMFASetupResponse) GetRecoveryCodes() []string { // Log out a session and invalidate a session token. type AuthenticateLogoutRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Session token to log out. - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateLogoutRequest) Reset() { *x = AuthenticateLogoutRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateLogoutRequest) String() string { @@ -1243,7 +1193,7 @@ func (*AuthenticateLogoutRequest) ProtoMessage() {} func (x *AuthenticateLogoutRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1267,23 +1217,20 @@ func (x *AuthenticateLogoutRequest) GetToken() string { // API Explorer request definition for CallApiEndpoint type CallApiEndpointRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` + Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + SessionVars map[string]string `protobuf:"bytes,4,rep,name=session_vars,json=sessionVars,proto3" json:"session_vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields - - Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` - Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` - UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - SessionVars map[string]string `protobuf:"bytes,4,rep,name=session_vars,json=sessionVars,proto3" json:"session_vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + sizeCache protoimpl.SizeCache } func (x *CallApiEndpointRequest) Reset() { *x = CallApiEndpointRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CallApiEndpointRequest) String() string { @@ -1294,7 +1241,7 @@ func (*CallApiEndpointRequest) ProtoMessage() {} func (x *CallApiEndpointRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1339,21 +1286,18 @@ func (x *CallApiEndpointRequest) GetSessionVars() map[string]string { // API Explorer response definition for CallApiEndpoint type CallApiEndpointResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Body string `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` unknownFields protoimpl.UnknownFields - - Body string `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` - ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CallApiEndpointResponse) Reset() { *x = CallApiEndpointResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CallApiEndpointResponse) String() string { @@ -1364,7 +1308,7 @@ func (*CallApiEndpointResponse) ProtoMessage() {} func (x *CallApiEndpointResponse) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1395,25 +1339,22 @@ func (x *CallApiEndpointResponse) GetErrorMessage() string { // The current server configuration and any associated warnings. type Config struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // JSON-encoded active server configuration. Config string `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` // Any warnings about the current config. Warnings []*Config_Warning `protobuf:"bytes,2,rep,name=warnings,proto3" json:"warnings,omitempty"` // Server version ServerVersion string `protobuf:"bytes,3,opt,name=server_version,json=serverVersion,proto3" json:"server_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Config) Reset() { *x = Config{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Config) String() string { @@ -1424,7 +1365,7 @@ func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1462,23 +1403,20 @@ func (x *Config) GetServerVersion() string { // A console user session. type ConsoleSession struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A session token (JWT) for the console user. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // MFA code required to setup the MFA mechanism. - MfaCode *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=mfa_code,json=mfaCode,proto3" json:"mfa_code,omitempty"` + MfaCode *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=mfa_code,json=mfaCode,proto3" json:"mfa_code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ConsoleSession) Reset() { *x = ConsoleSession{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ConsoleSession) String() string { @@ -1489,7 +1427,7 @@ func (*ConsoleSession) ProtoMessage() {} func (x *ConsoleSession) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1520,23 +1458,20 @@ func (x *ConsoleSession) GetMfaCode() *wrapperspb.StringValue { // Delete channel messages by timestamp or/and ids. type DeleteChannelMessagesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Timestamp before which messages will be deleted. Before *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=before,proto3" json:"before,omitempty"` // IDs of the messages to delete. - Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` + Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteChannelMessagesRequest) Reset() { *x = DeleteChannelMessagesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteChannelMessagesRequest) String() string { @@ -1547,7 +1482,7 @@ func (*DeleteChannelMessagesRequest) ProtoMessage() {} func (x *DeleteChannelMessagesRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1578,23 +1513,20 @@ func (x *DeleteChannelMessagesRequest) GetIds() []string { // Delete friend relationship between two users. type DeleteFriendRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user do delete for. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // User ID of the friend to remove. - FriendId string `protobuf:"bytes,2,opt,name=friend_id,json=friendId,proto3" json:"friend_id,omitempty"` + FriendId string `protobuf:"bytes,2,opt,name=friend_id,json=friendId,proto3" json:"friend_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteFriendRequest) Reset() { *x = DeleteFriendRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteFriendRequest) String() string { @@ -1605,7 +1537,7 @@ func (*DeleteFriendRequest) ProtoMessage() {} func (x *DeleteFriendRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1636,21 +1568,18 @@ func (x *DeleteFriendRequest) GetFriendId() string { // Delete a group. type DeleteGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the group to delete. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteGroupRequest) Reset() { *x = DeleteGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteGroupRequest) String() string { @@ -1661,7 +1590,7 @@ func (*DeleteGroupRequest) ProtoMessage() {} func (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1685,23 +1614,20 @@ func (x *DeleteGroupRequest) GetId() string { // Remove a user from a group. type DeleteGroupUserRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User to remove. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // ID of the group to remove them from. - GroupId string `protobuf:"bytes,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteGroupUserRequest) Reset() { *x = DeleteGroupUserRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteGroupUserRequest) String() string { @@ -1712,7 +1638,7 @@ func (*DeleteGroupUserRequest) ProtoMessage() {} func (x *DeleteGroupUserRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1743,23 +1669,20 @@ func (x *DeleteGroupUserRequest) GetGroupId() string { // Promote/demote a user in a group. type UpdateGroupUserStateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User to change state. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // ID of the group. - GroupId string `protobuf:"bytes,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateGroupUserStateRequest) Reset() { *x = UpdateGroupUserStateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateGroupUserStateRequest) String() string { @@ -1770,7 +1693,7 @@ func (*UpdateGroupUserStateRequest) ProtoMessage() {} func (x *UpdateGroupUserStateRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1801,21 +1724,18 @@ func (x *UpdateGroupUserStateRequest) GetGroupId() string { // Reset a user's mfa setup. type ResetUserMfaRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User username. - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ResetUserMfaRequest) Reset() { *x = ResetUserMfaRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResetUserMfaRequest) String() string { @@ -1826,7 +1746,7 @@ func (*ResetUserMfaRequest) ProtoMessage() {} func (x *ResetUserMfaRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1850,23 +1770,20 @@ func (x *ResetUserMfaRequest) GetUsername() string { // Make a user's mfa required or not. type RequireUserMfaRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User username. Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // Required. - Required bool `protobuf:"varint,2,opt,name=required,proto3" json:"required,omitempty"` + Required bool `protobuf:"varint,2,opt,name=required,proto3" json:"required,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RequireUserMfaRequest) Reset() { *x = RequireUserMfaRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RequireUserMfaRequest) String() string { @@ -1877,7 +1794,7 @@ func (*RequireUserMfaRequest) ProtoMessage() {} func (x *RequireUserMfaRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1908,23 +1825,20 @@ func (x *RequireUserMfaRequest) GetRequired() bool { // Remove a leaderboard record type DeleteLeaderboardRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Leaderboard ID. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Record owner. - OwnerId string `protobuf:"bytes,2,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` + OwnerId string `protobuf:"bytes,2,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteLeaderboardRecordRequest) Reset() { *x = DeleteLeaderboardRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteLeaderboardRecordRequest) String() string { @@ -1935,7 +1849,7 @@ func (*DeleteLeaderboardRecordRequest) ProtoMessage() {} func (x *DeleteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1966,21 +1880,18 @@ func (x *DeleteLeaderboardRecordRequest) GetOwnerId() string { // Delete notification type DeleteNotificationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Notification ID. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteNotificationRequest) Reset() { *x = DeleteNotificationRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteNotificationRequest) String() string { @@ -1991,7 +1902,7 @@ func (*DeleteNotificationRequest) ProtoMessage() {} func (x *DeleteNotificationRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2015,10 +1926,7 @@ func (x *DeleteNotificationRequest) GetId() string { // Delete an individual storage object. type DeleteStorageObjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Collection. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // Key. @@ -2026,16 +1934,16 @@ type DeleteStorageObjectRequest struct { // Owner user ID. UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Version for OCC. - Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteStorageObjectRequest) Reset() { *x = DeleteStorageObjectRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteStorageObjectRequest) String() string { @@ -2046,7 +1954,7 @@ func (*DeleteStorageObjectRequest) ProtoMessage() {} func (x *DeleteStorageObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2091,23 +1999,20 @@ func (x *DeleteStorageObjectRequest) GetVersion() string { // Delete a single wallet ledger item. type DeleteWalletLedgerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID to remove wallet ledger item from. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // ID of the wallet ledger item to remove. - WalletId string `protobuf:"bytes,2,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + WalletId string `protobuf:"bytes,2,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteWalletLedgerRequest) Reset() { *x = DeleteWalletLedgerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteWalletLedgerRequest) String() string { @@ -2118,7 +2023,7 @@ func (*DeleteWalletLedgerRequest) ProtoMessage() {} func (x *DeleteWalletLedgerRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2149,10 +2054,7 @@ func (x *DeleteWalletLedgerRequest) GetWalletId() string { // A leaderboard. type Leaderboard struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The title for the leaderboard. @@ -2196,16 +2098,16 @@ type Leaderboard struct { // The UNIX time when the tournament was last reset. A computed value. PrevReset uint32 `protobuf:"varint,21,opt,name=prev_reset,json=prevReset,proto3" json:"prev_reset,omitempty"` // The UNIX time when the tournament is next playable. A computed value. - NextReset uint32 `protobuf:"varint,22,opt,name=next_reset,json=nextReset,proto3" json:"next_reset,omitempty"` + NextReset uint32 `protobuf:"varint,22,opt,name=next_reset,json=nextReset,proto3" json:"next_reset,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Leaderboard) Reset() { *x = Leaderboard{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Leaderboard) String() string { @@ -2216,7 +2118,7 @@ func (*Leaderboard) ProtoMessage() {} func (x *Leaderboard) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2387,21 +2289,18 @@ func (x *Leaderboard) GetNextReset() uint32 { // List leaderboards. type LeaderboardListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // An optional cursor to paginate from. - Cursor string `protobuf:"bytes,1,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,1,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardListRequest) Reset() { *x = LeaderboardListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardListRequest) String() string { @@ -2412,7 +2311,7 @@ func (*LeaderboardListRequest) ProtoMessage() {} func (x *LeaderboardListRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2436,25 +2335,22 @@ func (x *LeaderboardListRequest) GetCursor() string { // A list of leaderboards. type LeaderboardList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of leaderboards returned. Leaderboards []*Leaderboard `protobuf:"bytes,1,rep,name=leaderboards,proto3" json:"leaderboards,omitempty"` // Total count of leaderboards and tournaments. Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` // A cursor, if any. - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardList) Reset() { *x = LeaderboardList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardList) String() string { @@ -2465,7 +2361,7 @@ func (*LeaderboardList) ProtoMessage() {} func (x *LeaderboardList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2503,21 +2399,18 @@ func (x *LeaderboardList) GetCursor() string { // Get Leaderboard. type LeaderboardRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Leaderboard ID - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardRequest) Reset() { *x = LeaderboardRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardRequest) String() string { @@ -2528,7 +2421,7 @@ func (*LeaderboardRequest) ProtoMessage() {} func (x *LeaderboardRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2552,25 +2445,22 @@ func (x *LeaderboardRequest) GetId() string { // List (and optionally filter) users. type ListAccountsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID or username filter. Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` // Search only recorded deletes. Tombstones bool `protobuf:"varint,2,opt,name=tombstones,proto3" json:"tombstones,omitempty"` // Cursor to start from - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListAccountsRequest) Reset() { *x = ListAccountsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListAccountsRequest) String() string { @@ -2581,7 +2471,7 @@ func (*ListAccountsRequest) ProtoMessage() {} func (x *ListAccountsRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2619,10 +2509,7 @@ func (x *ListAccountsRequest) GetCursor() string { // List selected channel messages. type ListChannelMessagesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Type of the chat channel Type ListChannelMessagesRequest_Type `protobuf:"varint,1,opt,name=type,proto3,enum=nakama.console.ListChannelMessagesRequest_Type" json:"type,omitempty"` // Label of the channel, if a standard chat room @@ -2633,16 +2520,16 @@ type ListChannelMessagesRequest struct { UserIdOne string `protobuf:"bytes,4,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` UserIdTwo string `protobuf:"bytes,5,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` // Cursor to start from - Cursor string `protobuf:"bytes,6,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,6,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListChannelMessagesRequest) Reset() { *x = ListChannelMessagesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListChannelMessagesRequest) String() string { @@ -2653,7 +2540,7 @@ func (*ListChannelMessagesRequest) ProtoMessage() {} func (x *ListChannelMessagesRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2712,23 +2599,20 @@ func (x *ListChannelMessagesRequest) GetCursor() string { // List (and optionally filter) groups. type ListGroupsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID or username filter. Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` // Cursor to start from - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListGroupsRequest) Reset() { *x = ListGroupsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListGroupsRequest) String() string { @@ -2739,7 +2623,7 @@ func (*ListGroupsRequest) ProtoMessage() {} func (x *ListGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2770,10 +2654,7 @@ func (x *ListGroupsRequest) GetCursor() string { // List realtime matches. type ListMatchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Limit the number of returned matches. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // Authoritative or relayed matches, or null for both. @@ -2789,16 +2670,16 @@ type ListMatchesRequest struct { // Arbitrary label query. Query *wrapperspb.StringValue `protobuf:"bytes,7,opt,name=query,proto3" json:"query,omitempty"` // Node name filter, optional. - Node *wrapperspb.StringValue `protobuf:"bytes,8,opt,name=node,proto3" json:"node,omitempty"` + Node *wrapperspb.StringValue `protobuf:"bytes,8,opt,name=node,proto3" json:"node,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListMatchesRequest) Reset() { *x = ListMatchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMatchesRequest) String() string { @@ -2809,7 +2690,7 @@ func (*ListMatchesRequest) ProtoMessage() {} func (x *ListMatchesRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2882,25 +2763,22 @@ func (x *ListMatchesRequest) GetNode() *wrapperspb.StringValue { // List notifications. type ListNotificationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID to filter purchases for UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // The number of notifications to get. Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` // A cursor to page through notifications. - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListNotificationsRequest) Reset() { *x = ListNotificationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListNotificationsRequest) String() string { @@ -2911,7 +2789,7 @@ func (*ListNotificationsRequest) ProtoMessage() {} func (x *ListNotificationsRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2949,25 +2827,22 @@ func (x *ListNotificationsRequest) GetCursor() string { // List validated purchases. type ListPurchasesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID to filter purchases for UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Max number of results per page Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` // Cursor to retrieve a page of records from - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListPurchasesRequest) Reset() { *x = ListPurchasesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPurchasesRequest) String() string { @@ -2978,7 +2853,7 @@ func (*ListPurchasesRequest) ProtoMessage() {} func (x *ListPurchasesRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3016,25 +2891,22 @@ func (x *ListPurchasesRequest) GetCursor() string { // List subscriptions. type ListSubscriptionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // UserID to filter subscriptions for UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Max number of results per page Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` // Cursor to retrieve a page of records from - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListSubscriptionsRequest) Reset() { *x = ListSubscriptionsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListSubscriptionsRequest) String() string { @@ -3045,7 +2917,7 @@ func (*ListSubscriptionsRequest) ProtoMessage() {} func (x *ListSubscriptionsRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3083,10 +2955,7 @@ func (x *ListSubscriptionsRequest) GetCursor() string { // List (and optionally filter) storage objects. type ListStorageRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID to filter objects for. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Key to filter objects for @@ -3094,16 +2963,16 @@ type ListStorageRequest struct { // Collection name to filter objects for Collection string `protobuf:"bytes,3,opt,name=collection,proto3" json:"collection,omitempty"` // Cursor to retrieve a page of records from - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListStorageRequest) Reset() { *x = ListStorageRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListStorageRequest) String() string { @@ -3114,7 +2983,7 @@ func (*ListStorageRequest) ProtoMessage() {} func (x *ListStorageRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3159,25 +3028,22 @@ func (x *ListStorageRequest) GetCursor() string { // Match state type MatchState struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Presence list. Presences []*rtapi.UserPresence `protobuf:"bytes,1,rep,name=presences,proto3" json:"presences,omitempty"` // Current tick number. Tick int64 `protobuf:"varint,2,opt,name=tick,proto3" json:"tick,omitempty"` // State. - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchState) Reset() { *x = MatchState{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchState) String() string { @@ -3188,7 +3054,7 @@ func (*MatchState) ProtoMessage() {} func (x *MatchState) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3226,21 +3092,18 @@ func (x *MatchState) GetState() string { // Get current state of a running match type MatchStateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Match ID - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchStateRequest) Reset() { *x = MatchStateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchStateRequest) String() string { @@ -3251,7 +3114,7 @@ func (*MatchStateRequest) ProtoMessage() {} func (x *MatchStateRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3274,10 +3137,7 @@ func (x *MatchStateRequest) GetId() string { } type Notification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the Notification. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Subject of the notification. @@ -3293,16 +3153,16 @@ type Notification struct { // True if this notification was persisted to the database. Persistent bool `protobuf:"varint,7,opt,name=persistent,proto3" json:"persistent,omitempty"` // User id. - UserId string `protobuf:"bytes,8,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + UserId string `protobuf:"bytes,8,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Notification) Reset() { *x = Notification{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Notification) String() string { @@ -3313,7 +3173,7 @@ func (*Notification) ProtoMessage() {} func (x *Notification) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3385,25 +3245,22 @@ func (x *Notification) GetUserId() string { } type NotificationList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // List of notifications. Notifications []*Notification `protobuf:"bytes,1,rep,name=notifications,proto3" json:"notifications,omitempty"` // Next page cursor if any. NextCursor string `protobuf:"bytes,2,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` // Previous page cursor if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NotificationList) Reset() { *x = NotificationList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *NotificationList) String() string { @@ -3414,7 +3271,7 @@ func (*NotificationList) ProtoMessage() {} func (x *NotificationList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3451,21 +3308,18 @@ func (x *NotificationList) GetPrevCursor() string { } type DeleteChannelMessagesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Total number of messages deleted. - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteChannelMessagesResponse) Reset() { *x = DeleteChannelMessagesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteChannelMessagesResponse) String() string { @@ -3476,7 +3330,7 @@ func (*DeleteChannelMessagesResponse) ProtoMessage() {} func (x *DeleteChannelMessagesResponse) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3500,25 +3354,22 @@ func (x *DeleteChannelMessagesResponse) GetTotal() int64 { // List of storage objects. type StorageList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // List of storage objects matching list/filter operation. Objects []*StorageListObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` // Approximate total number of storage objects. TotalCount int32 `protobuf:"varint,2,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` // Next page cursor if any - NextCursor string `protobuf:"bytes,3,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` + NextCursor string `protobuf:"bytes,3,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageList) Reset() { *x = StorageList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageList) String() string { @@ -3529,7 +3380,7 @@ func (*StorageList) ProtoMessage() {} func (x *StorageList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3566,21 +3417,18 @@ func (x *StorageList) GetNextCursor() string { } type StorageCollectionsList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Available collection names in the whole of the storage - Collections []string `protobuf:"bytes,3,rep,name=collections,proto3" json:"collections,omitempty"` + Collections []string `protobuf:"bytes,3,rep,name=collections,proto3" json:"collections,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageCollectionsList) Reset() { *x = StorageCollectionsList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageCollectionsList) String() string { @@ -3591,7 +3439,7 @@ func (*StorageCollectionsList) ProtoMessage() {} func (x *StorageCollectionsList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3615,23 +3463,20 @@ func (x *StorageCollectionsList) GetCollections() []string { // Unlink a particular device ID from a user's account. type UnlinkDeviceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID to unlink from. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Device ID to unlink. - DeviceId string `protobuf:"bytes,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + DeviceId string `protobuf:"bytes,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UnlinkDeviceRequest) Reset() { *x = UnlinkDeviceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UnlinkDeviceRequest) String() string { @@ -3642,7 +3487,7 @@ func (*UnlinkDeviceRequest) ProtoMessage() {} func (x *UnlinkDeviceRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3673,10 +3518,7 @@ func (x *UnlinkDeviceRequest) GetDeviceId() string { // Update user account information. type UpdateAccountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User ID to update. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Username. @@ -3700,18 +3542,18 @@ type UpdateAccountRequest struct { // Password. Password *wrapperspb.StringValue `protobuf:"bytes,11,opt,name=password,proto3" json:"password,omitempty"` // Device ID modifications. - DeviceIds map[string]string `protobuf:"bytes,12,rep,name=device_ids,json=deviceIds,proto3" json:"device_ids,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + DeviceIds map[string]string `protobuf:"bytes,12,rep,name=device_ids,json=deviceIds,proto3" json:"device_ids,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Wallet. - Wallet *wrapperspb.StringValue `protobuf:"bytes,13,opt,name=wallet,proto3" json:"wallet,omitempty"` + Wallet *wrapperspb.StringValue `protobuf:"bytes,13,opt,name=wallet,proto3" json:"wallet,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateAccountRequest) Reset() { *x = UpdateAccountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAccountRequest) String() string { @@ -3722,7 +3564,7 @@ func (*UpdateAccountRequest) ProtoMessage() {} func (x *UpdateAccountRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3830,10 +3672,7 @@ func (x *UpdateAccountRequest) GetWallet() *wrapperspb.StringValue { // Update group information. type UpdateGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Group ID to update. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Name. @@ -3849,16 +3688,16 @@ type UpdateGroupRequest struct { // Anyone can join open groups, otherwise only admins can accept members. Open *wrapperspb.BoolValue `protobuf:"bytes,7,opt,name=open,proto3" json:"open,omitempty"` // The maximum number of members allowed. - MaxCount *wrapperspb.Int32Value `protobuf:"bytes,8,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` + MaxCount *wrapperspb.Int32Value `protobuf:"bytes,8,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateGroupRequest) Reset() { *x = UpdateGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateGroupRequest) String() string { @@ -3869,7 +3708,7 @@ func (*UpdateGroupRequest) ProtoMessage() {} func (x *UpdateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3942,21 +3781,18 @@ func (x *UpdateGroupRequest) GetMaxCount() *wrapperspb.Int32Value { // The identifier for a user account. type Username struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The unique username of the user account. - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Username) Reset() { *x = Username{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Username) String() string { @@ -3967,7 +3803,7 @@ func (*Username) ProtoMessage() {} func (x *Username) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3991,21 +3827,18 @@ func (x *Username) GetUsername() string { // A list of console users. type UserList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of users. - Users []*UserList_User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + Users []*UserList_User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserList) Reset() { *x = UserList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserList) String() string { @@ -4016,7 +3849,7 @@ func (*UserList) ProtoMessage() {} func (x *UserList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4040,23 +3873,20 @@ func (x *UserList) GetUsers() []*UserList_User { // List of nodes and their stats. type StatusList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // List of nodes and their stats. Nodes []*StatusList_Status `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` // Timestamp - Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusList) Reset() { *x = StatusList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusList) String() string { @@ -4067,7 +3897,7 @@ func (*StatusList) ProtoMessage() {} func (x *StatusList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4098,10 +3928,7 @@ func (x *StatusList) GetTimestamp() *timestamppb.Timestamp { // Runtime information type RuntimeInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Lua registered RPC functions LuaRpcFunctions []string `protobuf:"bytes,1,rep,name=lua_rpc_functions,json=luaRpcFunctions,proto3" json:"lua_rpc_functions,omitempty"` // Go registered RPC functions @@ -4113,16 +3940,16 @@ type RuntimeInfo struct { // Lua loaded modules LuaModules []*RuntimeInfo_ModuleInfo `protobuf:"bytes,5,rep,name=lua_modules,json=luaModules,proto3" json:"lua_modules,omitempty"` // JavaScript loaded modules - JsModules []*RuntimeInfo_ModuleInfo `protobuf:"bytes,6,rep,name=js_modules,json=jsModules,proto3" json:"js_modules,omitempty"` + JsModules []*RuntimeInfo_ModuleInfo `protobuf:"bytes,6,rep,name=js_modules,json=jsModules,proto3" json:"js_modules,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RuntimeInfo) Reset() { *x = RuntimeInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RuntimeInfo) String() string { @@ -4133,7 +3960,7 @@ func (*RuntimeInfo) ProtoMessage() {} func (x *RuntimeInfo) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4192,10 +4019,7 @@ func (x *RuntimeInfo) GetJsModules() []*RuntimeInfo_ModuleInfo { // An individual update to a user's wallet. type WalletLedger struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The identifier of this wallet change. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The user ID this wallet ledger item belongs to. @@ -4207,16 +4031,16 @@ type WalletLedger struct { // The UNIX time when the wallet ledger item was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time when the wallet ledger item was updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WalletLedger) Reset() { *x = WalletLedger{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WalletLedger) String() string { @@ -4227,7 +4051,7 @@ func (*WalletLedger) ProtoMessage() {} func (x *WalletLedger) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4286,25 +4110,22 @@ func (x *WalletLedger) GetUpdateTime() *timestamppb.Timestamp { // List of wallet ledger items for a particular user. type WalletLedgerList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of wallet ledger items. Items []*WalletLedger `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` // The cursor to send when retrieving the next older page, if any. NextCursor string `protobuf:"bytes,2,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` // The cursor to send when retrieving the previous page newer, if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WalletLedgerList) Reset() { *x = WalletLedgerList{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WalletLedgerList) String() string { @@ -4315,7 +4136,7 @@ func (*WalletLedgerList) ProtoMessage() {} func (x *WalletLedgerList) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4353,10 +4174,7 @@ func (x *WalletLedgerList) GetPrevCursor() string { // Write a new storage object or update an existing one. type WriteStorageObjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Collection. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // Key. @@ -4371,15 +4189,15 @@ type WriteStorageObjectRequest struct { PermissionRead *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=permission_read,json=permissionRead,proto3" json:"permission_read,omitempty"` // Write permission value. PermissionWrite *wrapperspb.Int32Value `protobuf:"bytes,7,opt,name=permission_write,json=permissionWrite,proto3" json:"permission_write,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteStorageObjectRequest) Reset() { *x = WriteStorageObjectRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteStorageObjectRequest) String() string { @@ -4390,7 +4208,7 @@ func (*WriteStorageObjectRequest) ProtoMessage() {} func (x *WriteStorageObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4455,25 +4273,22 @@ func (x *WriteStorageObjectRequest) GetPermissionWrite() *wrapperspb.Int32Value } type GetWalletLedgerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The unique identifier of the user account. AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` // Max number of results per page Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` // Cursor to retrieve a page of records from - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetWalletLedgerRequest) Reset() { *x = GetWalletLedgerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetWalletLedgerRequest) String() string { @@ -4484,7 +4299,7 @@ func (*GetWalletLedgerRequest) ProtoMessage() {} func (x *GetWalletLedgerRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4521,21 +4336,18 @@ func (x *GetWalletLedgerRequest) GetCursor() string { } type GetNotificationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Notification id. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetNotificationRequest) Reset() { *x = GetNotificationRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetNotificationRequest) String() string { @@ -4546,7 +4358,7 @@ func (*GetNotificationRequest) ProtoMessage() {} func (x *GetNotificationRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4569,21 +4381,18 @@ func (x *GetNotificationRequest) GetId() string { } type GetPurchaseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Purchase original transaction id. TransactionId string `protobuf:"bytes,1,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetPurchaseRequest) Reset() { *x = GetPurchaseRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPurchaseRequest) String() string { @@ -4594,7 +4403,7 @@ func (*GetPurchaseRequest) ProtoMessage() {} func (x *GetPurchaseRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4617,21 +4426,18 @@ func (x *GetPurchaseRequest) GetTransactionId() string { } type GetSubscriptionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Subscription original transaction id. OriginalTransactionId string `protobuf:"bytes,1,opt,name=original_transaction_id,json=originalTransactionId,proto3" json:"original_transaction_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetSubscriptionRequest) Reset() { *x = GetSubscriptionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetSubscriptionRequest) String() string { @@ -4642,7 +4448,7 @@ func (*GetSubscriptionRequest) ProtoMessage() {} func (x *GetSubscriptionRequest) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4666,10 +4472,7 @@ func (x *GetSubscriptionRequest) GetOriginalTransactionId() string { // An object within the storage engine. type StorageListObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. @@ -4685,16 +4488,16 @@ type StorageListObject struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageListObject) Reset() { *x = StorageListObject{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageListObject) String() string { @@ -4705,7 +4508,7 @@ func (*StorageListObject) ProtoMessage() {} func (x *StorageListObject) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4777,23 +4580,20 @@ func (x *StorageListObject) GetUpdateTime() *timestamppb.Timestamp { } type MatchList_Match struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The API match ApiMatch *api.Match `protobuf:"bytes,1,opt,name=api_match,json=apiMatch,proto3" json:"api_match,omitempty"` // The node name - Node string `protobuf:"bytes,2,opt,name=node,proto3" json:"node,omitempty"` + Node string `protobuf:"bytes,2,opt,name=node,proto3" json:"node,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchList_Match) Reset() { *x = MatchList_Match{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchList_Match) String() string { @@ -4804,7 +4604,7 @@ func (*MatchList_Match) ProtoMessage() {} func (x *MatchList_Match) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4835,23 +4635,20 @@ func (x *MatchList_Match) GetNode() string { // A warning for a configuration field. type Config_Warning struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The config field this warning is for in a JSON pointer format. Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` // Warning message text. - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Config_Warning) Reset() { *x = Config_Warning{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Config_Warning) String() string { @@ -4862,7 +4659,7 @@ func (*Config_Warning) ProtoMessage() {} func (x *Config_Warning) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4893,10 +4690,7 @@ func (x *Config_Warning) GetMessage() string { // A console user type UserList_User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Username of the user Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // Email of the user @@ -4906,16 +4700,16 @@ type UserList_User struct { // Whether the user is required to setup MFA. MfaRequired bool `protobuf:"varint,4,opt,name=mfa_required,json=mfaRequired,proto3" json:"mfa_required,omitempty"` // Whether the user has MFA enabled. - MfaEnabled bool `protobuf:"varint,5,opt,name=mfa_enabled,json=mfaEnabled,proto3" json:"mfa_enabled,omitempty"` + MfaEnabled bool `protobuf:"varint,5,opt,name=mfa_enabled,json=mfaEnabled,proto3" json:"mfa_enabled,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserList_User) Reset() { *x = UserList_User{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserList_User) String() string { @@ -4926,7 +4720,7 @@ func (*UserList_User) ProtoMessage() {} func (x *UserList_User) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4978,10 +4772,7 @@ func (x *UserList_User) GetMfaEnabled() bool { // The status of a Nakama node. type StatusList_Status struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Node name. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Health score. @@ -5001,16 +4792,16 @@ type StatusList_Status struct { // Average input bandwidth usage. AvgInputKbs float64 `protobuf:"fixed64,9,opt,name=avg_input_kbs,json=avgInputKbs,proto3" json:"avg_input_kbs,omitempty"` // Average output bandwidth usage. - AvgOutputKbs float64 `protobuf:"fixed64,10,opt,name=avg_output_kbs,json=avgOutputKbs,proto3" json:"avg_output_kbs,omitempty"` + AvgOutputKbs float64 `protobuf:"fixed64,10,opt,name=avg_output_kbs,json=avgOutputKbs,proto3" json:"avg_output_kbs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusList_Status) Reset() { *x = StatusList_Status{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusList_Status) String() string { @@ -5021,7 +4812,7 @@ func (*StatusList_Status) ProtoMessage() {} func (x *StatusList_Status) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5108,23 +4899,20 @@ func (x *StatusList_Status) GetAvgOutputKbs() float64 { // Module information type RuntimeInfo_ModuleInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Module path Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // Module last modified date - ModTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=mod_time,json=modTime,proto3" json:"mod_time,omitempty"` + ModTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=mod_time,json=modTime,proto3" json:"mod_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RuntimeInfo_ModuleInfo) Reset() { *x = RuntimeInfo_ModuleInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_console_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_console_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RuntimeInfo_ModuleInfo) String() string { @@ -5135,7 +4923,7 @@ func (*RuntimeInfo_ModuleInfo) ProtoMessage() {} func (x *RuntimeInfo_ModuleInfo) ProtoReflect() protoreflect.Message { mi := &file_console_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5166,1269 +4954,497 @@ func (x *RuntimeInfo_ModuleInfo) GetModTime() *timestamppb.Timestamp { var File_console_proto protoreflect.FileDescriptor -var file_console_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x0e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x1a, - 0x0d, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x38, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, - 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2f, 0x72, 0x74, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, - 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x54, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x6f, - 0x64, 0x79, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x77, 0x0a, 0x07, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x22, 0x6b, 0x0a, 0x14, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, 0x0f, 0x72, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xd9, 0x03, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x07, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x52, 0x12, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x5f, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x52, 0x0d, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x73, 0x22, 0x1b, 0x0a, 0x09, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x77, 0x0a, 0x0b, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x22, 0x19, 0x0a, 0x07, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x78, 0x0a, - 0x09, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, - 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x75, 0x0a, 0x0b, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, - 0x3d, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x93, - 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x07, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x1a, 0x4b, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x12, 0x2e, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x08, 0x61, 0x70, 0x69, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x6f, 0x64, 0x65, 0x22, 0xe8, 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2c, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x66, 0x61, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x66, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x17, 0x6e, 0x65, 0x77, 0x73, 0x6c, 0x65, - 0x74, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x6e, 0x65, 0x77, 0x73, 0x6c, 0x65, 0x74, - 0x74, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x66, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6a, 0x6f, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa2, 0x01, 0x0a, 0x0f, 0x41, 0x70, 0x69, 0x45, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x09, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x4a, 0x0a, 0x0d, 0x72, 0x70, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0c, - 0x72, 0x70, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x5f, 0x0a, 0x13, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, - 0x66, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x66, 0x61, 0x22, 0x43, 0x0a, - 0x1b, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4d, 0x46, 0x41, - 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x66, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x66, 0x61, 0x12, 0x12, - 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x22, 0x45, 0x0a, 0x1c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x4d, 0x46, 0x41, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x19, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xf9, 0x01, 0x0a, - 0x16, 0x43, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x0c, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x52, 0x0a, 0x17, 0x43, 0x61, 0x6c, 0x6c, - 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xbe, 0x01, 0x0a, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x3a, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, - 0x67, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x5f, 0x0a, - 0x0e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x66, 0x61, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x66, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x64, - 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, - 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, - 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x69, 0x64, 0x73, 0x22, 0x42, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x24, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x43, - 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x49, 0x64, 0x22, 0x48, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x31, 0x0a, - 0x13, 0x52, 0x65, 0x73, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x66, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x4f, 0x0a, 0x15, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x66, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x22, 0x4b, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2b, - 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x1a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x48, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, - 0x65, 0x64, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0xf8, 0x05, 0x0a, 0x0b, 0x4c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6d, - 0x61, 0x78, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, - 0x6e, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x65, 0x6e, 0x64, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, - 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6a, - 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x52, - 0x65, 0x73, 0x65, 0x74, 0x22, 0x30, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0c, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x0c, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x24, 0x0a, 0x12, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x65, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x74, 0x6f, 0x6d, 0x62, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x74, 0x6f, 0x6d, 0x62, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xa0, 0x02, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0b, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x22, 0x34, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4f, 0x4d, - 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x03, 0x12, 0x0a, 0x0a, - 0x06, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x04, 0x22, 0x43, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xae, - 0x03, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x36, - 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, - 0x69, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x30, 0x0a, - 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, - 0x61, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x22, 0x5d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, - 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x22, 0x61, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0x77, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x73, 0x0a, - 0x0a, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x22, 0x23, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xf9, 0x01, 0x0a, 0x0c, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, - 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, - 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x22, 0x98, 0x01, 0x0a, 0x10, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, - 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x35, - 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x8c, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0x3a, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x42, 0x0a, 0x13, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x22, 0xb6, 0x06, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, - 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x38, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x39, 0x0a, 0x09, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x38, 0x0a, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x52, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x1a, - 0x3c, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb0, 0x03, - 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, - 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, - 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x76, 0x61, - 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x76, 0x61, - 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x26, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x1a, 0xaa, 0x01, 0x0a, 0x04, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2c, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x66, 0x61, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x66, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x66, 0x61, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x66, 0x61, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xfc, 0x03, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, - 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0xfa, 0x02, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x23, - 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, - 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x67, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x76, 0x67, 0x5f, 0x6c, 0x61, 0x74, 0x65, - 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x61, 0x76, - 0x67, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x76, - 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x0a, 0x61, 0x76, 0x67, 0x52, 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x12, 0x22, 0x0a, 0x0d, - 0x61, 0x76, 0x67, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x6b, 0x62, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0b, 0x61, 0x76, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x4b, 0x62, 0x73, - 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x76, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6b, - 0x62, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x61, 0x76, 0x67, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x4b, 0x62, 0x73, 0x22, 0xbd, 0x03, 0x0a, 0x0b, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x75, 0x61, 0x5f, 0x72, 0x70, - 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0f, 0x6c, 0x75, 0x61, 0x52, 0x70, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x6f, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x6f, - 0x52, 0x70, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x6a, 0x73, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6a, 0x73, 0x52, 0x70, 0x63, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x09, 0x67, 0x6f, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, - 0x0b, 0x6c, 0x75, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x6c, 0x75, 0x61, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x6a, 0x73, 0x5f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x09, 0x6a, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x57, 0x0a, - 0x0a, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x35, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x6d, - 0x6f, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x0c, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x10, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, - 0x65, 0x64, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x05, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1f, 0x0a, - 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, - 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, - 0xa4, 0x02, 0x0a, 0x19, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x12, 0x46, - 0x0a, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x65, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x28, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x75, - 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x50, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, - 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc6, 0x02, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, - 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x72, 0x65, 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x2a, - 0x81, 0x01, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x11, - 0x55, 0x53, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, - 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52, - 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x56, 0x45, 0x4c, 0x4f, 0x50, 0x45, 0x52, 0x10, - 0x02, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4d, - 0x41, 0x49, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x55, - 0x53, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x4f, 0x4e, 0x4c, - 0x59, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, - 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, 0x41, - 0x4c, 0x54, 0x48, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, - 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, - 0x48, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x03, 0x32, 0xf6, 0x41, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x12, 0x83, 0x01, - 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x23, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x92, 0x41, 0x08, 0x62, 0x06, 0x0a, 0x04, 0x0a, 0x00, 0x12, 0x00, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x9a, 0x01, 0x0a, 0x14, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4d, 0x46, 0x41, 0x53, 0x65, 0x74, - 0x75, 0x70, 0x12, 0x2b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x4d, 0x46, 0x41, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4d, 0x46, 0x41, - 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x2f, 0x6d, 0x66, 0x61, 0x12, 0x5e, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x7a, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, - 0x22, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, - 0x64, 0x64, 0x12, 0x65, 0x0a, 0x0a, 0x42, 0x61, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x22, 0x1c, 0x2f, 0x76, 0x32, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x61, 0x6e, 0x12, 0x91, 0x01, 0x0a, 0x0f, 0x43, 0x61, - 0x6c, 0x6c, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x26, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, - 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x69, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x32, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7d, 0x12, 0x95, 0x01, - 0x0a, 0x0f, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x70, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x41, - 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x7b, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, - 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x2a, 0x0f, - 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x12, - 0x6f, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x12, 0x91, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, - 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x2a, 0x2b, 0x2f, 0x76, 0x32, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x2f, 0x7b, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x69, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x76, 0x32, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x12, 0x84, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x2a, 0x29, - 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0xd1, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x2a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x76, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x70, 0x5a, 0x3c, 0x2a, 0x3a, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, - 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x2a, 0x30, 0x2f, 0x76, 0x32, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, - 0x7d, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x5d, 0x0a, 0x0e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x75, 0x0a, 0x11, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, - 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1e, 0x2a, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x2e, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x2a, 0x2d, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x2f, 0x7b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x7e, 0x0a, 0x12, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x2a, 0x1d, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x2a, 0x10, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x8c, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x12, 0x29, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x2a, 0x2b, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x2f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2f, 0x7b, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x92, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x22, 0x30, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x72, 0x0a, 0x0d, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x6a, - 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x17, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x1a, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x32, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x57, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x1a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x68, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x1a, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, - 0x12, 0x1f, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x12, 0x56, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x17, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x1a, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x12, 0x16, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x67, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, - 0x1a, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x69, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x19, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x77, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, - 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, - 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5e, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x1a, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x12, 0x30, 0x2f, 0x76, - 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x7b, - 0x6b, 0x65, 0x79, 0x7d, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8c, - 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x65, 0x64, - 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x2f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x7e, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, - 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x6e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x83, 0x01, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, - 0x73, 0x65, 0x2f, 0x7b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x12, 0x9c, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x76, 0x32, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x12, 0x6e, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x41, 0x70, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x29, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x38, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x32, 0x12, 0x30, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x7c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x32, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x12, 0x6b, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x12, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x32, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x12, 0x81, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x27, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, - 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, - 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x12, 0x65, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x12, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x81, 0x01, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x20, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x67, - 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x22, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x19, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x6d, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, - 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x75, 0x72, 0x63, - 0x68, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x12, 0x14, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x70, 0x75, - 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x32, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x76, - 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x94, - 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x33, 0x22, 0x31, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x72, - 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x66, 0x61, 0x12, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x66, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, - 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x6d, 0x66, 0x61, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x12, 0x7a, 0x0a, 0x0c, 0x52, - 0x65, 0x73, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x66, 0x61, 0x12, 0x23, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x66, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, - 0x22, 0x25, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x66, - 0x61, 0x2f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x12, 0x69, 0x0a, 0x0c, 0x55, 0x6e, 0x62, 0x61, 0x6e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x20, 0x22, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x62, - 0x61, 0x6e, 0x12, 0x71, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x26, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x7e, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, - 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x45, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, - 0x25, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, - 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x6f, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, - 0x41, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, - 0x22, 0x25, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, - 0x6b, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x69, 0x6e, - 0x6b, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x30, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x8b, - 0x01, 0x0a, 0x19, 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x22, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x67, 0x61, 0x6d, 0x65, 0x12, 0x79, 0x0a, 0x10, - 0x55, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x2a, 0x2f, 0x76, 0x32, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x67, 0x61, 0x6d, - 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x71, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x69, 0x6e, - 0x6b, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x28, 0x22, 0x26, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x6c, - 0x69, 0x6e, 0x6b, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x6f, 0x0a, 0x0b, 0x55, 0x6e, - 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x27, 0x22, 0x25, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x72, 0x0a, 0x0d, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0x6c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x9a, 0x01, - 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x22, 0x3b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, 0x1a, 0x30, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, - 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xed, 0x02, 0x92, 0x41, 0xc0, - 0x02, 0x12, 0x7d, 0x0a, 0x15, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x22, 0x5f, 0x0a, 0x21, 0x54, 0x68, - 0x65, 0x20, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, - 0x20, 0x26, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x24, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x1a, 0x14, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x40, 0x68, 0x65, 0x72, - 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x32, 0x03, 0x32, 0x2e, 0x30, - 0x1a, 0x0e, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x37, 0x33, 0x35, 0x31, - 0x2a, 0x01, 0x01, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x5a, 0x33, 0x0a, 0x0f, 0x0a, 0x09, 0x42, 0x61, 0x73, - 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x02, 0x08, 0x01, 0x0a, 0x20, 0x0a, 0x09, 0x42, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, 0x12, 0x13, 0x08, 0x02, 0x1a, 0x0d, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0f, 0x0a, 0x0d, - 0x0a, 0x09, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, 0x12, 0x00, 0x72, 0x42, 0x0a, - 0x23, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x68, 0x65, - 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x6f, 0x63, - 0x73, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, - 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2f, - 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} +const file_console_proto_rawDesc = "" + + "\n" + + "\rconsole.proto\x12\x0enakama.console\x1a\rapi/api.proto\x1a8github.com/heroiclabs/nakama-common/rtapi/realtime.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\"T\n" + + "\x15ApiEndpointDescriptor\x12\x16\n" + + "\x06method\x18\x01 \x01(\tR\x06method\x12#\n" + + "\rbody_template\x18\x02 \x01(\tR\fbodyTemplate\"w\n" + + "\aAccount\x12-\n" + + "\aaccount\x18\x01 \x01(\v2\x13.nakama.api.AccountR\aaccount\x12=\n" + + "\fdisable_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\vdisableTime\"k\n" + + "\x14AccountDeleteRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12C\n" + + "\x0frecord_deletion\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x0erecordDeletion\"\xd9\x03\n" + + "\rAccountExport\x12-\n" + + "\aaccount\x18\x01 \x01(\v2\x13.nakama.api.AccountR\aaccount\x123\n" + + "\aobjects\x18\x02 \x03(\v2\x19.nakama.api.StorageObjectR\aobjects\x12,\n" + + "\afriends\x18\x03 \x03(\v2\x12.nakama.api.FriendR\afriends\x12)\n" + + "\x06groups\x18\x04 \x03(\v2\x11.nakama.api.GroupR\x06groups\x126\n" + + "\bmessages\x18\x05 \x03(\v2\x1a.nakama.api.ChannelMessageR\bmessages\x12N\n" + + "\x13leaderboard_records\x18\x06 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\x12leaderboardRecords\x12>\n" + + "\rnotifications\x18\a \x03(\v2\x18.nakama.api.NotificationR\rnotifications\x12C\n" + + "\x0ewallet_ledgers\x18\b \x03(\v2\x1c.nakama.console.WalletLedgerR\rwalletLedgers\"\x1b\n" + + "\tAccountId\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"w\n" + + "\vAccountList\x12&\n" + + "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\x12\x1f\n" + + "\vtotal_count\x18\x02 \x01(\x05R\n" + + "totalCount\x12\x1f\n" + + "\vnext_cursor\x18\x03 \x01(\tR\n" + + "nextCursor\"\x19\n" + + "\aGroupId\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"x\n" + + "\tGroupList\x12)\n" + + "\x06groups\x18\x01 \x03(\v2\x11.nakama.api.GroupR\x06groups\x12\x1f\n" + + "\vtotal_count\x18\x02 \x01(\x05R\n" + + "totalCount\x12\x1f\n" + + "\vnext_cursor\x18\x03 \x01(\tR\n" + + "nextCursor\"u\n" + + "\vGroupExport\x12'\n" + + "\x05group\x18\x01 \x01(\v2\x11.nakama.api.GroupR\x05group\x12=\n" + + "\amembers\x18\x02 \x03(\v2#.nakama.api.GroupUserList.GroupUserR\amembers\"\x93\x01\n" + + "\tMatchList\x129\n" + + "\amatches\x18\x01 \x03(\v2\x1f.nakama.console.MatchList.MatchR\amatches\x1aK\n" + + "\x05Match\x12.\n" + + "\tapi_match\x18\x01 \x01(\v2\x11.nakama.api.MatchR\bapiMatch\x12\x12\n" + + "\x04node\x18\x02 \x01(\tR\x04node\"\xe8\x01\n" + + "\x0eAddUserRequest\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12\x1a\n" + + "\bpassword\x18\x02 \x01(\tR\bpassword\x12\x14\n" + + "\x05email\x18\x03 \x01(\tR\x05email\x12,\n" + + "\x04role\x18\x04 \x01(\x0e2\x18.nakama.console.UserRoleR\x04role\x12!\n" + + "\fmfa_required\x18\x05 \x01(\bR\vmfaRequired\x127\n" + + "\x17newsletter_subscription\x18\x06 \x01(\bR\x16newsletterSubscription\"f\n" + + "\x14AddGroupUsersRequest\x12\x10\n" + + "\x03ids\x18\x01 \x01(\tR\x03ids\x12\x19\n" + + "\bgroup_id\x18\x02 \x01(\tR\agroupId\x12!\n" + + "\fjoin_request\x18\x03 \x01(\bR\vjoinRequest\"\xa2\x01\n" + + "\x0fApiEndpointList\x12C\n" + + "\tendpoints\x18\x01 \x03(\v2%.nakama.console.ApiEndpointDescriptorR\tendpoints\x12J\n" + + "\rrpc_endpoints\x18\x02 \x03(\v2%.nakama.console.ApiEndpointDescriptorR\frpcEndpoints\"_\n" + + "\x13AuthenticateRequest\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12\x1a\n" + + "\bpassword\x18\x02 \x01(\tR\bpassword\x12\x10\n" + + "\x03mfa\x18\x03 \x01(\tR\x03mfa\"C\n" + + "\x1bAuthenticateMFASetupRequest\x12\x10\n" + + "\x03mfa\x18\x01 \x01(\tR\x03mfa\x12\x12\n" + + "\x04code\x18\x02 \x01(\tR\x04code\"E\n" + + "\x1cAuthenticateMFASetupResponse\x12%\n" + + "\x0erecovery_codes\x18\x01 \x03(\tR\rrecoveryCodes\"1\n" + + "\x19AuthenticateLogoutRequest\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\"\xf9\x01\n" + + "\x16CallApiEndpointRequest\x12\x16\n" + + "\x06method\x18\x01 \x01(\tR\x06method\x12\x12\n" + + "\x04body\x18\x02 \x01(\tR\x04body\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\x12Z\n" + + "\fsession_vars\x18\x04 \x03(\v27.nakama.console.CallApiEndpointRequest.SessionVarsEntryR\vsessionVars\x1a>\n" + + "\x10SessionVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"R\n" + + "\x17CallApiEndpointResponse\x12\x12\n" + + "\x04body\x18\x01 \x01(\tR\x04body\x12#\n" + + "\rerror_message\x18\x02 \x01(\tR\ferrorMessage\"\xbe\x01\n" + + "\x06Config\x12\x16\n" + + "\x06config\x18\x01 \x01(\tR\x06config\x12:\n" + + "\bwarnings\x18\x02 \x03(\v2\x1e.nakama.console.Config.WarningR\bwarnings\x12%\n" + + "\x0eserver_version\x18\x03 \x01(\tR\rserverVersion\x1a9\n" + + "\aWarning\x12\x14\n" + + "\x05field\x18\x01 \x01(\tR\x05field\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\"_\n" + + "\x0eConsoleSession\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x127\n" + + "\bmfa_code\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\amfaCode\"d\n" + + "\x1cDeleteChannelMessagesRequest\x122\n" + + "\x06before\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\x06before\x12\x10\n" + + "\x03ids\x18\x02 \x03(\tR\x03ids\"B\n" + + "\x13DeleteFriendRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1b\n" + + "\tfriend_id\x18\x02 \x01(\tR\bfriendId\"$\n" + + "\x12DeleteGroupRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"C\n" + + "\x16DeleteGroupUserRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x19\n" + + "\bgroup_id\x18\x02 \x01(\tR\agroupId\"H\n" + + "\x1bUpdateGroupUserStateRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x19\n" + + "\bgroup_id\x18\x02 \x01(\tR\agroupId\"1\n" + + "\x13ResetUserMfaRequest\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"O\n" + + "\x15RequireUserMfaRequest\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12\x1a\n" + + "\brequired\x18\x02 \x01(\bR\brequired\"K\n" + + "\x1eDeleteLeaderboardRecordRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x19\n" + + "\bowner_id\x18\x02 \x01(\tR\aownerId\"+\n" + + "\x19DeleteNotificationRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"\x81\x01\n" + + "\x1aDeleteStorageObjectRequest\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\x12\x18\n" + + "\aversion\x18\x04 \x01(\tR\aversion\"H\n" + + "\x19DeleteWalletLedgerRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1b\n" + + "\twallet_id\x18\x02 \x01(\tR\bwalletId\"\xf8\x05\n" + + "\vLeaderboard\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + + "\x05title\x18\x02 \x01(\tR\x05title\x12 \n" + + "\vdescription\x18\x03 \x01(\tR\vdescription\x12\x1a\n" + + "\bcategory\x18\x04 \x01(\rR\bcategory\x12\x1d\n" + + "\n" + + "sort_order\x18\x05 \x01(\rR\tsortOrder\x12\x12\n" + + "\x04size\x18\x06 \x01(\rR\x04size\x12\x19\n" + + "\bmax_size\x18\a \x01(\rR\amaxSize\x12\"\n" + + "\rmax_num_score\x18\b \x01(\rR\vmaxNumScore\x12\x1a\n" + + "\boperator\x18\t \x01(\rR\boperator\x12\x1d\n" + + "\n" + + "end_active\x18\n" + + " \x01(\rR\tendActive\x12%\n" + + "\x0ereset_schedule\x18\v \x01(\tR\rresetSchedule\x12\x1a\n" + + "\bmetadata\x18\f \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x129\n" + + "\n" + + "start_time\x18\x0e \x01(\v2\x1a.google.protobuf.TimestampR\tstartTime\x125\n" + + "\bend_time\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\aendTime\x12\x1a\n" + + "\bduration\x18\x10 \x01(\rR\bduration\x12!\n" + + "\fstart_active\x18\x11 \x01(\rR\vstartActive\x12#\n" + + "\rjoin_required\x18\x12 \x01(\bR\fjoinRequired\x12$\n" + + "\rauthoritative\x18\x13 \x01(\bR\rauthoritative\x12\x1e\n" + + "\n" + + "tournament\x18\x14 \x01(\bR\n" + + "tournament\x12\x1d\n" + + "\n" + + "prev_reset\x18\x15 \x01(\rR\tprevReset\x12\x1d\n" + + "\n" + + "next_reset\x18\x16 \x01(\rR\tnextReset\"0\n" + + "\x16LeaderboardListRequest\x12\x16\n" + + "\x06cursor\x18\x01 \x01(\tR\x06cursor\"\x80\x01\n" + + "\x0fLeaderboardList\x12?\n" + + "\fleaderboards\x18\x01 \x03(\v2\x1b.nakama.console.LeaderboardR\fleaderboards\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"$\n" + + "\x12LeaderboardRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"e\n" + + "\x13ListAccountsRequest\x12\x16\n" + + "\x06filter\x18\x01 \x01(\tR\x06filter\x12\x1e\n" + + "\n" + + "tombstones\x18\x02 \x01(\bR\n" + + "tombstones\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"\xa0\x02\n" + + "\x1aListChannelMessagesRequest\x12C\n" + + "\x04type\x18\x01 \x01(\x0e2/.nakama.console.ListChannelMessagesRequest.TypeR\x04type\x12\x14\n" + + "\x05label\x18\x02 \x01(\tR\x05label\x12\x19\n" + + "\bgroup_id\x18\x03 \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\x04 \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\x05 \x01(\tR\tuserIdTwo\x12\x16\n" + + "\x06cursor\x18\x06 \x01(\tR\x06cursor\"4\n" + + "\x04Type\x12\v\n" + + "\aUNKNOWN\x10\x00\x12\b\n" + + "\x04ROOM\x10\x02\x12\t\n" + + "\x05GROUP\x10\x03\x12\n" + + "\n" + + "\x06DIRECT\x10\x04\"C\n" + + "\x11ListGroupsRequest\x12\x16\n" + + "\x06filter\x18\x01 \x01(\tR\x06filter\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xae\x03\n" + + "\x12ListMatchesRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12@\n" + + "\rauthoritative\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\rauthoritative\x122\n" + + "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x126\n" + + "\bmin_size\x18\x04 \x01(\v2\x1b.google.protobuf.Int32ValueR\aminSize\x126\n" + + "\bmax_size\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\amaxSize\x12\x19\n" + + "\bmatch_id\x18\x06 \x01(\tR\amatchId\x122\n" + + "\x05query\x18\a \x01(\v2\x1c.google.protobuf.StringValueR\x05query\x120\n" + + "\x04node\x18\b \x01(\v2\x1c.google.protobuf.StringValueR\x04node\"a\n" + + "\x18ListNotificationsRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"]\n" + + "\x14ListPurchasesRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"a\n" + + "\x18ListSubscriptionsRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"w\n" + + "\x12ListStorageRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x1e\n" + + "\n" + + "collection\x18\x03 \x01(\tR\n" + + "collection\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"s\n" + + "\n" + + "MatchState\x12;\n" + + "\tpresences\x18\x01 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x12\x12\n" + + "\x04tick\x18\x02 \x01(\x03R\x04tick\x12\x14\n" + + "\x05state\x18\x03 \x01(\tR\x05state\"#\n" + + "\x11MatchStateRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"\xf9\x01\n" + + "\fNotification\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x18\n" + + "\asubject\x18\x02 \x01(\tR\asubject\x12\x18\n" + + "\acontent\x18\x03 \x01(\tR\acontent\x12\x12\n" + + "\x04code\x18\x04 \x01(\x05R\x04code\x12\x1b\n" + + "\tsender_id\x18\x05 \x01(\tR\bsenderId\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12\x1e\n" + + "\n" + + "persistent\x18\a \x01(\bR\n" + + "persistent\x12\x17\n" + + "\auser_id\x18\b \x01(\tR\x06userId\"\x98\x01\n" + + "\x10NotificationList\x12B\n" + + "\rnotifications\x18\x01 \x03(\v2\x1c.nakama.console.NotificationR\rnotifications\x12\x1f\n" + + "\vnext_cursor\x18\x02 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\"5\n" + + "\x1dDeleteChannelMessagesResponse\x12\x14\n" + + "\x05total\x18\x01 \x01(\x03R\x05total\"\x8c\x01\n" + + "\vStorageList\x12;\n" + + "\aobjects\x18\x01 \x03(\v2!.nakama.console.StorageListObjectR\aobjects\x12\x1f\n" + + "\vtotal_count\x18\x02 \x01(\x05R\n" + + "totalCount\x12\x1f\n" + + "\vnext_cursor\x18\x03 \x01(\tR\n" + + "nextCursor\":\n" + + "\x16StorageCollectionsList\x12 \n" + + "\vcollections\x18\x03 \x03(\tR\vcollections\"B\n" + + "\x13UnlinkDeviceRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1b\n" + + "\tdevice_id\x18\x02 \x01(\tR\bdeviceId\"\xb6\x06\n" + + "\x14UpdateAccountRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x128\n" + + "\busername\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\busername\x12?\n" + + "\fdisplay_name\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\vdisplayName\x128\n" + + "\bmetadata\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\bmetadata\x12;\n" + + "\n" + + "avatar_url\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x127\n" + + "\blang_tag\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x128\n" + + "\blocation\x18\a \x01(\v2\x1c.google.protobuf.StringValueR\blocation\x128\n" + + "\btimezone\x18\b \x01(\v2\x1c.google.protobuf.StringValueR\btimezone\x129\n" + + "\tcustom_id\x18\t \x01(\v2\x1c.google.protobuf.StringValueR\bcustomId\x122\n" + + "\x05email\x18\n" + + " \x01(\v2\x1c.google.protobuf.StringValueR\x05email\x128\n" + + "\bpassword\x18\v \x01(\v2\x1c.google.protobuf.StringValueR\bpassword\x12R\n" + + "\n" + + "device_ids\x18\f \x03(\v23.nakama.console.UpdateAccountRequest.DeviceIdsEntryR\tdeviceIds\x124\n" + + "\x06wallet\x18\r \x01(\v2\x1c.google.protobuf.StringValueR\x06wallet\x1a<\n" + + "\x0eDeviceIdsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb0\x03\n" + + "\x12UpdateGroupRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x120\n" + + "\x04name\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12>\n" + + "\vdescription\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\vdescription\x127\n" + + "\blang_tag\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x128\n" + + "\bmetadata\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\bmetadata\x12;\n" + + "\n" + + "avatar_url\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x12.\n" + + "\x04open\x18\a \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\x128\n" + + "\tmax_count\x18\b \x01(\v2\x1b.google.protobuf.Int32ValueR\bmaxCount\"&\n" + + "\bUsername\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"\xec\x01\n" + + "\bUserList\x123\n" + + "\x05users\x18\x01 \x03(\v2\x1d.nakama.console.UserList.UserR\x05users\x1a\xaa\x01\n" + + "\x04User\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12\x14\n" + + "\x05email\x18\x02 \x01(\tR\x05email\x12,\n" + + "\x04role\x18\x03 \x01(\x0e2\x18.nakama.console.UserRoleR\x04role\x12!\n" + + "\fmfa_required\x18\x04 \x01(\bR\vmfaRequired\x12\x1f\n" + + "\vmfa_enabled\x18\x05 \x01(\bR\n" + + "mfaEnabled\"\xfc\x03\n" + + "\n" + + "StatusList\x127\n" + + "\x05nodes\x18\x01 \x03(\v2!.nakama.console.StatusList.StatusR\x05nodes\x128\n" + + "\ttimestamp\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x1a\xfa\x02\n" + + "\x06Status\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x124\n" + + "\x06health\x18\x02 \x01(\x0e2\x1c.nakama.console.StatusHealthR\x06health\x12#\n" + + "\rsession_count\x18\x03 \x01(\x05R\fsessionCount\x12%\n" + + "\x0epresence_count\x18\x04 \x01(\x05R\rpresenceCount\x12\x1f\n" + + "\vmatch_count\x18\x05 \x01(\x05R\n" + + "matchCount\x12'\n" + + "\x0fgoroutine_count\x18\x06 \x01(\x05R\x0egoroutineCount\x12$\n" + + "\x0eavg_latency_ms\x18\a \x01(\x01R\favgLatencyMs\x12 \n" + + "\favg_rate_sec\x18\b \x01(\x01R\n" + + "avgRateSec\x12\"\n" + + "\ravg_input_kbs\x18\t \x01(\x01R\vavgInputKbs\x12$\n" + + "\x0eavg_output_kbs\x18\n" + + " \x01(\x01R\favgOutputKbs\"\xbd\x03\n" + + "\vRuntimeInfo\x12*\n" + + "\x11lua_rpc_functions\x18\x01 \x03(\tR\x0fluaRpcFunctions\x12(\n" + + "\x10go_rpc_functions\x18\x02 \x03(\tR\x0egoRpcFunctions\x12(\n" + + "\x10js_rpc_functions\x18\x03 \x03(\tR\x0ejsRpcFunctions\x12E\n" + + "\n" + + "go_modules\x18\x04 \x03(\v2&.nakama.console.RuntimeInfo.ModuleInfoR\tgoModules\x12G\n" + + "\vlua_modules\x18\x05 \x03(\v2&.nakama.console.RuntimeInfo.ModuleInfoR\n" + + "luaModules\x12E\n" + + "\n" + + "js_modules\x18\x06 \x03(\v2&.nakama.console.RuntimeInfo.ModuleInfoR\tjsModules\x1aW\n" + + "\n" + + "ModuleInfo\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\x125\n" + + "\bmod_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\amodTime\"\xeb\x01\n" + + "\fWalletLedger\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x17\n" + + "\auser_id\x18\x02 \x01(\tR\x06userId\x12\x1c\n" + + "\tchangeset\x18\x03 \x01(\tR\tchangeset\x12\x1a\n" + + "\bmetadata\x18\x04 \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\"\x88\x01\n" + + "\x10WalletLedgerList\x122\n" + + "\x05items\x18\x01 \x03(\v2\x1c.nakama.console.WalletLedgerR\x05items\x12\x1f\n" + + "\vnext_cursor\x18\x02 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\"\xa4\x02\n" + + "\x19WriteStorageObjectRequest\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\x12\x14\n" + + "\x05value\x18\x04 \x01(\tR\x05value\x12\x18\n" + + "\aversion\x18\x05 \x01(\tR\aversion\x12D\n" + + "\x0fpermission_read\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\x0epermissionRead\x12F\n" + + "\x10permission_write\x18\a \x01(\v2\x1b.google.protobuf.Int32ValueR\x0fpermissionWrite\"e\n" + + "\x16GetWalletLedgerRequest\x12\x1d\n" + + "\n" + + "account_id\x18\x01 \x01(\tR\taccountId\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"(\n" + + "\x16GetNotificationRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\";\n" + + "\x12GetPurchaseRequest\x12%\n" + + "\x0etransaction_id\x18\x01 \x01(\tR\rtransactionId\"P\n" + + "\x16GetSubscriptionRequest\x126\n" + + "\x17original_transaction_id\x18\x01 \x01(\tR\x15originalTransactionId\"\xc6\x02\n" + + "\x11StorageListObject\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\x12\x18\n" + + "\aversion\x18\x04 \x01(\tR\aversion\x12'\n" + + "\x0fpermission_read\x18\x05 \x01(\x05R\x0epermissionRead\x12)\n" + + "\x10permission_write\x18\x06 \x01(\x05R\x0fpermissionWrite\x12;\n" + + "\vcreate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime*\x81\x01\n" + + "\bUserRole\x12\x15\n" + + "\x11USER_ROLE_UNKNOWN\x10\x00\x12\x13\n" + + "\x0fUSER_ROLE_ADMIN\x10\x01\x12\x17\n" + + "\x13USER_ROLE_DEVELOPER\x10\x02\x12\x18\n" + + "\x14USER_ROLE_MAINTAINER\x10\x03\x12\x16\n" + + "\x12USER_ROLE_READONLY\x10\x04*|\n" + + "\fStatusHealth\x12\x14\n" + + "\x10STATUS_HEALTH_OK\x10\x00\x12\x17\n" + + "\x13STATUS_HEALTH_ERROR\x10\x01\x12\x1c\n" + + "\x18STATUS_HEALTH_CONNECTING\x10\x02\x12\x1f\n" + + "\x1bSTATUS_HEALTH_DISCONNECTING\x10\x032\xf6A\n" + + "\aConsole\x12\x83\x01\n" + + "\fAuthenticate\x12#.nakama.console.AuthenticateRequest\x1a\x1e.nakama.console.ConsoleSession\".\x92A\bb\x06\n" + + "\x04\n" + + "\x00\x12\x00\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/console/authenticate\x12\x83\x01\n" + + "\x12AuthenticateLogout\x12).nakama.console.AuthenticateLogoutRequest\x1a\x16.google.protobuf.Empty\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/v2/console/authenticate/logout\x12\x9a\x01\n" + + "\x14AuthenticateMFASetup\x12+.nakama.console.AuthenticateMFASetupRequest\x1a,.nakama.console.AuthenticateMFASetupResponse\"'\x82\xd3\xe4\x93\x02!:\x01*\"\x1c/v2/console/authenticate/mfa\x12^\n" + + "\aAddUser\x12\x1e.nakama.console.AddUserRequest\x1a\x16.google.protobuf.Empty\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v2/console/user\x12z\n" + + "\rAddGroupUsers\x12$.nakama.console.AddGroupUsersRequest\x1a\x16.google.protobuf.Empty\"+\x82\xd3\xe4\x93\x02%:\x01*\" /v2/console/group/{group_id}/add\x12e\n" + + "\n" + + "BanAccount\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e\"\x1c/v2/console/account/{id}/ban\x12\x91\x01\n" + + "\x0fCallApiEndpoint\x12&.nakama.console.CallApiEndpointRequest\x1a'.nakama.console.CallApiEndpointResponse\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/v2/console/api/endpoints/{method}\x12\x95\x01\n" + + "\x0fCallRpcEndpoint\x12&.nakama.console.CallApiEndpointRequest\x1a'.nakama.console.CallApiEndpointResponse\"1\x82\xd3\xe4\x93\x02+:\x01*\"&/v2/console/api/endpoints/rpc/{method}\x12X\n" + + "\rDeleteAllData\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x17\x82\xd3\xe4\x93\x02\x11*\x0f/v2/console/all\x12o\n" + + "\rDeleteAccount\x12$.nakama.console.AccountDeleteRequest\x1a\x16.google.protobuf.Empty\" \x82\xd3\xe4\x93\x02\x1a*\x18/v2/console/account/{id}\x12\x91\x01\n" + + "\x15DeleteChannelMessages\x12,.nakama.console.DeleteChannelMessagesRequest\x1a-.nakama.console.DeleteChannelMessagesResponse\"\x1b\x82\xd3\xe4\x93\x02\x15*\x13/v2/console/message\x12\x80\x01\n" + + "\fDeleteFriend\x12#.nakama.console.DeleteFriendRequest\x1a\x16.google.protobuf.Empty\"3\x82\xd3\xe4\x93\x02-*+/v2/console/account/{id}/friend/{friend_id}\x12i\n" + + "\vDeleteGroup\x12\".nakama.console.DeleteGroupRequest\x1a\x16.google.protobuf.Empty\"\x1e\x82\xd3\xe4\x93\x02\x18*\x16/v2/console/group/{id}\x12\x84\x01\n" + + "\x0fDeleteGroupUser\x12&.nakama.console.DeleteGroupUserRequest\x1a\x16.google.protobuf.Empty\"1\x82\xd3\xe4\x93\x02+*)/v2/console/account/{id}/group/{group_id}\x12\\\n" + + "\rDeleteStorage\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x1b\x82\xd3\xe4\x93\x02\x15*\x13/v2/console/storage\x12\xd1\x01\n" + + "\x13DeleteStorageObject\x12*.nakama.console.DeleteStorageObjectRequest\x1a\x16.google.protobuf.Empty\"v\x82\xd3\xe4\x93\x02pZ<*:/v2/console/storage/{collection}/{key}/{user_id}/{version}*0/v2/console/storage/{collection}/{key}/{user_id}\x12]\n" + + "\x0eDeleteAccounts\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x1b\x82\xd3\xe4\x93\x02\x15*\x13/v2/console/account\x12u\n" + + "\x11DeleteLeaderboard\x12\".nakama.console.LeaderboardRequest\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e*\x1c/v2/console/leaderboard/{id}\x12\x98\x01\n" + + "\x17DeleteLeaderboardRecord\x12..nakama.console.DeleteLeaderboardRecordRequest\x1a\x16.google.protobuf.Empty\"5\x82\xd3\xe4\x93\x02/*-/v2/console/leaderboard/{id}/owner/{owner_id}\x12~\n" + + "\x12DeleteNotification\x12).nakama.console.DeleteNotificationRequest\x1a\x16.google.protobuf.Empty\"%\x82\xd3\xe4\x93\x02\x1f*\x1d/v2/console/notification/{id}\x12X\n" + + "\n" + + "DeleteUser\x12\x18.nakama.console.Username\x1a\x16.google.protobuf.Empty\"\x18\x82\xd3\xe4\x93\x02\x12*\x10/v2/console/user\x12\x8c\x01\n" + + "\x12DeleteWalletLedger\x12).nakama.console.DeleteWalletLedgerRequest\x1a\x16.google.protobuf.Empty\"3\x82\xd3\xe4\x93\x02-*+/v2/console/account/{id}/wallet/{wallet_id}\x12\x92\x01\n" + + "\x11DemoteGroupMember\x12+.nakama.console.UpdateGroupUserStateRequest\x1a\x16.google.protobuf.Empty\"8\x82\xd3\xe4\x93\x022\"0/v2/console/group/{group_id}/account/{id}/demote\x12r\n" + + "\rExportAccount\x12\x19.nakama.console.AccountId\x1a\x1d.nakama.console.AccountExport\"'\x82\xd3\xe4\x93\x02!\x12\x1f/v2/console/account/{id}/export\x12j\n" + + "\vExportGroup\x12\x17.nakama.console.GroupId\x1a\x1b.nakama.console.GroupExport\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/v2/console/group/{id}/export\x12b\n" + + "\n" + + "GetAccount\x12\x19.nakama.console.AccountId\x1a\x17.nakama.console.Account\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/v2/console/account/{id}\x12W\n" + + "\tGetConfig\x12\x16.google.protobuf.Empty\x1a\x16.nakama.console.Config\"\x1a\x82\xd3\xe4\x93\x02\x14\x12\x12/v2/console/config\x12h\n" + + "\n" + + "GetFriends\x12\x19.nakama.console.AccountId\x1a\x16.nakama.api.FriendList\"'\x82\xd3\xe4\x93\x02!\x12\x1f/v2/console/account/{id}/friend\x12V\n" + + "\bGetGroup\x12\x17.nakama.console.GroupId\x1a\x11.nakama.api.Group\"\x1e\x82\xd3\xe4\x93\x02\x18\x12\x16/v2/console/group/{id}\x12g\n" + + "\n" + + "GetMembers\x12\x17.nakama.console.GroupId\x1a\x19.nakama.api.GroupUserList\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/v2/console/group/{id}/member\x12i\n" + + "\tGetGroups\x12\x19.nakama.console.AccountId\x1a\x19.nakama.api.UserGroupList\"&\x82\xd3\xe4\x93\x02 \x12\x1e/v2/console/account/{id}/group\x12w\n" + + "\x0eGetLeaderboard\x12\".nakama.console.LeaderboardRequest\x1a\x1b.nakama.console.Leaderboard\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/v2/console/leaderboard/{id}\x12t\n" + + "\rGetMatchState\x12!.nakama.console.MatchStateRequest\x1a\x1a.nakama.console.MatchState\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/v2/console/match/{id}/state\x12^\n" + + "\n" + + "GetRuntime\x12\x16.google.protobuf.Empty\x1a\x1b.nakama.console.RuntimeInfo\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/v2/console/runtime\x12[\n" + + "\tGetStatus\x12\x16.google.protobuf.Empty\x1a\x1a.nakama.console.StatusList\"\x1a\x82\xd3\xe4\x93\x02\x14\x12\x12/v2/console/status\x12\x82\x01\n" + + "\n" + + "GetStorage\x12\x1f.nakama.api.ReadStorageObjectId\x1a\x19.nakama.api.StorageObject\"8\x82\xd3\xe4\x93\x022\x120/v2/console/storage/{collection}/{key}/{user_id}\x12\x8c\x01\n" + + "\x0fGetWalletLedger\x12&.nakama.console.GetWalletLedgerRequest\x1a .nakama.console.WalletLedgerList\"/\x82\xd3\xe4\x93\x02)\x12'/v2/console/account/{account_id}/wallet\x12~\n" + + "\x0fGetNotification\x12&.nakama.console.GetNotificationRequest\x1a\x1c.nakama.console.Notification\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/v2/console/notification/{id}\x12\x83\x01\n" + + "\vGetPurchase\x12\".nakama.console.GetPurchaseRequest\x1a\x1d.nakama.api.ValidatedPurchase\"1\x82\xd3\xe4\x93\x02+\x12)/v2/console/iap/purchase/{transaction_id}\x12\x9c\x01\n" + + "\x0fGetSubscription\x12&.nakama.console.GetSubscriptionRequest\x1a!.nakama.api.ValidatedSubscription\">\x82\xd3\xe4\x93\x028\x126/v2/console/iap/subscription/{original_transaction_id}\x12n\n" + + "\x10ListApiEndpoints\x12\x16.google.protobuf.Empty\x1a\x1f.nakama.console.ApiEndpointList\"!\x82\xd3\xe4\x93\x02\x1b\x12\x19/v2/console/api/endpoints\x12\xa0\x01\n" + + "\x16ListLeaderboardRecords\x12).nakama.api.ListLeaderboardRecordsRequest\x1a!.nakama.api.LeaderboardRecordList\"8\x82\xd3\xe4\x93\x022\x120/v2/console/leaderboard/{leaderboard_id}/records\x12|\n" + + "\x10ListLeaderboards\x12&.nakama.console.LeaderboardListRequest\x1a\x1f.nakama.console.LeaderboardList\"\x1f\x82\xd3\xe4\x93\x02\x19\x12\x17/v2/console/leaderboard\x12k\n" + + "\vListStorage\x12\".nakama.console.ListStorageRequest\x1a\x1b.nakama.console.StorageList\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/v2/console/storage\x12\x81\x01\n" + + "\x16ListStorageCollections\x12\x16.google.protobuf.Empty\x1a&.nakama.console.StorageCollectionsList\"'\x82\xd3\xe4\x93\x02!\x12\x1f/v2/console/storage/collections\x12m\n" + + "\fListAccounts\x12#.nakama.console.ListAccountsRequest\x1a\x1b.nakama.console.AccountList\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/v2/console/account\x12~\n" + + "\x13ListChannelMessages\x12*.nakama.console.ListChannelMessagesRequest\x1a\x1e.nakama.api.ChannelMessageList\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/v2/console/channel\x12e\n" + + "\n" + + "ListGroups\x12!.nakama.console.ListGroupsRequest\x1a\x19.nakama.console.GroupList\"\x19\x82\xd3\xe4\x93\x02\x13\x12\x11/v2/console/group\x12\x81\x01\n" + + "\x11ListNotifications\x12(.nakama.console.ListNotificationsRequest\x1a .nakama.console.NotificationList\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/v2/console/notification\x12g\n" + + "\vListMatches\x12\".nakama.console.ListMatchesRequest\x1a\x19.nakama.console.MatchList\"\x19\x82\xd3\xe4\x93\x02\x13\x12\x11/v2/console/match\x12m\n" + + "\rListPurchases\x12$.nakama.console.ListPurchasesRequest\x1a\x18.nakama.api.PurchaseList\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/v2/console/purchase\x12}\n" + + "\x11ListSubscriptions\x12(.nakama.console.ListSubscriptionsRequest\x1a\x1c.nakama.api.SubscriptionList\" \x82\xd3\xe4\x93\x02\x1a\x12\x18/v2/console/subscription\x12W\n" + + "\tListUsers\x12\x16.google.protobuf.Empty\x1a\x18.nakama.console.UserList\"\x18\x82\xd3\xe4\x93\x02\x12\x12\x10/v2/console/user\x12\x94\x01\n" + + "\x12PromoteGroupMember\x12+.nakama.console.UpdateGroupUserStateRequest\x1a\x16.google.protobuf.Empty\"9\x82\xd3\xe4\x93\x023\"1/v2/console/group/{group_id}/account/{id}/promote\x12\x83\x01\n" + + "\x0eRequireUserMfa\x12%.nakama.console.RequireUserMfaRequest\x1a\x16.google.protobuf.Empty\"2\x82\xd3\xe4\x93\x02,:\x01*\"'/v2/console/user/{username}/mfa/require\x12z\n" + + "\fResetUserMfa\x12#.nakama.console.ResetUserMfaRequest\x1a\x16.google.protobuf.Empty\"-\x82\xd3\xe4\x93\x02'\"%/v2/console/user/{username}/mfa/reset\x12i\n" + + "\fUnbanAccount\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\"&\x82\xd3\xe4\x93\x02 \"\x1e/v2/console/account/{id}/unban\x12q\n" + + "\fUnlinkCustom\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\".\x82\xd3\xe4\x93\x02(\"&/v2/console/account/{id}/unlink/custom\x12~\n" + + "\fUnlinkDevice\x12#.nakama.console.UnlinkDeviceRequest\x1a\x16.google.protobuf.Empty\"1\x82\xd3\xe4\x93\x02+:\x01*\"&/v2/console/account/{id}/unlink/device\x12o\n" + + "\vUnlinkEmail\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\"-\x82\xd3\xe4\x93\x02'\"%/v2/console/account/{id}/unlink/email\x12o\n" + + "\vUnlinkApple\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\"-\x82\xd3\xe4\x93\x02'\"%/v2/console/account/{id}/unlink/apple\x12u\n" + + "\x0eUnlinkFacebook\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\"0\x82\xd3\xe4\x93\x02*\"(/v2/console/account/{id}/unlink/facebook\x12\x8b\x01\n" + + "\x19UnlinkFacebookInstantGame\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\";\x82\xd3\xe4\x93\x025\"3/v2/console/account/{id}/unlink/facebookinstantgame\x12y\n" + + "\x10UnlinkGameCenter\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\"2\x82\xd3\xe4\x93\x02,\"*/v2/console/account/{id}/unlink/gamecenter\x12q\n" + + "\fUnlinkGoogle\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\".\x82\xd3\xe4\x93\x02(\"&/v2/console/account/{id}/unlink/google\x12o\n" + + "\vUnlinkSteam\x12\x19.nakama.console.AccountId\x1a\x16.google.protobuf.Empty\"-\x82\xd3\xe4\x93\x02'\"%/v2/console/account/{id}/unlink/steam\x12r\n" + + "\rUpdateAccount\x12$.nakama.console.UpdateAccountRequest\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/console/account/{id}\x12l\n" + + "\vUpdateGroup\x12\".nakama.console.UpdateGroupRequest\x1a\x16.google.protobuf.Empty\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/console/group/{id}\x12\x9a\x01\n" + + "\x12WriteStorageObject\x12).nakama.console.WriteStorageObjectRequest\x1a\x1c.nakama.api.StorageObjectAck\";\x82\xd3\xe4\x93\x025:\x01*\x1a0/v2/console/storage/{collection}/{key}/{user_id}B\xed\x02\x92A\xc0\x02\x12}\n" + + "\x15Nakama console API v2\"_\n" + + "!The Nakama Authors & Contributors\x12$https://github.com/heroiclabs/nakama\x1a\x14hello@heroiclabs.com2\x032.0\x1a\x0e127.0.0.1:7351*\x01\x012\x10application/json:\x10application/jsonZ3\n" + + "\x0f\n" + + "\tBasicAuth\x12\x02\b\x01\n" + + " \n" + + "\tBearerJwt\x12\x13\b\x02\x1a\rAuthorization \x02b\x0f\n" + + "\r\n" + + "\tBearerJwt\x12\x00rB\n" + + "#Nakama server console documentation\x12\x1bhttps://heroiclabs.com/docsZ'github.com/heroiclabs/nakama/v3/consoleb\x06proto3" var ( file_console_proto_rawDescOnce sync.Once - file_console_proto_rawDescData = file_console_proto_rawDesc + file_console_proto_rawDescData []byte ) func file_console_proto_rawDescGZIP() []byte { file_console_proto_rawDescOnce.Do(func() { - file_console_proto_rawDescData = protoimpl.X.CompressGZIP(file_console_proto_rawDescData) + file_console_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_console_proto_rawDesc), len(file_console_proto_rawDesc))) }) return file_console_proto_rawDescData } var file_console_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_console_proto_msgTypes = make([]protoimpl.MessageInfo, 73) -var file_console_proto_goTypes = []interface{}{ +var file_console_proto_goTypes = []any{ (UserRole)(0), // 0: nakama.console.UserRole (StatusHealth)(0), // 1: nakama.console.StatusHealth (ListChannelMessagesRequest_Type)(0), // 2: nakama.console.ListChannelMessagesRequest.Type @@ -6760,865 +5776,11 @@ func file_console_proto_init() { if File_console_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_console_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiEndpointDescriptor); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Account); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountDeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountExport); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupExport); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddUserRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiEndpointList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateMFASetupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateMFASetupResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateLogoutRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CallApiEndpointRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CallApiEndpointResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Config); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConsoleSession); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteChannelMessagesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteFriendRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteGroupUserRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateGroupUserStateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetUserMfaRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequireUserMfaRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteLeaderboardRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNotificationRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWalletLedgerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Leaderboard); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAccountsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListChannelMessagesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGroupsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMatchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNotificationsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPurchasesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSubscriptionsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStorageRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchState); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchStateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Notification); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NotificationList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteChannelMessagesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageCollectionsList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnlinkDeviceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAccountRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Username); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RuntimeInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WalletLedger); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WalletLedgerList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteStorageObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWalletLedgerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNotificationRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPurchaseRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSubscriptionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageListObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchList_Match); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Config_Warning); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserList_User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusList_Status); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_console_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RuntimeInfo_ModuleInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_console_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_console_proto_rawDesc), len(file_console_proto_rawDesc)), NumEnums: 3, NumMessages: 73, NumExtensions: 0, @@ -7630,7 +5792,6 @@ func file_console_proto_init() { MessageInfos: file_console_proto_msgTypes, }.Build() File_console_proto = out.File - file_console_proto_rawDesc = nil file_console_proto_goTypes = nil file_console_proto_depIdxs = nil } diff --git a/console/console.pb.gw.go b/console/console.pb.gw.go index 77cd0924f2..cc4b4ee033 100644 --- a/console/console.pb.gw.go +++ b/console/console.pb.gw.go @@ -10,6 +10,7 @@ package console import ( "context" + "errors" "io" "net/http" @@ -26,3614 +27,2697 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_Console_Authenticate_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AuthenticateRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AuthenticateRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Authenticate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_Authenticate_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AuthenticateRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AuthenticateRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Authenticate(ctx, &protoReq) return msg, metadata, err - } func request_Console_AuthenticateLogout_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AuthenticateLogoutRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AuthenticateLogoutRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateLogout(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_AuthenticateLogout_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AuthenticateLogoutRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AuthenticateLogoutRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateLogout(ctx, &protoReq) return msg, metadata, err - } func request_Console_AuthenticateMFASetup_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AuthenticateMFASetupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AuthenticateMFASetupRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AuthenticateMFASetup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_AuthenticateMFASetup_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AuthenticateMFASetupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AuthenticateMFASetupRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AuthenticateMFASetup(ctx, &protoReq) return msg, metadata, err - } func request_Console_AddUser_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddUserRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddUserRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AddUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_AddUser_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddUserRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddUserRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AddUser(ctx, &protoReq) return msg, metadata, err - } func request_Console_AddGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddGroupUsersRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq AddGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := client.AddGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_AddGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddGroupUsersRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq AddGroupUsersRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := server.AddGroupUsers(ctx, &protoReq) return msg, metadata, err - } func request_Console_BanAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.BanAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_BanAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.BanAccount(ctx, &protoReq) return msg, metadata, err - } func request_Console_CallApiEndpoint_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CallApiEndpointRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq CallApiEndpointRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["method"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["method"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "method") } - protoReq.Method, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "method", err) } - msg, err := client.CallApiEndpoint(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_CallApiEndpoint_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CallApiEndpointRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq CallApiEndpointRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["method"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["method"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "method") } - protoReq.Method, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "method", err) } - msg, err := server.CallApiEndpoint(ctx, &protoReq) return msg, metadata, err - } func request_Console_CallRpcEndpoint_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CallApiEndpointRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq CallApiEndpointRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["method"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["method"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "method") } - protoReq.Method, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "method", err) } - msg, err := client.CallRpcEndpoint(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_CallRpcEndpoint_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CallApiEndpointRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq CallApiEndpointRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["method"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["method"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "method") } - protoReq.Method, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "method", err) } - msg, err := server.CallRpcEndpoint(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteAllData_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.DeleteAllData(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteAllData_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.DeleteAllData(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_DeleteAccount_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} -) +var filter_Console_DeleteAccount_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Console_DeleteAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountDeleteRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountDeleteRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteAccount_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountDeleteRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountDeleteRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteAccount_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteAccount(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_DeleteChannelMessages_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_DeleteChannelMessages_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_DeleteChannelMessages_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteChannelMessagesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteChannelMessagesRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteChannelMessages_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteChannelMessages(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteChannelMessages_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteChannelMessagesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteChannelMessagesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteChannelMessages_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteChannelMessages(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteFriend_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteFriendRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteFriendRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["friend_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "friend_id") } - protoReq.FriendId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "friend_id", err) } - msg, err := client.DeleteFriend(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteFriend_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteFriendRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteFriendRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["friend_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "friend_id") } - protoReq.FriendId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "friend_id", err) } - msg, err := server.DeleteFriend(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteGroup_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.DeleteGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteGroup_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteGroupRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.DeleteGroup(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteGroupUser_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteGroupUserRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteGroupUserRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := client.DeleteGroupUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteGroupUser_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteGroupUserRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteGroupUserRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - msg, err := server.DeleteGroupUser(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteStorage_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.DeleteStorage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteStorage_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.DeleteStorage(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_DeleteStorageObject_0 = &utilities.DoubleArray{Encoding: map[string]int{"collection": 0, "key": 1, "user_id": 2, "userId": 3}, Base: []int{1, 2, 4, 5, 6, 0, 0, 0, 0, 0, 0}, Check: []int{0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5}} -) +var filter_Console_DeleteStorageObject_0 = &utilities.DoubleArray{Encoding: map[string]int{"collection": 0, "key": 1, "user_id": 2}, Base: []int{1, 1, 2, 3, 0, 0, 0}, Check: []int{0, 1, 1, 1, 2, 3, 4}} func request_Console_DeleteStorageObject_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteStorageObjectRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteStorageObjectRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteStorageObject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteStorageObject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteStorageObject_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteStorageObjectRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteStorageObjectRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteStorageObject_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteStorageObject(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteStorageObject_1(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteStorageObjectRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteStorageObjectRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - val, ok = pathParams["version"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "version") } - protoReq.Version, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "version", err) } - msg, err := client.DeleteStorageObject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteStorageObject_1(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteStorageObjectRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteStorageObjectRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - val, ok = pathParams["version"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "version") } - protoReq.Version, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "version", err) } - msg, err := server.DeleteStorageObject(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteAccounts_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.DeleteAccounts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteAccounts_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.DeleteAccounts(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteLeaderboard_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LeaderboardRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq LeaderboardRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.DeleteLeaderboard(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteLeaderboard_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LeaderboardRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq LeaderboardRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.DeleteLeaderboard(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteLeaderboardRecordRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteLeaderboardRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["owner_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "owner_id") } - protoReq.OwnerId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "owner_id", err) } - msg, err := client.DeleteLeaderboardRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteLeaderboardRecordRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteLeaderboardRecordRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["owner_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "owner_id") } - protoReq.OwnerId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "owner_id", err) } - msg, err := server.DeleteLeaderboardRecord(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteNotification_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteNotificationRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteNotificationRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.DeleteNotification(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteNotification_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteNotificationRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteNotificationRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.DeleteNotification(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_DeleteUser_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_DeleteUser_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_DeleteUser_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq Username - var metadata runtime.ServerMetadata - + var ( + protoReq Username + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteUser_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteUser_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq Username - var metadata runtime.ServerMetadata - + var ( + protoReq Username + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_DeleteUser_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteUser(ctx, &protoReq) return msg, metadata, err - } func request_Console_DeleteWalletLedger_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteWalletLedgerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteWalletLedgerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["wallet_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "wallet_id") } - protoReq.WalletId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "wallet_id", err) } - msg, err := client.DeleteWalletLedger(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DeleteWalletLedger_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteWalletLedgerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteWalletLedgerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["wallet_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "wallet_id") } - protoReq.WalletId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "wallet_id", err) } - msg, err := server.DeleteWalletLedger(ctx, &protoReq) return msg, metadata, err - } func request_Console_DemoteGroupMember_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateGroupUserStateRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq UpdateGroupUserStateRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - val, ok = pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.DemoteGroupMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_DemoteGroupMember_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateGroupUserStateRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq UpdateGroupUserStateRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - val, ok = pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.DemoteGroupMember(ctx, &protoReq) return msg, metadata, err - } func request_Console_ExportAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.ExportAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ExportAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.ExportAccount(ctx, &protoReq) return msg, metadata, err - } func request_Console_ExportGroup_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GroupId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GroupId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.ExportGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ExportGroup_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GroupId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GroupId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.ExportGroup(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetAccount(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.GetConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.GetConfig(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetFriends_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetFriends(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetFriends_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetFriends(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetGroup_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GroupId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GroupId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetGroup_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GroupId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GroupId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetGroup(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetMembers_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GroupId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GroupId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetMembers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetMembers_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GroupId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GroupId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetMembers(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetGroups_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetGroups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetGroups_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetGroups(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetLeaderboard_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LeaderboardRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq LeaderboardRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetLeaderboard(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetLeaderboard_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LeaderboardRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq LeaderboardRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetLeaderboard(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetMatchState_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MatchStateRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq MatchStateRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetMatchState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetMatchState_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MatchStateRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq MatchStateRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetMatchState(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetRuntime_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.GetRuntime(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetRuntime_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.GetRuntime(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetStatus_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.GetStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetStatus_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.GetStatus(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetStorage_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ReadStorageObjectId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ReadStorageObjectId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - msg, err := client.GetStorage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetStorage_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ReadStorageObjectId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ReadStorageObjectId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - msg, err := server.GetStorage(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_GetWalletLedger_0 = &utilities.DoubleArray{Encoding: map[string]int{"account_id": 0, "accountId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Console_GetWalletLedger_0 = &utilities.DoubleArray{Encoding: map[string]int{"account_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Console_GetWalletLedger_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetWalletLedgerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetWalletLedgerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["account_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["account_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "account_id") } - protoReq.AccountId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "account_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_GetWalletLedger_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetWalletLedger(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetWalletLedger_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetWalletLedgerRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetWalletLedgerRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["account_id"] + val, ok := pathParams["account_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "account_id") } - protoReq.AccountId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "account_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_GetWalletLedger_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetWalletLedger(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetNotification_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetNotificationRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetNotificationRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.GetNotification(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetNotification_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetNotificationRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetNotificationRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.GetNotification(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetPurchase_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPurchaseRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetPurchaseRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["transaction_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["transaction_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "transaction_id") } - protoReq.TransactionId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "transaction_id", err) } - msg, err := client.GetPurchase(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetPurchase_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPurchaseRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetPurchaseRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["transaction_id"] + val, ok := pathParams["transaction_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "transaction_id") } - protoReq.TransactionId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "transaction_id", err) } - msg, err := server.GetPurchase(ctx, &protoReq) return msg, metadata, err - } func request_Console_GetSubscription_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetSubscriptionRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetSubscriptionRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["original_transaction_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["original_transaction_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "original_transaction_id") } - protoReq.OriginalTransactionId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "original_transaction_id", err) } - msg, err := client.GetSubscription(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_GetSubscription_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetSubscriptionRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetSubscriptionRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["original_transaction_id"] + val, ok := pathParams["original_transaction_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "original_transaction_id") } - protoReq.OriginalTransactionId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "original_transaction_id", err) } - msg, err := server.GetSubscription(ctx, &protoReq) return msg, metadata, err - } func request_Console_ListApiEndpoints_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.ListApiEndpoints(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListApiEndpoints_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.ListApiEndpoints(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListLeaderboardRecords_0 = &utilities.DoubleArray{Encoding: map[string]int{"leaderboard_id": 0, "leaderboardId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_Console_ListLeaderboardRecords_0 = &utilities.DoubleArray{Encoding: map[string]int{"leaderboard_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_Console_ListLeaderboardRecords_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListLeaderboardRecordsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListLeaderboardRecordsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListLeaderboardRecords_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListLeaderboardRecords(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListLeaderboardRecords_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq api.ListLeaderboardRecordsRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq api.ListLeaderboardRecordsRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["leaderboard_id"] + val, ok := pathParams["leaderboard_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "leaderboard_id") } - protoReq.LeaderboardId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "leaderboard_id", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListLeaderboardRecords_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListLeaderboardRecords(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListLeaderboards_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListLeaderboards_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListLeaderboards_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LeaderboardListRequest - var metadata runtime.ServerMetadata - + var ( + protoReq LeaderboardListRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListLeaderboards_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListLeaderboards(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListLeaderboards_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LeaderboardListRequest - var metadata runtime.ServerMetadata - + var ( + protoReq LeaderboardListRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListLeaderboards_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListLeaderboards(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListStorage_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListStorage_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListStorage_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListStorageRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListStorageRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListStorage_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListStorage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListStorage_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListStorageRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListStorageRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListStorage_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListStorage(ctx, &protoReq) return msg, metadata, err - } func request_Console_ListStorageCollections_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.ListStorageCollections(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListStorageCollections_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.ListStorageCollections(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListAccounts_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListAccounts_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListAccounts_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListAccountsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListAccountsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListAccounts_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListAccounts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListAccounts_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListAccountsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListAccountsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListAccounts_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListAccounts(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListChannelMessages_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListChannelMessages_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListChannelMessages_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListChannelMessagesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListChannelMessagesRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListChannelMessages_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListChannelMessages(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListChannelMessages_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListChannelMessagesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListChannelMessagesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListChannelMessages_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListChannelMessages(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListGroups_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListGroups_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListGroups_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListGroupsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListGroupsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListGroups_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListGroups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListGroups_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListGroupsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListGroupsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListGroups_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListGroups(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListNotifications_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListNotifications_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListNotifications_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListNotificationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListNotificationsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListNotifications_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListNotifications(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListNotifications_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListNotificationsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListNotificationsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListNotifications_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListNotifications(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListMatches_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListMatches_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListMatches_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListMatchesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListMatchesRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListMatches_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListMatches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListMatches_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListMatchesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListMatchesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListMatches_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListMatches(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListPurchases_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListPurchases_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListPurchases_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListPurchasesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListPurchasesRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListPurchases_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListPurchases(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListPurchases_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListPurchasesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListPurchasesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListPurchases_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListPurchases(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_Console_ListSubscriptions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_Console_ListSubscriptions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_Console_ListSubscriptions_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListSubscriptionsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListSubscriptionsRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListSubscriptions_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ListSubscriptions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListSubscriptions_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListSubscriptionsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ListSubscriptionsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Console_ListSubscriptions_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ListSubscriptions(ctx, &protoReq) return msg, metadata, err - } func request_Console_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) msg, err := client.ListUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) msg, err := server.ListUsers(ctx, &protoReq) return msg, metadata, err - } func request_Console_PromoteGroupMember_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateGroupUserStateRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq UpdateGroupUserStateRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - val, ok = pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.PromoteGroupMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_PromoteGroupMember_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateGroupUserStateRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq UpdateGroupUserStateRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["group_id"] + val, ok := pathParams["group_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") } - protoReq.GroupId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) } - val, ok = pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.PromoteGroupMember(ctx, &protoReq) return msg, metadata, err - } func request_Console_RequireUserMfa_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RequireUserMfaRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq RequireUserMfaRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["username"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") } - protoReq.Username, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "username", err) } - msg, err := client.RequireUserMfa(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_RequireUserMfa_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RequireUserMfaRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq RequireUserMfaRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["username"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") } - protoReq.Username, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "username", err) } - msg, err := server.RequireUserMfa(ctx, &protoReq) return msg, metadata, err - } func request_Console_ResetUserMfa_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResetUserMfaRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ResetUserMfaRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["username"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") } - protoReq.Username, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "username", err) } - msg, err := client.ResetUserMfa(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_ResetUserMfa_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResetUserMfaRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ResetUserMfaRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["username"] + val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") } - protoReq.Username, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "username", err) } - msg, err := server.ResetUserMfa(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnbanAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["id"] + protoReq AccountId + metadata runtime.ServerMetadata + err error + ) + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnbanAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnbanAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnbanAccount(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkCustom_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkCustom(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkCustom_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkCustom(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkDevice_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UnlinkDeviceRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq UnlinkDeviceRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkDevice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkDevice_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UnlinkDeviceRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq UnlinkDeviceRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkDevice(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkEmail_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkEmail(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkEmail_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkEmail(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkApple_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkApple(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkApple_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkApple(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkFacebook_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkFacebook(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkFacebook_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkFacebook(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkFacebookInstantGame(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkFacebookInstantGame_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkFacebookInstantGame(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkGameCenter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkGameCenter_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkGameCenter(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkGoogle_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkGoogle(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkGoogle_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkGoogle(ctx, &protoReq) return msg, metadata, err - } func request_Console_UnlinkSteam_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + io.Copy(io.Discard, req.Body) + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UnlinkSteam(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UnlinkSteam_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AccountId - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq AccountId + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UnlinkSteam(ctx, &protoReq) return msg, metadata, err - } func request_Console_UpdateAccount_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateAccountRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq UpdateAccountRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UpdateAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UpdateAccount_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateAccountRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq UpdateAccountRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UpdateAccount(ctx, &protoReq) return msg, metadata, err - } func request_Console_UpdateGroup_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateGroupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq UpdateGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := client.UpdateGroup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_UpdateGroup_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateGroupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq UpdateGroupRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["id"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") } - protoReq.Id, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - msg, err := server.UpdateGroup(ctx, &protoReq) return msg, metadata, err - } func request_Console_WriteStorageObject_0(ctx context.Context, marshaler runtime.Marshaler, client ConsoleClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq WriteStorageObjectRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq WriteStorageObjectRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - msg, err := client.WriteStorageObject(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_Console_WriteStorageObject_0(ctx context.Context, marshaler runtime.Marshaler, server ConsoleServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq WriteStorageObjectRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq WriteStorageObjectRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["collection"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["collection"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collection") } - protoReq.Collection, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collection", err) } - val, ok = pathParams["key"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "key") } - protoReq.Key, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "key", err) } - val, ok = pathParams["user_id"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") } - protoReq.UserId, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) } - msg, err := server.WriteStorageObject(ctx, &protoReq) return msg, metadata, err - } // RegisterConsoleHandlerServer registers the http handlers for service Console to "mux". // UnaryRPC :call ConsoleServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterConsoleHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ConsoleServer) error { - - mux.Handle("POST", pattern_Console_Authenticate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_Authenticate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/Authenticate", runtime.WithHTTPPathPattern("/v2/console/authenticate")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/Authenticate", runtime.WithHTTPPathPattern("/v2/console/authenticate")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3645,20 +2729,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_Authenticate_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AuthenticateLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AuthenticateLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AuthenticateLogout", runtime.WithHTTPPathPattern("/v2/console/authenticate/logout")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AuthenticateLogout", runtime.WithHTTPPathPattern("/v2/console/authenticate/logout")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3670,20 +2749,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AuthenticateLogout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AuthenticateMFASetup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AuthenticateMFASetup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AuthenticateMFASetup", runtime.WithHTTPPathPattern("/v2/console/authenticate/mfa")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AuthenticateMFASetup", runtime.WithHTTPPathPattern("/v2/console/authenticate/mfa")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3695,20 +2769,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AuthenticateMFASetup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AddUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AddUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AddUser", runtime.WithHTTPPathPattern("/v2/console/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AddUser", runtime.WithHTTPPathPattern("/v2/console/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3720,20 +2789,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AddUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/add")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/add")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3745,20 +2809,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AddGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_BanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_BanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/BanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/ban")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/BanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/ban")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3770,20 +2829,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_BanAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_CallApiEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_CallApiEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/CallApiEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/{method}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/CallApiEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/{method}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3795,20 +2849,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_CallApiEndpoint_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_CallRpcEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_CallRpcEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/CallRpcEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/rpc/{method}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/CallRpcEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/rpc/{method}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3820,20 +2869,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_CallRpcEndpoint_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteAllData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteAllData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteAllData", runtime.WithHTTPPathPattern("/v2/console/all")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteAllData", runtime.WithHTTPPathPattern("/v2/console/all")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3845,20 +2889,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteAllData_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3870,20 +2909,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteChannelMessages", runtime.WithHTTPPathPattern("/v2/console/message")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteChannelMessages", runtime.WithHTTPPathPattern("/v2/console/message")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3895,20 +2929,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteChannelMessages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteFriend_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteFriend_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteFriend", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend/{friend_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteFriend", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend/{friend_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3920,20 +2949,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteFriend_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3945,20 +2969,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteGroupUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteGroupUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteGroupUser", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group/{group_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteGroupUser", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group/{group_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3970,20 +2989,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteGroupUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -3995,20 +3009,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4020,20 +3029,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteStorageObject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteStorageObject_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteStorageObject_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}/{version}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}/{version}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4045,20 +3049,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteStorageObject_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4070,20 +3069,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4095,20 +3089,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteLeaderboard_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}/owner/{owner_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}/owner/{owner_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4120,20 +3109,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteLeaderboardRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4145,20 +3129,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteNotification_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteUser", runtime.WithHTTPPathPattern("/v2/console/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteUser", runtime.WithHTTPPathPattern("/v2/console/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4170,20 +3149,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{id}/wallet/{wallet_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DeleteWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{id}/wallet/{wallet_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4195,20 +3169,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteWalletLedger_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_DemoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_DemoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DemoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/demote")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/DemoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/demote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4220,20 +3189,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DemoteGroupMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ExportAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ExportAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ExportAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/export")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ExportAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/export")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4245,20 +3209,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ExportAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ExportGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ExportGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ExportGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}/export")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ExportGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}/export")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4270,20 +3229,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ExportGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4295,20 +3249,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetConfig", runtime.WithHTTPPathPattern("/v2/console/config")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetConfig", runtime.WithHTTPPathPattern("/v2/console/config")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4320,20 +3269,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetFriends", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetFriends", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4345,20 +3289,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4370,20 +3309,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetMembers", runtime.WithHTTPPathPattern("/v2/console/group/{id}/member")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetMembers", runtime.WithHTTPPathPattern("/v2/console/group/{id}/member")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4395,20 +3329,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetMembers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetGroups", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetGroups", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4420,20 +3349,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4445,20 +3369,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetLeaderboard_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetMatchState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetMatchState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetMatchState", runtime.WithHTTPPathPattern("/v2/console/match/{id}/state")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetMatchState", runtime.WithHTTPPathPattern("/v2/console/match/{id}/state")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4470,20 +3389,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetMatchState_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetRuntime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetRuntime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetRuntime", runtime.WithHTTPPathPattern("/v2/console/runtime")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetRuntime", runtime.WithHTTPPathPattern("/v2/console/runtime")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4495,20 +3409,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetRuntime_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetStatus", runtime.WithHTTPPathPattern("/v2/console/status")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetStatus", runtime.WithHTTPPathPattern("/v2/console/status")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4520,20 +3429,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetStorage", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetStorage", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4545,20 +3449,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{account_id}/wallet")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{account_id}/wallet")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4570,20 +3469,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetWalletLedger_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4595,20 +3489,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetNotification_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetPurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetPurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetPurchase", runtime.WithHTTPPathPattern("/v2/console/iap/purchase/{transaction_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetPurchase", runtime.WithHTTPPathPattern("/v2/console/iap/purchase/{transaction_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4620,20 +3509,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetPurchase_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetSubscription", runtime.WithHTTPPathPattern("/v2/console/iap/subscription/{original_transaction_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/GetSubscription", runtime.WithHTTPPathPattern("/v2/console/iap/subscription/{original_transaction_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4645,20 +3529,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListApiEndpoints_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListApiEndpoints_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListApiEndpoints", runtime.WithHTTPPathPattern("/v2/console/api/endpoints")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListApiEndpoints", runtime.WithHTTPPathPattern("/v2/console/api/endpoints")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4670,20 +3549,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListApiEndpoints_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{leaderboard_id}/records")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{leaderboard_id}/records")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4695,20 +3569,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListLeaderboardRecords_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListLeaderboards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListLeaderboards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboards", runtime.WithHTTPPathPattern("/v2/console/leaderboard")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboards", runtime.WithHTTPPathPattern("/v2/console/leaderboard")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4720,20 +3589,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListLeaderboards_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4745,20 +3609,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListStorageCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListStorageCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListStorageCollections", runtime.WithHTTPPathPattern("/v2/console/storage/collections")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListStorageCollections", runtime.WithHTTPPathPattern("/v2/console/storage/collections")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4770,20 +3629,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListStorageCollections_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4795,20 +3649,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/console/channel")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/console/channel")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4820,20 +3669,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListChannelMessages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListGroups", runtime.WithHTTPPathPattern("/v2/console/group")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListGroups", runtime.WithHTTPPathPattern("/v2/console/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4845,20 +3689,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListNotifications", runtime.WithHTTPPathPattern("/v2/console/notification")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListNotifications", runtime.WithHTTPPathPattern("/v2/console/notification")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4870,20 +3709,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListNotifications_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListMatches", runtime.WithHTTPPathPattern("/v2/console/match")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListMatches", runtime.WithHTTPPathPattern("/v2/console/match")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4895,20 +3729,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListMatches_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListPurchases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListPurchases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListPurchases", runtime.WithHTTPPathPattern("/v2/console/purchase")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListPurchases", runtime.WithHTTPPathPattern("/v2/console/purchase")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4920,20 +3749,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListPurchases_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/console/subscription")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/console/subscription")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4945,20 +3769,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListSubscriptions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListUsers", runtime.WithHTTPPathPattern("/v2/console/user")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ListUsers", runtime.WithHTTPPathPattern("/v2/console/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4970,20 +3789,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_PromoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_PromoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/PromoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/promote")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/PromoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/promote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -4995,20 +3809,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_PromoteGroupMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_RequireUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_RequireUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/RequireUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/require")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/RequireUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/require")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5020,20 +3829,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_RequireUserMfa_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_ResetUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_ResetUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ResetUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/reset")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/ResetUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/reset")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5045,20 +3849,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ResetUserMfa_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnbanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnbanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnbanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unban")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnbanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unban")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5070,20 +3869,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnbanAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/custom")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5095,20 +3889,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/device")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5120,20 +3909,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/email")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5145,20 +3929,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkApple", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/apple")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkApple", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5170,20 +3949,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebook")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5195,20 +3969,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5220,20 +3989,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/gamecenter")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5245,20 +4009,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/google")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5270,20 +4029,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/steam")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5295,20 +4049,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UpdateAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UpdateAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5320,20 +4069,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UpdateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UpdateGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/UpdateGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5345,20 +4089,15 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Console_WriteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Console_WriteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/WriteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.console.Console/WriteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5370,9 +4109,7 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_WriteStorageObject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -5381,25 +4118,24 @@ func RegisterConsoleHandlerServer(ctx context.Context, mux *runtime.ServeMux, se // RegisterConsoleHandlerFromEndpoint is same as RegisterConsoleHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterConsoleHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() - return RegisterConsoleHandler(ctx, mux, conn) } @@ -5413,16 +4149,13 @@ func RegisterConsoleHandler(ctx context.Context, mux *runtime.ServeMux, conn *gr // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ConsoleClient". // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ConsoleClient" // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "ConsoleClient" to call the correct interceptors. +// "ConsoleClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ConsoleClient) error { - - mux.Handle("POST", pattern_Console_Authenticate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_Authenticate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/Authenticate", runtime.WithHTTPPathPattern("/v2/console/authenticate")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/Authenticate", runtime.WithHTTPPathPattern("/v2/console/authenticate")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5433,18 +4166,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_Authenticate_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AuthenticateLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AuthenticateLogout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AuthenticateLogout", runtime.WithHTTPPathPattern("/v2/console/authenticate/logout")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AuthenticateLogout", runtime.WithHTTPPathPattern("/v2/console/authenticate/logout")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5455,18 +4183,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AuthenticateLogout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AuthenticateMFASetup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AuthenticateMFASetup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AuthenticateMFASetup", runtime.WithHTTPPathPattern("/v2/console/authenticate/mfa")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AuthenticateMFASetup", runtime.WithHTTPPathPattern("/v2/console/authenticate/mfa")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5477,18 +4200,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AuthenticateMFASetup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AddUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AddUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AddUser", runtime.WithHTTPPathPattern("/v2/console/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AddUser", runtime.WithHTTPPathPattern("/v2/console/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5499,18 +4217,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AddUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_AddGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/add")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/AddGroupUsers", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/add")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5521,18 +4234,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_AddGroupUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_BanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_BanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/BanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/ban")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/BanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/ban")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5543,18 +4251,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_BanAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_CallApiEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_CallApiEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/CallApiEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/{method}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/CallApiEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/{method}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5565,18 +4268,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_CallApiEndpoint_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_CallRpcEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_CallRpcEndpoint_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/CallRpcEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/rpc/{method}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/CallRpcEndpoint", runtime.WithHTTPPathPattern("/v2/console/api/endpoints/rpc/{method}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5587,18 +4285,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_CallRpcEndpoint_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteAllData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteAllData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteAllData", runtime.WithHTTPPathPattern("/v2/console/all")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteAllData", runtime.WithHTTPPathPattern("/v2/console/all")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5609,18 +4302,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteAllData_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5631,18 +4319,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteChannelMessages", runtime.WithHTTPPathPattern("/v2/console/message")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteChannelMessages", runtime.WithHTTPPathPattern("/v2/console/message")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5653,18 +4336,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteChannelMessages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteFriend_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteFriend_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteFriend", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend/{friend_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteFriend", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend/{friend_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5675,18 +4353,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteFriend_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5697,18 +4370,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteGroupUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteGroupUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteGroupUser", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group/{group_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteGroupUser", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group/{group_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5719,18 +4387,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteGroupUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5741,18 +4404,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5763,18 +4421,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteStorageObject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteStorageObject_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteStorageObject_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}/{version}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}/{version}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5785,18 +4438,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteStorageObject_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5807,18 +4455,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5829,18 +4472,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteLeaderboard_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}/owner/{owner_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteLeaderboardRecord", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}/owner/{owner_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5851,18 +4489,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteLeaderboardRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5873,18 +4506,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteNotification_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteUser", runtime.WithHTTPPathPattern("/v2/console/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteUser", runtime.WithHTTPPathPattern("/v2/console/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5895,18 +4523,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_Console_DeleteWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_Console_DeleteWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{id}/wallet/{wallet_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DeleteWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{id}/wallet/{wallet_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5917,18 +4540,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DeleteWalletLedger_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_DemoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_DemoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DemoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/demote")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/DemoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/demote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5939,18 +4557,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_DemoteGroupMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ExportAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ExportAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ExportAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/export")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ExportAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/export")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5961,18 +4574,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ExportAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ExportGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ExportGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ExportGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}/export")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ExportGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}/export")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -5983,18 +4591,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ExportGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6005,18 +4608,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetConfig", runtime.WithHTTPPathPattern("/v2/console/config")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetConfig", runtime.WithHTTPPathPattern("/v2/console/config")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6027,18 +4625,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetFriends_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetFriends", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetFriends", runtime.WithHTTPPathPattern("/v2/console/account/{id}/friend")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6049,18 +4642,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetFriends_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6071,18 +4659,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetMembers", runtime.WithHTTPPathPattern("/v2/console/group/{id}/member")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetMembers", runtime.WithHTTPPathPattern("/v2/console/group/{id}/member")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6093,18 +4676,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetMembers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetGroups", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetGroups", runtime.WithHTTPPathPattern("/v2/console/account/{id}/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6115,18 +4693,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetLeaderboard_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetLeaderboard", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6137,18 +4710,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetLeaderboard_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetMatchState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetMatchState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetMatchState", runtime.WithHTTPPathPattern("/v2/console/match/{id}/state")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetMatchState", runtime.WithHTTPPathPattern("/v2/console/match/{id}/state")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6159,18 +4727,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetMatchState_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetRuntime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetRuntime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetRuntime", runtime.WithHTTPPathPattern("/v2/console/runtime")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetRuntime", runtime.WithHTTPPathPattern("/v2/console/runtime")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6181,18 +4744,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetRuntime_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetStatus", runtime.WithHTTPPathPattern("/v2/console/status")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetStatus", runtime.WithHTTPPathPattern("/v2/console/status")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6203,18 +4761,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetStorage", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetStorage", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6225,18 +4778,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetWalletLedger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{account_id}/wallet")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetWalletLedger", runtime.WithHTTPPathPattern("/v2/console/account/{account_id}/wallet")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6247,18 +4795,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetWalletLedger_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetNotification", runtime.WithHTTPPathPattern("/v2/console/notification/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6269,18 +4812,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetNotification_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetPurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetPurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetPurchase", runtime.WithHTTPPathPattern("/v2/console/iap/purchase/{transaction_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetPurchase", runtime.WithHTTPPathPattern("/v2/console/iap/purchase/{transaction_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6291,18 +4829,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetPurchase_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_GetSubscription_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetSubscription", runtime.WithHTTPPathPattern("/v2/console/iap/subscription/{original_transaction_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/GetSubscription", runtime.WithHTTPPathPattern("/v2/console/iap/subscription/{original_transaction_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6313,18 +4846,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_GetSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListApiEndpoints_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListApiEndpoints_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListApiEndpoints", runtime.WithHTTPPathPattern("/v2/console/api/endpoints")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListApiEndpoints", runtime.WithHTTPPathPattern("/v2/console/api/endpoints")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6335,18 +4863,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListApiEndpoints_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListLeaderboardRecords_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{leaderboard_id}/records")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboardRecords", runtime.WithHTTPPathPattern("/v2/console/leaderboard/{leaderboard_id}/records")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6357,18 +4880,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListLeaderboardRecords_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListLeaderboards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListLeaderboards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboards", runtime.WithHTTPPathPattern("/v2/console/leaderboard")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListLeaderboards", runtime.WithHTTPPathPattern("/v2/console/leaderboard")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6379,18 +4897,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListLeaderboards_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListStorage", runtime.WithHTTPPathPattern("/v2/console/storage")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6401,18 +4914,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListStorageCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListStorageCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListStorageCollections", runtime.WithHTTPPathPattern("/v2/console/storage/collections")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListStorageCollections", runtime.WithHTTPPathPattern("/v2/console/storage/collections")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6423,18 +4931,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListStorageCollections_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListAccounts", runtime.WithHTTPPathPattern("/v2/console/account")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6445,18 +4948,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListAccounts_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListChannelMessages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/console/channel")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListChannelMessages", runtime.WithHTTPPathPattern("/v2/console/channel")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6467,18 +4965,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListChannelMessages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListGroups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListGroups", runtime.WithHTTPPathPattern("/v2/console/group")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListGroups", runtime.WithHTTPPathPattern("/v2/console/group")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6489,18 +4982,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListGroups_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListNotifications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListNotifications", runtime.WithHTTPPathPattern("/v2/console/notification")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListNotifications", runtime.WithHTTPPathPattern("/v2/console/notification")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6511,18 +4999,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListNotifications_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListMatches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListMatches", runtime.WithHTTPPathPattern("/v2/console/match")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListMatches", runtime.WithHTTPPathPattern("/v2/console/match")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6533,18 +5016,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListMatches_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListPurchases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListPurchases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListPurchases", runtime.WithHTTPPathPattern("/v2/console/purchase")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListPurchases", runtime.WithHTTPPathPattern("/v2/console/purchase")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6555,18 +5033,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListPurchases_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/console/subscription")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListSubscriptions", runtime.WithHTTPPathPattern("/v2/console/subscription")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6577,18 +5050,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListSubscriptions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_Console_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_Console_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListUsers", runtime.WithHTTPPathPattern("/v2/console/user")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ListUsers", runtime.WithHTTPPathPattern("/v2/console/user")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6599,18 +5067,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ListUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_PromoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_PromoteGroupMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/PromoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/promote")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/PromoteGroupMember", runtime.WithHTTPPathPattern("/v2/console/group/{group_id}/account/{id}/promote")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6621,18 +5084,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_PromoteGroupMember_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_RequireUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_RequireUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/RequireUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/require")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/RequireUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/require")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6643,18 +5101,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_RequireUserMfa_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_ResetUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_ResetUserMfa_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ResetUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/reset")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/ResetUserMfa", runtime.WithHTTPPathPattern("/v2/console/user/{username}/mfa/reset")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6665,18 +5118,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_ResetUserMfa_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnbanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnbanAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnbanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unban")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnbanAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unban")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6687,18 +5135,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnbanAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkCustom_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/custom")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkCustom", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/custom")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6709,18 +5152,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkCustom_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/device")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkDevice", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/device")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6731,18 +5169,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkDevice_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/email")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkEmail", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/email")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6753,18 +5186,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkEmail_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkApple", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/apple")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkApple", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/apple")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6775,18 +5203,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkApple_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkFacebook_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebook")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebook", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebook")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6797,18 +5220,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkFacebook_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkFacebookInstantGame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebookinstantgame")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkFacebookInstantGame", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/facebookinstantgame")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6819,18 +5237,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkFacebookInstantGame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkGameCenter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/gamecenter")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkGameCenter", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/gamecenter")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6841,18 +5254,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkGameCenter_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkGoogle_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/google")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkGoogle", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/google")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6863,18 +5271,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkGoogle_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UnlinkSteam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/steam")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UnlinkSteam", runtime.WithHTTPPathPattern("/v2/console/account/{id}/unlink/steam")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6885,18 +5288,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UnlinkSteam_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UpdateAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UpdateAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UpdateAccount", runtime.WithHTTPPathPattern("/v2/console/account/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6907,18 +5305,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UpdateAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_Console_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Console_UpdateGroup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UpdateGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/UpdateGroup", runtime.WithHTTPPathPattern("/v2/console/group/{id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6929,18 +5322,13 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("PUT", pattern_Console_WriteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPut, pattern_Console_WriteStorageObject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/WriteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.console.Console/WriteStorageObject", runtime.WithHTTPPathPattern("/v2/console/storage/{collection}/{key}/{user_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -6951,294 +5339,153 @@ func RegisterConsoleHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Console_WriteStorageObject_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_Console_Authenticate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "authenticate"}, "")) - - pattern_Console_AuthenticateLogout_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "authenticate", "logout"}, "")) - - pattern_Console_AuthenticateMFASetup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "authenticate", "mfa"}, "")) - - pattern_Console_AddUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "user"}, "")) - - pattern_Console_AddGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "group", "group_id", "add"}, "")) - - pattern_Console_BanAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "ban"}, "")) - - pattern_Console_CallApiEndpoint_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "console", "api", "endpoints", "method"}, "")) - - pattern_Console_CallRpcEndpoint_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "api", "endpoints", "rpc", "method"}, "")) - - pattern_Console_DeleteAllData_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "all"}, "")) - - pattern_Console_DeleteAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "account", "id"}, "")) - - pattern_Console_DeleteChannelMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "message"}, "")) - - pattern_Console_DeleteFriend_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "account", "id", "friend", "friend_id"}, "")) - - pattern_Console_DeleteGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "group", "id"}, "")) - - pattern_Console_DeleteGroupUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "account", "id", "group", "group_id"}, "")) - - pattern_Console_DeleteStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "storage"}, "")) - - pattern_Console_DeleteStorageObject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "storage", "collection", "key", "user_id"}, "")) - - pattern_Console_DeleteStorageObject_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5, 1, 0, 4, 1, 5, 6}, []string{"v2", "console", "storage", "collection", "key", "user_id", "version"}, "")) - - pattern_Console_DeleteAccounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "account"}, "")) - - pattern_Console_DeleteLeaderboard_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "leaderboard", "id"}, "")) - - pattern_Console_DeleteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "leaderboard", "id", "owner", "owner_id"}, "")) - - pattern_Console_DeleteNotification_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "notification", "id"}, "")) - - pattern_Console_DeleteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "user"}, "")) - - pattern_Console_DeleteWalletLedger_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "account", "id", "wallet", "wallet_id"}, "")) - - pattern_Console_DemoteGroupMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v2", "console", "group", "group_id", "account", "id", "demote"}, "")) - - pattern_Console_ExportAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "export"}, "")) - - pattern_Console_ExportGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "group", "id", "export"}, "")) - - pattern_Console_GetAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "account", "id"}, "")) - - pattern_Console_GetConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "config"}, "")) - - pattern_Console_GetFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "friend"}, "")) - - pattern_Console_GetGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "group", "id"}, "")) - - pattern_Console_GetMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "group", "id", "member"}, "")) - - pattern_Console_GetGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "group"}, "")) - - pattern_Console_GetLeaderboard_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "leaderboard", "id"}, "")) - - pattern_Console_GetMatchState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "match", "id", "state"}, "")) - - pattern_Console_GetRuntime_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "runtime"}, "")) - - pattern_Console_GetStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "status"}, "")) - - pattern_Console_GetStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "storage", "collection", "key", "user_id"}, "")) - - pattern_Console_GetWalletLedger_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "account_id", "wallet"}, "")) - - pattern_Console_GetNotification_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "notification", "id"}, "")) - - pattern_Console_GetPurchase_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "console", "iap", "purchase", "transaction_id"}, "")) - - pattern_Console_GetSubscription_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "console", "iap", "subscription", "original_transaction_id"}, "")) - - pattern_Console_ListApiEndpoints_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "api", "endpoints"}, "")) - - pattern_Console_ListLeaderboardRecords_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "leaderboard", "leaderboard_id", "records"}, "")) - - pattern_Console_ListLeaderboards_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "leaderboard"}, "")) - - pattern_Console_ListStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "storage"}, "")) - - pattern_Console_ListStorageCollections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "storage", "collections"}, "")) - - pattern_Console_ListAccounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "account"}, "")) - - pattern_Console_ListChannelMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "channel"}, "")) - - pattern_Console_ListGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "group"}, "")) - - pattern_Console_ListNotifications_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "notification"}, "")) - - pattern_Console_ListMatches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "match"}, "")) - - pattern_Console_ListPurchases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "purchase"}, "")) - - pattern_Console_ListSubscriptions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "subscription"}, "")) - - pattern_Console_ListUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "user"}, "")) - - pattern_Console_PromoteGroupMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v2", "console", "group", "group_id", "account", "id", "promote"}, "")) - - pattern_Console_RequireUserMfa_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "user", "username", "mfa", "require"}, "")) - - pattern_Console_ResetUserMfa_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "user", "username", "mfa", "reset"}, "")) - - pattern_Console_UnbanAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "unban"}, "")) - - pattern_Console_UnlinkCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "custom"}, "")) - - pattern_Console_UnlinkDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "device"}, "")) - - pattern_Console_UnlinkEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "email"}, "")) - - pattern_Console_UnlinkApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "apple"}, "")) - - pattern_Console_UnlinkFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "facebook"}, "")) - + pattern_Console_Authenticate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "authenticate"}, "")) + pattern_Console_AuthenticateLogout_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "authenticate", "logout"}, "")) + pattern_Console_AuthenticateMFASetup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "authenticate", "mfa"}, "")) + pattern_Console_AddUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "user"}, "")) + pattern_Console_AddGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "group", "group_id", "add"}, "")) + pattern_Console_BanAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "ban"}, "")) + pattern_Console_CallApiEndpoint_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "console", "api", "endpoints", "method"}, "")) + pattern_Console_CallRpcEndpoint_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "api", "endpoints", "rpc", "method"}, "")) + pattern_Console_DeleteAllData_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "all"}, "")) + pattern_Console_DeleteAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "account", "id"}, "")) + pattern_Console_DeleteChannelMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "message"}, "")) + pattern_Console_DeleteFriend_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "account", "id", "friend", "friend_id"}, "")) + pattern_Console_DeleteGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "group", "id"}, "")) + pattern_Console_DeleteGroupUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "account", "id", "group", "group_id"}, "")) + pattern_Console_DeleteStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "storage"}, "")) + pattern_Console_DeleteStorageObject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "storage", "collection", "key", "user_id"}, "")) + pattern_Console_DeleteStorageObject_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5, 1, 0, 4, 1, 5, 6}, []string{"v2", "console", "storage", "collection", "key", "user_id", "version"}, "")) + pattern_Console_DeleteAccounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "account"}, "")) + pattern_Console_DeleteLeaderboard_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "leaderboard", "id"}, "")) + pattern_Console_DeleteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "leaderboard", "id", "owner", "owner_id"}, "")) + pattern_Console_DeleteNotification_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "notification", "id"}, "")) + pattern_Console_DeleteUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "user"}, "")) + pattern_Console_DeleteWalletLedger_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "account", "id", "wallet", "wallet_id"}, "")) + pattern_Console_DemoteGroupMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v2", "console", "group", "group_id", "account", "id", "demote"}, "")) + pattern_Console_ExportAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "export"}, "")) + pattern_Console_ExportGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "group", "id", "export"}, "")) + pattern_Console_GetAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "account", "id"}, "")) + pattern_Console_GetConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "config"}, "")) + pattern_Console_GetFriends_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "friend"}, "")) + pattern_Console_GetGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "group", "id"}, "")) + pattern_Console_GetMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "group", "id", "member"}, "")) + pattern_Console_GetGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "group"}, "")) + pattern_Console_GetLeaderboard_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "leaderboard", "id"}, "")) + pattern_Console_GetMatchState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "match", "id", "state"}, "")) + pattern_Console_GetRuntime_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "runtime"}, "")) + pattern_Console_GetStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "status"}, "")) + pattern_Console_GetStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "storage", "collection", "key", "user_id"}, "")) + pattern_Console_GetWalletLedger_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "account_id", "wallet"}, "")) + pattern_Console_GetNotification_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "notification", "id"}, "")) + pattern_Console_GetPurchase_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "console", "iap", "purchase", "transaction_id"}, "")) + pattern_Console_GetSubscription_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "console", "iap", "subscription", "original_transaction_id"}, "")) + pattern_Console_ListApiEndpoints_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "api", "endpoints"}, "")) + pattern_Console_ListLeaderboardRecords_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "leaderboard", "leaderboard_id", "records"}, "")) + pattern_Console_ListLeaderboards_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "leaderboard"}, "")) + pattern_Console_ListStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "storage"}, "")) + pattern_Console_ListStorageCollections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "console", "storage", "collections"}, "")) + pattern_Console_ListAccounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "account"}, "")) + pattern_Console_ListChannelMessages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "channel"}, "")) + pattern_Console_ListGroups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "group"}, "")) + pattern_Console_ListNotifications_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "notification"}, "")) + pattern_Console_ListMatches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "match"}, "")) + pattern_Console_ListPurchases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "purchase"}, "")) + pattern_Console_ListSubscriptions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "subscription"}, "")) + pattern_Console_ListUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "console", "user"}, "")) + pattern_Console_PromoteGroupMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v2", "console", "group", "group_id", "account", "id", "promote"}, "")) + pattern_Console_RequireUserMfa_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "user", "username", "mfa", "require"}, "")) + pattern_Console_ResetUserMfa_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "user", "username", "mfa", "reset"}, "")) + pattern_Console_UnbanAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"v2", "console", "account", "id", "unban"}, "")) + pattern_Console_UnlinkCustom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "custom"}, "")) + pattern_Console_UnlinkDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "device"}, "")) + pattern_Console_UnlinkEmail_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "email"}, "")) + pattern_Console_UnlinkApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "apple"}, "")) + pattern_Console_UnlinkFacebook_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "facebook"}, "")) pattern_Console_UnlinkFacebookInstantGame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "facebookinstantgame"}, "")) - - pattern_Console_UnlinkGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "gamecenter"}, "")) - - pattern_Console_UnlinkGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "google"}, "")) - - pattern_Console_UnlinkSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "steam"}, "")) - - pattern_Console_UpdateAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "account", "id"}, "")) - - pattern_Console_UpdateGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "group", "id"}, "")) - - pattern_Console_WriteStorageObject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "storage", "collection", "key", "user_id"}, "")) + pattern_Console_UnlinkGameCenter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "gamecenter"}, "")) + pattern_Console_UnlinkGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "google"}, "")) + pattern_Console_UnlinkSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"v2", "console", "account", "id", "unlink", "steam"}, "")) + pattern_Console_UpdateAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "account", "id"}, "")) + pattern_Console_UpdateGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "console", "group", "id"}, "")) + pattern_Console_WriteStorageObject_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v2", "console", "storage", "collection", "key", "user_id"}, "")) ) var ( - forward_Console_Authenticate_0 = runtime.ForwardResponseMessage - - forward_Console_AuthenticateLogout_0 = runtime.ForwardResponseMessage - - forward_Console_AuthenticateMFASetup_0 = runtime.ForwardResponseMessage - - forward_Console_AddUser_0 = runtime.ForwardResponseMessage - - forward_Console_AddGroupUsers_0 = runtime.ForwardResponseMessage - - forward_Console_BanAccount_0 = runtime.ForwardResponseMessage - - forward_Console_CallApiEndpoint_0 = runtime.ForwardResponseMessage - - forward_Console_CallRpcEndpoint_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteAllData_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteAccount_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteChannelMessages_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteFriend_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteGroup_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteGroupUser_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteStorage_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteStorageObject_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteStorageObject_1 = runtime.ForwardResponseMessage - - forward_Console_DeleteAccounts_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteLeaderboard_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteLeaderboardRecord_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteNotification_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteUser_0 = runtime.ForwardResponseMessage - - forward_Console_DeleteWalletLedger_0 = runtime.ForwardResponseMessage - - forward_Console_DemoteGroupMember_0 = runtime.ForwardResponseMessage - - forward_Console_ExportAccount_0 = runtime.ForwardResponseMessage - - forward_Console_ExportGroup_0 = runtime.ForwardResponseMessage - - forward_Console_GetAccount_0 = runtime.ForwardResponseMessage - - forward_Console_GetConfig_0 = runtime.ForwardResponseMessage - - forward_Console_GetFriends_0 = runtime.ForwardResponseMessage - - forward_Console_GetGroup_0 = runtime.ForwardResponseMessage - - forward_Console_GetMembers_0 = runtime.ForwardResponseMessage - - forward_Console_GetGroups_0 = runtime.ForwardResponseMessage - - forward_Console_GetLeaderboard_0 = runtime.ForwardResponseMessage - - forward_Console_GetMatchState_0 = runtime.ForwardResponseMessage - - forward_Console_GetRuntime_0 = runtime.ForwardResponseMessage - - forward_Console_GetStatus_0 = runtime.ForwardResponseMessage - - forward_Console_GetStorage_0 = runtime.ForwardResponseMessage - - forward_Console_GetWalletLedger_0 = runtime.ForwardResponseMessage - - forward_Console_GetNotification_0 = runtime.ForwardResponseMessage - - forward_Console_GetPurchase_0 = runtime.ForwardResponseMessage - - forward_Console_GetSubscription_0 = runtime.ForwardResponseMessage - - forward_Console_ListApiEndpoints_0 = runtime.ForwardResponseMessage - - forward_Console_ListLeaderboardRecords_0 = runtime.ForwardResponseMessage - - forward_Console_ListLeaderboards_0 = runtime.ForwardResponseMessage - - forward_Console_ListStorage_0 = runtime.ForwardResponseMessage - - forward_Console_ListStorageCollections_0 = runtime.ForwardResponseMessage - - forward_Console_ListAccounts_0 = runtime.ForwardResponseMessage - - forward_Console_ListChannelMessages_0 = runtime.ForwardResponseMessage - - forward_Console_ListGroups_0 = runtime.ForwardResponseMessage - - forward_Console_ListNotifications_0 = runtime.ForwardResponseMessage - - forward_Console_ListMatches_0 = runtime.ForwardResponseMessage - - forward_Console_ListPurchases_0 = runtime.ForwardResponseMessage - - forward_Console_ListSubscriptions_0 = runtime.ForwardResponseMessage - - forward_Console_ListUsers_0 = runtime.ForwardResponseMessage - - forward_Console_PromoteGroupMember_0 = runtime.ForwardResponseMessage - - forward_Console_RequireUserMfa_0 = runtime.ForwardResponseMessage - - forward_Console_ResetUserMfa_0 = runtime.ForwardResponseMessage - - forward_Console_UnbanAccount_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkCustom_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkDevice_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkEmail_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkApple_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkFacebook_0 = runtime.ForwardResponseMessage - + forward_Console_Authenticate_0 = runtime.ForwardResponseMessage + forward_Console_AuthenticateLogout_0 = runtime.ForwardResponseMessage + forward_Console_AuthenticateMFASetup_0 = runtime.ForwardResponseMessage + forward_Console_AddUser_0 = runtime.ForwardResponseMessage + forward_Console_AddGroupUsers_0 = runtime.ForwardResponseMessage + forward_Console_BanAccount_0 = runtime.ForwardResponseMessage + forward_Console_CallApiEndpoint_0 = runtime.ForwardResponseMessage + forward_Console_CallRpcEndpoint_0 = runtime.ForwardResponseMessage + forward_Console_DeleteAllData_0 = runtime.ForwardResponseMessage + forward_Console_DeleteAccount_0 = runtime.ForwardResponseMessage + forward_Console_DeleteChannelMessages_0 = runtime.ForwardResponseMessage + forward_Console_DeleteFriend_0 = runtime.ForwardResponseMessage + forward_Console_DeleteGroup_0 = runtime.ForwardResponseMessage + forward_Console_DeleteGroupUser_0 = runtime.ForwardResponseMessage + forward_Console_DeleteStorage_0 = runtime.ForwardResponseMessage + forward_Console_DeleteStorageObject_0 = runtime.ForwardResponseMessage + forward_Console_DeleteStorageObject_1 = runtime.ForwardResponseMessage + forward_Console_DeleteAccounts_0 = runtime.ForwardResponseMessage + forward_Console_DeleteLeaderboard_0 = runtime.ForwardResponseMessage + forward_Console_DeleteLeaderboardRecord_0 = runtime.ForwardResponseMessage + forward_Console_DeleteNotification_0 = runtime.ForwardResponseMessage + forward_Console_DeleteUser_0 = runtime.ForwardResponseMessage + forward_Console_DeleteWalletLedger_0 = runtime.ForwardResponseMessage + forward_Console_DemoteGroupMember_0 = runtime.ForwardResponseMessage + forward_Console_ExportAccount_0 = runtime.ForwardResponseMessage + forward_Console_ExportGroup_0 = runtime.ForwardResponseMessage + forward_Console_GetAccount_0 = runtime.ForwardResponseMessage + forward_Console_GetConfig_0 = runtime.ForwardResponseMessage + forward_Console_GetFriends_0 = runtime.ForwardResponseMessage + forward_Console_GetGroup_0 = runtime.ForwardResponseMessage + forward_Console_GetMembers_0 = runtime.ForwardResponseMessage + forward_Console_GetGroups_0 = runtime.ForwardResponseMessage + forward_Console_GetLeaderboard_0 = runtime.ForwardResponseMessage + forward_Console_GetMatchState_0 = runtime.ForwardResponseMessage + forward_Console_GetRuntime_0 = runtime.ForwardResponseMessage + forward_Console_GetStatus_0 = runtime.ForwardResponseMessage + forward_Console_GetStorage_0 = runtime.ForwardResponseMessage + forward_Console_GetWalletLedger_0 = runtime.ForwardResponseMessage + forward_Console_GetNotification_0 = runtime.ForwardResponseMessage + forward_Console_GetPurchase_0 = runtime.ForwardResponseMessage + forward_Console_GetSubscription_0 = runtime.ForwardResponseMessage + forward_Console_ListApiEndpoints_0 = runtime.ForwardResponseMessage + forward_Console_ListLeaderboardRecords_0 = runtime.ForwardResponseMessage + forward_Console_ListLeaderboards_0 = runtime.ForwardResponseMessage + forward_Console_ListStorage_0 = runtime.ForwardResponseMessage + forward_Console_ListStorageCollections_0 = runtime.ForwardResponseMessage + forward_Console_ListAccounts_0 = runtime.ForwardResponseMessage + forward_Console_ListChannelMessages_0 = runtime.ForwardResponseMessage + forward_Console_ListGroups_0 = runtime.ForwardResponseMessage + forward_Console_ListNotifications_0 = runtime.ForwardResponseMessage + forward_Console_ListMatches_0 = runtime.ForwardResponseMessage + forward_Console_ListPurchases_0 = runtime.ForwardResponseMessage + forward_Console_ListSubscriptions_0 = runtime.ForwardResponseMessage + forward_Console_ListUsers_0 = runtime.ForwardResponseMessage + forward_Console_PromoteGroupMember_0 = runtime.ForwardResponseMessage + forward_Console_RequireUserMfa_0 = runtime.ForwardResponseMessage + forward_Console_ResetUserMfa_0 = runtime.ForwardResponseMessage + forward_Console_UnbanAccount_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkCustom_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkDevice_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkEmail_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkApple_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkFacebook_0 = runtime.ForwardResponseMessage forward_Console_UnlinkFacebookInstantGame_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkGameCenter_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkGoogle_0 = runtime.ForwardResponseMessage - - forward_Console_UnlinkSteam_0 = runtime.ForwardResponseMessage - - forward_Console_UpdateAccount_0 = runtime.ForwardResponseMessage - - forward_Console_UpdateGroup_0 = runtime.ForwardResponseMessage - - forward_Console_WriteStorageObject_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkGameCenter_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkGoogle_0 = runtime.ForwardResponseMessage + forward_Console_UnlinkSteam_0 = runtime.ForwardResponseMessage + forward_Console_UpdateAccount_0 = runtime.ForwardResponseMessage + forward_Console_UpdateGroup_0 = runtime.ForwardResponseMessage + forward_Console_WriteStorageObject_0 = runtime.ForwardResponseMessage ) diff --git a/console/console.swagger.json b/console/console.swagger.json index aef388cd62..8c2c4b14a5 100644 --- a/console/console.swagger.json +++ b/console/console.swagger.json @@ -240,61 +240,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "username": { - "type": "string", - "description": "Username." - }, - "display_name": { - "type": "string", - "description": "Display name." - }, - "metadata": { - "type": "string", - "description": "Metadata." - }, - "avatar_url": { - "type": "string", - "description": "Avatar URL." - }, - "lang_tag": { - "type": "string", - "description": "Langtag." - }, - "location": { - "type": "string", - "description": "Location." - }, - "timezone": { - "type": "string", - "description": "Timezone." - }, - "custom_id": { - "type": "string", - "description": "Custom ID." - }, - "email": { - "type": "string", - "description": "Email." - }, - "password": { - "type": "string", - "description": "Password." - }, - "device_ids": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Device ID modifications." - }, - "wallet": { - "type": "string", - "description": "Wallet." - } - }, - "description": "Update user account information." + "$ref": "#/definitions/ConsoleUpdateAccountBody" } } ], @@ -643,14 +589,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "device_id": { - "type": "string", - "description": "Device ID to unlink." - } - }, - "description": "Unlink a particular device ID from a user's account." + "$ref": "#/definitions/ConsoleUnlinkDeviceBody" } } ], @@ -974,22 +913,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "body": { - "type": "string" - }, - "user_id": { - "type": "string" - }, - "session_vars": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "title": "API Explorer request definition for CallApiEndpoint" + "$ref": "#/definitions/ConsoleCallRpcEndpointBody" } } ], @@ -1028,22 +952,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "body": { - "type": "string" - }, - "user_id": { - "type": "string" - }, - "session_vars": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "title": "API Explorer request definition for CallApiEndpoint" + "$ref": "#/definitions/ConsoleCallApiEndpointBody" } } ], @@ -1407,18 +1316,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "ids": { - "type": "string", - "description": "Users to add/join." - }, - "join_request": { - "type": "boolean", - "description": "Whether it is a join request." - } - }, - "description": "Add/join users to a group." + "$ref": "#/definitions/ConsoleAddGroupUsersBody" } } ], @@ -1520,39 +1418,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name." - }, - "description": { - "type": "string", - "description": "Description." - }, - "lang_tag": { - "type": "string", - "description": "Langtag." - }, - "metadata": { - "type": "string", - "description": "Metadata." - }, - "avatar_url": { - "type": "string", - "description": "Avatar URL." - }, - "open": { - "type": "boolean", - "description": "Anyone can join open groups, otherwise only admins can accept members." - }, - "max_count": { - "type": "integer", - "format": "int32", - "description": "The maximum number of members allowed." - } - }, - "description": "Update group information." + "$ref": "#/definitions/ConsoleUpdateGroupBody" } } ], @@ -2492,28 +2358,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "value": { - "type": "string", - "description": "Value." - }, - "version": { - "type": "string", - "description": "Version for OCC." - }, - "permission_read": { - "type": "integer", - "format": "int32", - "description": "Read permission value." - }, - "permission_write": { - "type": "integer", - "format": "int32", - "description": "Write permission value." - } - }, - "description": "Write a new storage object or update an existing one." + "$ref": "#/definitions/consoleConsoleWriteStorageObjectBody" } } ], @@ -2741,14 +2586,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Required." - } - }, - "description": "Make a user's mfa required or not." + "$ref": "#/definitions/ConsoleRequireUserMfaBody" } } ], @@ -2806,6 +2644,168 @@ }, "description": "A warning for a configuration field." }, + "ConsoleAddGroupUsersBody": { + "type": "object", + "properties": { + "ids": { + "type": "string", + "description": "Users to add/join." + }, + "join_request": { + "type": "boolean", + "description": "Whether it is a join request." + } + }, + "description": "Add/join users to a group." + }, + "ConsoleCallApiEndpointBody": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "user_id": { + "type": "string" + }, + "session_vars": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "title": "API Explorer request definition for CallApiEndpoint" + }, + "ConsoleCallRpcEndpointBody": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "user_id": { + "type": "string" + }, + "session_vars": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "title": "API Explorer request definition for CallApiEndpoint" + }, + "ConsoleRequireUserMfaBody": { + "type": "object", + "properties": { + "required": { + "type": "boolean", + "description": "Required." + } + }, + "description": "Make a user's mfa required or not." + }, + "ConsoleUnlinkDeviceBody": { + "type": "object", + "properties": { + "device_id": { + "type": "string", + "description": "Device ID to unlink." + } + }, + "description": "Unlink a particular device ID from a user's account." + }, + "ConsoleUpdateAccountBody": { + "type": "object", + "properties": { + "username": { + "type": "string", + "description": "Username." + }, + "display_name": { + "type": "string", + "description": "Display name." + }, + "metadata": { + "type": "string", + "description": "Metadata." + }, + "avatar_url": { + "type": "string", + "description": "Avatar URL." + }, + "lang_tag": { + "type": "string", + "description": "Langtag." + }, + "location": { + "type": "string", + "description": "Location." + }, + "timezone": { + "type": "string", + "description": "Timezone." + }, + "custom_id": { + "type": "string", + "description": "Custom ID." + }, + "email": { + "type": "string", + "description": "Email." + }, + "password": { + "type": "string", + "description": "Password." + }, + "device_ids": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Device ID modifications." + }, + "wallet": { + "type": "string", + "description": "Wallet." + } + }, + "description": "Update user account information." + }, + "ConsoleUpdateGroupBody": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name." + }, + "description": { + "type": "string", + "description": "Description." + }, + "lang_tag": { + "type": "string", + "description": "Langtag." + }, + "metadata": { + "type": "string", + "description": "Metadata." + }, + "avatar_url": { + "type": "string", + "description": "Avatar URL." + }, + "open": { + "type": "boolean", + "description": "Anyone can join open groups, otherwise only admins can accept members." + }, + "max_count": { + "type": "integer", + "format": "int32", + "description": "The maximum number of members allowed." + } + }, + "description": "Update group information." + }, "GroupUserListGroupUser": { "type": "object", "properties": { @@ -3704,6 +3704,30 @@ }, "description": "A console user session." }, + "consoleConsoleWriteStorageObjectBody": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Value." + }, + "version": { + "type": "string", + "description": "Version for OCC." + }, + "permission_read": { + "type": "integer", + "format": "int32", + "description": "Read permission value." + }, + "permission_write": { + "type": "integer", + "format": "int32", + "description": "Write permission value." + } + }, + "description": "Write a new storage object or update an existing one." + }, "consoleDeleteChannelMessagesResponse": { "type": "object", "properties": { diff --git a/console/console_grpc.pb.go b/console/console_grpc.pb.go index 4209525ca5..f47b8affb2 100644 --- a/console/console_grpc.pb.go +++ b/console/console_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v5.29.3 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v4.24.3 // source: console.proto package console @@ -34,8 +34,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Console_Authenticate_FullMethodName = "/nakama.console.Console/Authenticate" @@ -112,6 +112,9 @@ const ( // ConsoleClient is the client API for Console service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// * +// The developer console RPC protocol service built with GRPC. type ConsoleClient interface { // Authenticate a console user with username and password. Authenticate(ctx context.Context, in *AuthenticateRequest, opts ...grpc.CallOption) (*ConsoleSession, error) @@ -262,8 +265,9 @@ func NewConsoleClient(cc grpc.ClientConnInterface) ConsoleClient { } func (c *consoleClient) Authenticate(ctx context.Context, in *AuthenticateRequest, opts ...grpc.CallOption) (*ConsoleSession, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ConsoleSession) - err := c.cc.Invoke(ctx, Console_Authenticate_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_Authenticate_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -271,8 +275,9 @@ func (c *consoleClient) Authenticate(ctx context.Context, in *AuthenticateReques } func (c *consoleClient) AuthenticateLogout(ctx context.Context, in *AuthenticateLogoutRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_AuthenticateLogout_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_AuthenticateLogout_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -280,8 +285,9 @@ func (c *consoleClient) AuthenticateLogout(ctx context.Context, in *Authenticate } func (c *consoleClient) AuthenticateMFASetup(ctx context.Context, in *AuthenticateMFASetupRequest, opts ...grpc.CallOption) (*AuthenticateMFASetupResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AuthenticateMFASetupResponse) - err := c.cc.Invoke(ctx, Console_AuthenticateMFASetup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_AuthenticateMFASetup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -289,8 +295,9 @@ func (c *consoleClient) AuthenticateMFASetup(ctx context.Context, in *Authentica } func (c *consoleClient) AddUser(ctx context.Context, in *AddUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_AddUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_AddUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -298,8 +305,9 @@ func (c *consoleClient) AddUser(ctx context.Context, in *AddUserRequest, opts .. } func (c *consoleClient) AddGroupUsers(ctx context.Context, in *AddGroupUsersRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_AddGroupUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_AddGroupUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -307,8 +315,9 @@ func (c *consoleClient) AddGroupUsers(ctx context.Context, in *AddGroupUsersRequ } func (c *consoleClient) BanAccount(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_BanAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_BanAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -316,8 +325,9 @@ func (c *consoleClient) BanAccount(ctx context.Context, in *AccountId, opts ...g } func (c *consoleClient) CallApiEndpoint(ctx context.Context, in *CallApiEndpointRequest, opts ...grpc.CallOption) (*CallApiEndpointResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CallApiEndpointResponse) - err := c.cc.Invoke(ctx, Console_CallApiEndpoint_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_CallApiEndpoint_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -325,8 +335,9 @@ func (c *consoleClient) CallApiEndpoint(ctx context.Context, in *CallApiEndpoint } func (c *consoleClient) CallRpcEndpoint(ctx context.Context, in *CallApiEndpointRequest, opts ...grpc.CallOption) (*CallApiEndpointResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CallApiEndpointResponse) - err := c.cc.Invoke(ctx, Console_CallRpcEndpoint_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_CallRpcEndpoint_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -334,8 +345,9 @@ func (c *consoleClient) CallRpcEndpoint(ctx context.Context, in *CallApiEndpoint } func (c *consoleClient) DeleteAllData(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteAllData_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteAllData_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -343,8 +355,9 @@ func (c *consoleClient) DeleteAllData(ctx context.Context, in *emptypb.Empty, op } func (c *consoleClient) DeleteAccount(ctx context.Context, in *AccountDeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -352,8 +365,9 @@ func (c *consoleClient) DeleteAccount(ctx context.Context, in *AccountDeleteRequ } func (c *consoleClient) DeleteChannelMessages(ctx context.Context, in *DeleteChannelMessagesRequest, opts ...grpc.CallOption) (*DeleteChannelMessagesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeleteChannelMessagesResponse) - err := c.cc.Invoke(ctx, Console_DeleteChannelMessages_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteChannelMessages_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -361,8 +375,9 @@ func (c *consoleClient) DeleteChannelMessages(ctx context.Context, in *DeleteCha } func (c *consoleClient) DeleteFriend(ctx context.Context, in *DeleteFriendRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteFriend_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteFriend_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -370,8 +385,9 @@ func (c *consoleClient) DeleteFriend(ctx context.Context, in *DeleteFriendReques } func (c *consoleClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -379,8 +395,9 @@ func (c *consoleClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, } func (c *consoleClient) DeleteGroupUser(ctx context.Context, in *DeleteGroupUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteGroupUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteGroupUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -388,8 +405,9 @@ func (c *consoleClient) DeleteGroupUser(ctx context.Context, in *DeleteGroupUser } func (c *consoleClient) DeleteStorage(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteStorage_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteStorage_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -397,8 +415,9 @@ func (c *consoleClient) DeleteStorage(ctx context.Context, in *emptypb.Empty, op } func (c *consoleClient) DeleteStorageObject(ctx context.Context, in *DeleteStorageObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteStorageObject_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteStorageObject_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -406,8 +425,9 @@ func (c *consoleClient) DeleteStorageObject(ctx context.Context, in *DeleteStora } func (c *consoleClient) DeleteAccounts(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteAccounts_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteAccounts_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -415,8 +435,9 @@ func (c *consoleClient) DeleteAccounts(ctx context.Context, in *emptypb.Empty, o } func (c *consoleClient) DeleteLeaderboard(ctx context.Context, in *LeaderboardRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteLeaderboard_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteLeaderboard_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -424,8 +445,9 @@ func (c *consoleClient) DeleteLeaderboard(ctx context.Context, in *LeaderboardRe } func (c *consoleClient) DeleteLeaderboardRecord(ctx context.Context, in *DeleteLeaderboardRecordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteLeaderboardRecord_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteLeaderboardRecord_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -433,8 +455,9 @@ func (c *consoleClient) DeleteLeaderboardRecord(ctx context.Context, in *DeleteL } func (c *consoleClient) DeleteNotification(ctx context.Context, in *DeleteNotificationRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteNotification_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteNotification_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -442,8 +465,9 @@ func (c *consoleClient) DeleteNotification(ctx context.Context, in *DeleteNotifi } func (c *consoleClient) DeleteUser(ctx context.Context, in *Username, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -451,8 +475,9 @@ func (c *consoleClient) DeleteUser(ctx context.Context, in *Username, opts ...gr } func (c *consoleClient) DeleteWalletLedger(ctx context.Context, in *DeleteWalletLedgerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DeleteWalletLedger_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DeleteWalletLedger_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -460,8 +485,9 @@ func (c *consoleClient) DeleteWalletLedger(ctx context.Context, in *DeleteWallet } func (c *consoleClient) DemoteGroupMember(ctx context.Context, in *UpdateGroupUserStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_DemoteGroupMember_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_DemoteGroupMember_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -469,8 +495,9 @@ func (c *consoleClient) DemoteGroupMember(ctx context.Context, in *UpdateGroupUs } func (c *consoleClient) ExportAccount(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*AccountExport, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AccountExport) - err := c.cc.Invoke(ctx, Console_ExportAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ExportAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -478,8 +505,9 @@ func (c *consoleClient) ExportAccount(ctx context.Context, in *AccountId, opts . } func (c *consoleClient) ExportGroup(ctx context.Context, in *GroupId, opts ...grpc.CallOption) (*GroupExport, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GroupExport) - err := c.cc.Invoke(ctx, Console_ExportGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ExportGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -487,8 +515,9 @@ func (c *consoleClient) ExportGroup(ctx context.Context, in *GroupId, opts ...gr } func (c *consoleClient) GetAccount(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*Account, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Account) - err := c.cc.Invoke(ctx, Console_GetAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -496,8 +525,9 @@ func (c *consoleClient) GetAccount(ctx context.Context, in *AccountId, opts ...g } func (c *consoleClient) GetConfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Config, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Config) - err := c.cc.Invoke(ctx, Console_GetConfig_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetConfig_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -505,8 +535,9 @@ func (c *consoleClient) GetConfig(ctx context.Context, in *emptypb.Empty, opts . } func (c *consoleClient) GetFriends(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*api.FriendList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.FriendList) - err := c.cc.Invoke(ctx, Console_GetFriends_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetFriends_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -514,8 +545,9 @@ func (c *consoleClient) GetFriends(ctx context.Context, in *AccountId, opts ...g } func (c *consoleClient) GetGroup(ctx context.Context, in *GroupId, opts ...grpc.CallOption) (*api.Group, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.Group) - err := c.cc.Invoke(ctx, Console_GetGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -523,8 +555,9 @@ func (c *consoleClient) GetGroup(ctx context.Context, in *GroupId, opts ...grpc. } func (c *consoleClient) GetMembers(ctx context.Context, in *GroupId, opts ...grpc.CallOption) (*api.GroupUserList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.GroupUserList) - err := c.cc.Invoke(ctx, Console_GetMembers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetMembers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -532,8 +565,9 @@ func (c *consoleClient) GetMembers(ctx context.Context, in *GroupId, opts ...grp } func (c *consoleClient) GetGroups(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*api.UserGroupList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.UserGroupList) - err := c.cc.Invoke(ctx, Console_GetGroups_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetGroups_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -541,8 +575,9 @@ func (c *consoleClient) GetGroups(ctx context.Context, in *AccountId, opts ...gr } func (c *consoleClient) GetLeaderboard(ctx context.Context, in *LeaderboardRequest, opts ...grpc.CallOption) (*Leaderboard, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Leaderboard) - err := c.cc.Invoke(ctx, Console_GetLeaderboard_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetLeaderboard_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -550,8 +585,9 @@ func (c *consoleClient) GetLeaderboard(ctx context.Context, in *LeaderboardReque } func (c *consoleClient) GetMatchState(ctx context.Context, in *MatchStateRequest, opts ...grpc.CallOption) (*MatchState, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(MatchState) - err := c.cc.Invoke(ctx, Console_GetMatchState_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetMatchState_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -559,8 +595,9 @@ func (c *consoleClient) GetMatchState(ctx context.Context, in *MatchStateRequest } func (c *consoleClient) GetRuntime(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*RuntimeInfo, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RuntimeInfo) - err := c.cc.Invoke(ctx, Console_GetRuntime_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetRuntime_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -568,8 +605,9 @@ func (c *consoleClient) GetRuntime(ctx context.Context, in *emptypb.Empty, opts } func (c *consoleClient) GetStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*StatusList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StatusList) - err := c.cc.Invoke(ctx, Console_GetStatus_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetStatus_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -577,8 +615,9 @@ func (c *consoleClient) GetStatus(ctx context.Context, in *emptypb.Empty, opts . } func (c *consoleClient) GetStorage(ctx context.Context, in *api.ReadStorageObjectId, opts ...grpc.CallOption) (*api.StorageObject, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.StorageObject) - err := c.cc.Invoke(ctx, Console_GetStorage_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetStorage_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -586,8 +625,9 @@ func (c *consoleClient) GetStorage(ctx context.Context, in *api.ReadStorageObjec } func (c *consoleClient) GetWalletLedger(ctx context.Context, in *GetWalletLedgerRequest, opts ...grpc.CallOption) (*WalletLedgerList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(WalletLedgerList) - err := c.cc.Invoke(ctx, Console_GetWalletLedger_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetWalletLedger_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -595,8 +635,9 @@ func (c *consoleClient) GetWalletLedger(ctx context.Context, in *GetWalletLedger } func (c *consoleClient) GetNotification(ctx context.Context, in *GetNotificationRequest, opts ...grpc.CallOption) (*Notification, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Notification) - err := c.cc.Invoke(ctx, Console_GetNotification_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetNotification_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -604,8 +645,9 @@ func (c *consoleClient) GetNotification(ctx context.Context, in *GetNotification } func (c *consoleClient) GetPurchase(ctx context.Context, in *GetPurchaseRequest, opts ...grpc.CallOption) (*api.ValidatedPurchase, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatedPurchase) - err := c.cc.Invoke(ctx, Console_GetPurchase_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetPurchase_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -613,8 +655,9 @@ func (c *consoleClient) GetPurchase(ctx context.Context, in *GetPurchaseRequest, } func (c *consoleClient) GetSubscription(ctx context.Context, in *GetSubscriptionRequest, opts ...grpc.CallOption) (*api.ValidatedSubscription, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatedSubscription) - err := c.cc.Invoke(ctx, Console_GetSubscription_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_GetSubscription_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -622,8 +665,9 @@ func (c *consoleClient) GetSubscription(ctx context.Context, in *GetSubscription } func (c *consoleClient) ListApiEndpoints(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ApiEndpointList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ApiEndpointList) - err := c.cc.Invoke(ctx, Console_ListApiEndpoints_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListApiEndpoints_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -631,8 +675,9 @@ func (c *consoleClient) ListApiEndpoints(ctx context.Context, in *emptypb.Empty, } func (c *consoleClient) ListLeaderboardRecords(ctx context.Context, in *api.ListLeaderboardRecordsRequest, opts ...grpc.CallOption) (*api.LeaderboardRecordList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.LeaderboardRecordList) - err := c.cc.Invoke(ctx, Console_ListLeaderboardRecords_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListLeaderboardRecords_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -640,8 +685,9 @@ func (c *consoleClient) ListLeaderboardRecords(ctx context.Context, in *api.List } func (c *consoleClient) ListLeaderboards(ctx context.Context, in *LeaderboardListRequest, opts ...grpc.CallOption) (*LeaderboardList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(LeaderboardList) - err := c.cc.Invoke(ctx, Console_ListLeaderboards_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListLeaderboards_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -649,8 +695,9 @@ func (c *consoleClient) ListLeaderboards(ctx context.Context, in *LeaderboardLis } func (c *consoleClient) ListStorage(ctx context.Context, in *ListStorageRequest, opts ...grpc.CallOption) (*StorageList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StorageList) - err := c.cc.Invoke(ctx, Console_ListStorage_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListStorage_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -658,8 +705,9 @@ func (c *consoleClient) ListStorage(ctx context.Context, in *ListStorageRequest, } func (c *consoleClient) ListStorageCollections(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*StorageCollectionsList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StorageCollectionsList) - err := c.cc.Invoke(ctx, Console_ListStorageCollections_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListStorageCollections_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -667,8 +715,9 @@ func (c *consoleClient) ListStorageCollections(ctx context.Context, in *emptypb. } func (c *consoleClient) ListAccounts(ctx context.Context, in *ListAccountsRequest, opts ...grpc.CallOption) (*AccountList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AccountList) - err := c.cc.Invoke(ctx, Console_ListAccounts_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListAccounts_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -676,8 +725,9 @@ func (c *consoleClient) ListAccounts(ctx context.Context, in *ListAccountsReques } func (c *consoleClient) ListChannelMessages(ctx context.Context, in *ListChannelMessagesRequest, opts ...grpc.CallOption) (*api.ChannelMessageList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ChannelMessageList) - err := c.cc.Invoke(ctx, Console_ListChannelMessages_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListChannelMessages_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -685,8 +735,9 @@ func (c *consoleClient) ListChannelMessages(ctx context.Context, in *ListChannel } func (c *consoleClient) ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*GroupList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GroupList) - err := c.cc.Invoke(ctx, Console_ListGroups_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListGroups_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -694,8 +745,9 @@ func (c *consoleClient) ListGroups(ctx context.Context, in *ListGroupsRequest, o } func (c *consoleClient) ListNotifications(ctx context.Context, in *ListNotificationsRequest, opts ...grpc.CallOption) (*NotificationList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(NotificationList) - err := c.cc.Invoke(ctx, Console_ListNotifications_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListNotifications_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -703,8 +755,9 @@ func (c *consoleClient) ListNotifications(ctx context.Context, in *ListNotificat } func (c *consoleClient) ListMatches(ctx context.Context, in *ListMatchesRequest, opts ...grpc.CallOption) (*MatchList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(MatchList) - err := c.cc.Invoke(ctx, Console_ListMatches_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListMatches_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -712,8 +765,9 @@ func (c *consoleClient) ListMatches(ctx context.Context, in *ListMatchesRequest, } func (c *consoleClient) ListPurchases(ctx context.Context, in *ListPurchasesRequest, opts ...grpc.CallOption) (*api.PurchaseList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.PurchaseList) - err := c.cc.Invoke(ctx, Console_ListPurchases_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListPurchases_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -721,8 +775,9 @@ func (c *consoleClient) ListPurchases(ctx context.Context, in *ListPurchasesRequ } func (c *consoleClient) ListSubscriptions(ctx context.Context, in *ListSubscriptionsRequest, opts ...grpc.CallOption) (*api.SubscriptionList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.SubscriptionList) - err := c.cc.Invoke(ctx, Console_ListSubscriptions_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListSubscriptions_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -730,8 +785,9 @@ func (c *consoleClient) ListSubscriptions(ctx context.Context, in *ListSubscript } func (c *consoleClient) ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserList, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UserList) - err := c.cc.Invoke(ctx, Console_ListUsers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ListUsers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -739,8 +795,9 @@ func (c *consoleClient) ListUsers(ctx context.Context, in *emptypb.Empty, opts . } func (c *consoleClient) PromoteGroupMember(ctx context.Context, in *UpdateGroupUserStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_PromoteGroupMember_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_PromoteGroupMember_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -748,8 +805,9 @@ func (c *consoleClient) PromoteGroupMember(ctx context.Context, in *UpdateGroupU } func (c *consoleClient) RequireUserMfa(ctx context.Context, in *RequireUserMfaRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_RequireUserMfa_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_RequireUserMfa_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -757,8 +815,9 @@ func (c *consoleClient) RequireUserMfa(ctx context.Context, in *RequireUserMfaRe } func (c *consoleClient) ResetUserMfa(ctx context.Context, in *ResetUserMfaRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_ResetUserMfa_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_ResetUserMfa_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -766,8 +825,9 @@ func (c *consoleClient) ResetUserMfa(ctx context.Context, in *ResetUserMfaReques } func (c *consoleClient) UnbanAccount(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnbanAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnbanAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -775,8 +835,9 @@ func (c *consoleClient) UnbanAccount(ctx context.Context, in *AccountId, opts .. } func (c *consoleClient) UnlinkCustom(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkCustom_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkCustom_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -784,8 +845,9 @@ func (c *consoleClient) UnlinkCustom(ctx context.Context, in *AccountId, opts .. } func (c *consoleClient) UnlinkDevice(ctx context.Context, in *UnlinkDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkDevice_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkDevice_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -793,8 +855,9 @@ func (c *consoleClient) UnlinkDevice(ctx context.Context, in *UnlinkDeviceReques } func (c *consoleClient) UnlinkEmail(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkEmail_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -802,8 +865,9 @@ func (c *consoleClient) UnlinkEmail(ctx context.Context, in *AccountId, opts ... } func (c *consoleClient) UnlinkApple(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkApple_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkApple_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -811,8 +875,9 @@ func (c *consoleClient) UnlinkApple(ctx context.Context, in *AccountId, opts ... } func (c *consoleClient) UnlinkFacebook(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkFacebook_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkFacebook_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -820,8 +885,9 @@ func (c *consoleClient) UnlinkFacebook(ctx context.Context, in *AccountId, opts } func (c *consoleClient) UnlinkFacebookInstantGame(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkFacebookInstantGame_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkFacebookInstantGame_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -829,8 +895,9 @@ func (c *consoleClient) UnlinkFacebookInstantGame(ctx context.Context, in *Accou } func (c *consoleClient) UnlinkGameCenter(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkGameCenter_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkGameCenter_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -838,8 +905,9 @@ func (c *consoleClient) UnlinkGameCenter(ctx context.Context, in *AccountId, opt } func (c *consoleClient) UnlinkGoogle(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkGoogle_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkGoogle_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -847,8 +915,9 @@ func (c *consoleClient) UnlinkGoogle(ctx context.Context, in *AccountId, opts .. } func (c *consoleClient) UnlinkSteam(ctx context.Context, in *AccountId, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UnlinkSteam_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UnlinkSteam_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -856,8 +925,9 @@ func (c *consoleClient) UnlinkSteam(ctx context.Context, in *AccountId, opts ... } func (c *consoleClient) UpdateAccount(ctx context.Context, in *UpdateAccountRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UpdateAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UpdateAccount_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -865,8 +935,9 @@ func (c *consoleClient) UpdateAccount(ctx context.Context, in *UpdateAccountRequ } func (c *consoleClient) UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Console_UpdateGroup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_UpdateGroup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -874,8 +945,9 @@ func (c *consoleClient) UpdateGroup(ctx context.Context, in *UpdateGroupRequest, } func (c *consoleClient) WriteStorageObject(ctx context.Context, in *WriteStorageObjectRequest, opts ...grpc.CallOption) (*api.StorageObjectAck, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.StorageObjectAck) - err := c.cc.Invoke(ctx, Console_WriteStorageObject_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Console_WriteStorageObject_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -884,7 +956,10 @@ func (c *consoleClient) WriteStorageObject(ctx context.Context, in *WriteStorage // ConsoleServer is the server API for Console service. // All implementations must embed UnimplementedConsoleServer -// for forward compatibility +// for forward compatibility. +// +// * +// The developer console RPC protocol service built with GRPC. type ConsoleServer interface { // Authenticate a console user with username and password. Authenticate(context.Context, *AuthenticateRequest) (*ConsoleSession, error) @@ -1027,9 +1102,12 @@ type ConsoleServer interface { mustEmbedUnimplementedConsoleServer() } -// UnimplementedConsoleServer must be embedded to have forward compatible implementations. -type UnimplementedConsoleServer struct { -} +// UnimplementedConsoleServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedConsoleServer struct{} func (UnimplementedConsoleServer) Authenticate(context.Context, *AuthenticateRequest) (*ConsoleSession, error) { return nil, status.Errorf(codes.Unimplemented, "method Authenticate not implemented") @@ -1239,6 +1317,7 @@ func (UnimplementedConsoleServer) WriteStorageObject(context.Context, *WriteStor return nil, status.Errorf(codes.Unimplemented, "method WriteStorageObject not implemented") } func (UnimplementedConsoleServer) mustEmbedUnimplementedConsoleServer() {} +func (UnimplementedConsoleServer) testEmbeddedByValue() {} // UnsafeConsoleServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ConsoleServer will @@ -1248,6 +1327,13 @@ type UnsafeConsoleServer interface { } func RegisterConsoleServer(s grpc.ServiceRegistrar, srv ConsoleServer) { + // If the following call pancis, it indicates UnimplementedConsoleServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Console_ServiceDesc, srv) } diff --git a/console/ui/src/app/console.service.ts b/console/ui/src/app/console.service.ts index 46c820c709..01548bc457 100644 --- a/console/ui/src/app/console.service.ts +++ b/console/ui/src/app/console.service.ts @@ -780,6 +780,7 @@ export enum ApiStoreProvider { GOOGLE_PLAY_STORE = 1, HUAWEI_APP_GALLERY = 2, FACEBOOK_INSTANT_STORE = 3, + XBOX_STORE = 4, } /** A list of validated subscriptions stored by Nakama. */ diff --git a/go.mod b/go.mod index 756497f94d..8cc3c03d7e 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/twmb/murmur3 v1.1.8 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/net v0.37.0 // indirect + golang.org/x/net v0.38.0 // indirect golang.org/x/sync v0.13.0 // indirect golang.org/x/sys v0.32.0 // indirect golang.org/x/text v0.24.0 // indirect diff --git a/go.sum b/go.sum index cf5f6cc81f..e96561f36a 100644 --- a/go.sum +++ b/go.sum @@ -98,8 +98,6 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/heroiclabs/nakama-common v1.37.0 h1:RceEGzvb+d+kPZY7ONbfozjaVyX3wIqNA/zZyp+M+mw= -github.com/heroiclabs/nakama-common v1.37.0/go.mod h1:gpGzr0tineLtVeNuBNfN4lObWfalcXClXdH/LHV9IX0= github.com/heroiclabs/sql-migrate v0.0.0-20241125131053-95a7949783b0 h1:hHJcYOP6L2/wZIEnYjjkJM+rOk/bK0uaYkDAejYpLhI= github.com/heroiclabs/sql-migrate v0.0.0-20241125131053-95a7949783b0/go.mod h1:uwcmopkVQIfb/JQqul5zmGI9ounclRC08j9S9lLcpRQ= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -203,8 +201,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/main.go b/main.go index f395dece10..af0ead2eb1 100644 --- a/main.go +++ b/main.go @@ -187,6 +187,7 @@ func main() { leaderboardRankCache := server.NewLocalLeaderboardRankCache(ctx, startupLogger, db, config.GetLeaderboard(), leaderboardCache) leaderboardScheduler := server.NewLocalLeaderboardScheduler(logger, db, config, leaderboardCache, leaderboardRankCache) googleRefundScheduler := server.NewGoogleRefundScheduler(logger, db, config) + xboxRefundPoller := server.NewXboxRefundPoller(logger, db, config) matchRegistry := server.NewLocalMatchRegistry(logger, startupLogger, config, sessionRegistry, tracker, router, metrics, config.GetName()) tracker.SetMatchJoinListener(matchRegistry.Join) tracker.SetMatchLeaveListener(matchRegistry.Leave) @@ -215,6 +216,7 @@ func main() { leaderboardScheduler.Start(runtime) googleRefundScheduler.Start(runtime) + xboxRefundPoller.Start(runtime) pipeline := server.NewPipeline(logger, config, db, jsonpbMarshaler, jsonpbUnmarshaler, sessionRegistry, statusRegistry, matchRegistry, partyRegistry, matchmaker, tracker, router, runtime) statusHandler := server.NewLocalStatusHandler(logger, sessionRegistry, matchRegistry, tracker, metrics, config.GetName()) diff --git a/server/api_purchase.go b/server/api_purchase.go index 40c499cddf..a09e1cf8ab 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -300,7 +300,7 @@ func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePu } //validation, err := ValidatePurchaseFacebookInstant(ctx, s.logger, s.db, userID, s.config.GetIAP().FacebookInstant, in.SignedRequest, persist) - validation, err := s.runtime.iapXboxManager.PurchaseValidateXbox(ctx, s.logger, s.db, s.config.GetIAP().Xbox.Token, in.ProductId, userID, persist) + validation, err := s.runtime.iapXboxManager.PurchaseValidate(ctx, s.logger, s.db, s.config.GetIAP().Xbox.Token, in.ProductId, userID, persist) if err != nil { return nil, err } diff --git a/server/config.go b/server/config.go index a07bb33613..dba3b94ea9 100644 --- a/server/config.go +++ b/server/config.go @@ -1538,7 +1538,8 @@ func (i IAPFacebookInstantConfig) GetAppSecret() string { } type IAPXboxConfig struct { - Token string `yaml:"token" json:"token" usage:"Xbox credentials token"` + Token string `yaml:"token" json:"token" usage:"Xbox credentials token"` + RefundCheckPeriodMin int `yaml:"refund_check_period_min" json:"refund_check_period_min" usage:"Defines the polling interval in minutes of the azure queue that the microsoft clawback service uses."` } func (i IAPXboxConfig) GetToken() string { return i.Token } diff --git a/server/console.go b/server/console.go index eff761b609..885ddca666 100644 --- a/server/console.go +++ b/server/console.go @@ -291,6 +291,8 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D logger.Info("Registered endpoint for Google subscription notifications callback", zap.String("endpoint", endpoint)) } + runtime.iapXboxManager.Init(runtime.PurchaseNotificationXbox()) + // TODO: Register Huawei callbacks // pprof routes diff --git a/server/runtime.go b/server/runtime.go index 829b635d36..7990d4033a 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -233,6 +233,7 @@ type ( RuntimeSubscriptionNotificationAppleFunction func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error RuntimePurchaseNotificationGoogleFunction func(ctx context.Context, purchase *api.ValidatedPurchase, providerPayload string) error RuntimeSubscriptionNotificationGoogleFunction func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error + RuntimePurchaseNotificationXboxFunction func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error RuntimeStorageIndexFilterFunction func(ctx context.Context, write *StorageOpWrite) (bool, error) @@ -269,6 +270,7 @@ const ( RuntimeExecutionModeSubscriptionNotificationApple RuntimeExecutionModePurchaseNotificationGoogle RuntimeExecutionModeSubscriptionNotificationGoogle + RuntimeExecutionModePurchaseNotificationXbox RuntimeExecutionModeStorageIndexFilter RuntimeExecutionModeShutdown ) @@ -307,6 +309,8 @@ func (e RuntimeExecutionMode) String() string { return "purchase_notification_google" case RuntimeExecutionModeSubscriptionNotificationGoogle: return "subscription_notification_google" + case RuntimeExecutionModePurchaseNotificationXbox: + return "purchase_notification_xbox" case RuntimeExecutionModeStorageIndexFilter: return "storage_index_filter" case RuntimeExecutionModeShutdown: @@ -543,6 +547,7 @@ type Runtime struct { subscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction purchaseNotificationGoogleFunction RuntimePurchaseNotificationGoogleFunction subscriptionNotificationGoogleFunction RuntimeSubscriptionNotificationGoogleFunction + purchaseNotificationXboxFunction RuntimePurchaseNotificationXboxFunction storageIndexFilterFunctions map[string]RuntimeStorageIndexFilterFunction @@ -556,7 +561,7 @@ type Runtime struct { fleetManager runtime.FleetManager - iapXboxManager runtime.IAPXboxManager + iapXboxManager runtime.IAPManager } type MatchNamesListFunction func() []string @@ -683,7 +688,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. config.GetSatori().CacheEnabled, ) - goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goIndexFilterFns, fleetManager, iapXboxManager, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) + goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goPurchaseNotificationXboxFn, goIndexFilterFns, fleetManager, iapXboxManager, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) if err != nil { startupLogger.Error("Error initialising Go runtime provider", zap.Error(err)) return nil, nil, err @@ -2635,6 +2640,13 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. startupLogger.Info("Registered JavaScript runtime Purchase Notification Apple function invocation") } + var allPurchaseNotificationXboxFunction RuntimePurchaseNotificationXboxFunction + switch { + case goPurchaseNotificationXboxFn != nil: + allPurchaseNotificationXboxFunction = goPurchaseNotificationXboxFn + startupLogger.Info("Registered Go runtime Purchase Notification Xbox function invocation") + } + var allSubscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction switch { case goSubscriptionNotificationAppleFn != nil: @@ -2737,6 +2749,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. subscriptionNotificationAppleFunction: allSubscriptionNotificationAppleFunction, purchaseNotificationGoogleFunction: allPurchaseNotificationGoogleFunction, subscriptionNotificationGoogleFunction: allSubscriptionNotificationGoogleFunction, + purchaseNotificationXboxFunction: allPurchaseNotificationXboxFunction, storageIndexFilterFunctions: allStorageIndexFilterFunctions, httpHandlers: httpHandlers, @@ -3525,6 +3538,10 @@ func (r *Runtime) SubscriptionNotificationGoogle() RuntimeSubscriptionNotificati return r.subscriptionNotificationGoogleFunction } +func (r *Runtime) PurchaseNotificationXbox() RuntimePurchaseNotificationXboxFunction { + return r.purchaseNotificationXboxFunction +} + func (r *Runtime) LeaderboardReset() RuntimeLeaderboardResetFunction { return r.leaderboardResetFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index 960992d247..a158739cf5 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -64,6 +64,7 @@ type RuntimeGoInitializer struct { subscriptionNotificationApple RuntimeSubscriptionNotificationAppleFunction purchaseNotificationGoogle RuntimePurchaseNotificationGoogleFunction subscriptionNotificationGoogle RuntimeSubscriptionNotificationGoogleFunction + purchaseNotificationXbox RuntimePurchaseNotificationXboxFunction matchmakerOverride RuntimeMatchmakerOverrideFunction storageIndexFunctions map[string]RuntimeStorageIndexFilterFunction httpHandlers []*RuntimeHttpHandler @@ -81,7 +82,7 @@ type RuntimeGoInitializer struct { fmCallbackHandler runtime.FmCallbackHandler - iapXboxManager runtime.IAPXboxManager + iapXboxManager runtime.IAPManager registeredIAPs []string } @@ -2796,6 +2797,14 @@ func (ri *RuntimeGoInitializer) RegisterSubscriptionNotificationGoogle(fn func(c return nil } +func (ri *RuntimeGoInitializer) RegisterPurchaseNotificationXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error) error { + ri.purchaseNotificationXbox = func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModePurchaseNotificationXbox, nil, nil, 0, "", "", nil, "", "", "", "") + return fn(ctx, ri.logger.WithField("mode", RuntimeExecutionModePurchaseNotificationXbox.String()), ri.db, ri.nk, purchase, providerPayload) + } + return nil +} + func (ri *RuntimeGoInitializer) RegisterStorageIndex(name, collection, key string, fields []string, sortableFields []string, maxEntries int, indexOnly bool) error { return ri.storageIndex.CreateIndex(context.Background(), name, collection, key, fields, sortableFields, maxEntries, indexOnly) } @@ -2843,7 +2852,7 @@ func (ri *RuntimeGoInitializer) RegisterIAPManager(platform string, iapManager i switch p { case iap.Xbox: - if iapMan, ok := iapManager.(runtime.IAPXboxManager); ok { + if iapMan, ok := iapManager.(runtime.IAPManager); ok { if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { ri.iapXboxManager = iapMan nk.IAPXboxManager = iapMan @@ -2883,7 +2892,7 @@ func (ri *RuntimeGoInitializer) RegisterMatch(name string, fn func(ctx context.C return nil } -func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, runtime.IAPXboxManager, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { +func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, RuntimePurchaseNotificationXboxFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, runtime.IAPManager, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { runtimeLogger := NewRuntimeGoLogger(logger) node := config.GetName() env := config.GetRuntime().Environment @@ -2972,13 +2981,13 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger relPath, name, fn, err := openGoModule(startupLogger, rootPath, path) if err != nil { // Errors are already logged in the function above. - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err } // Run the initialisation. if err = fn(ctx, runtimeLogger, db, nk, initializer); err != nil { startupLogger.Fatal("Error returned by InitModule function in Go module", zap.String("name", name), zap.Error(err)) - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") } modulePaths = append(modulePaths, relPath) } @@ -3026,7 +3035,7 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger } } - return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.storageIndexFunctions, initializer.fleetManager, initializer.iapXboxManager, initializer.httpHandlers, events, matchNamesListFn, nil + return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.purchaseNotificationXbox, initializer.storageIndexFunctions, initializer.fleetManager, initializer.iapXboxManager, initializer.httpHandlers, events, matchNamesListFn, nil } func CheckRuntimeProviderGo(logger *zap.Logger, rootPath string, paths []string) error { diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index 3f58821473..b9ca00452b 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -64,7 +64,7 @@ type RuntimeGoNakamaModule struct { satori runtime.Satori fleetManager runtime.FleetManager storageIndex StorageIndex - IAPXboxManager runtime.IAPXboxManager + IAPXboxManager runtime.IAPManager } func NewRuntimeGoNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori) *RuntimeGoNakamaModule { diff --git a/server/xbox_refund_poller.go b/server/xbox_refund_poller.go new file mode 100644 index 0000000000..ed1ab804f3 --- /dev/null +++ b/server/xbox_refund_poller.go @@ -0,0 +1,75 @@ +package server + +import ( + "context" + "database/sql" + "go.uber.org/atomic" + "go.uber.org/zap" + "time" +) + +type XboxRefundPoller interface { + Start(runtime *Runtime) + Pause() + Resume() + Stop() +} + +type LocalXboxRefundPoller struct { + ctx context.Context + logger *zap.Logger + db *sql.DB + active *atomic.Uint32 + ctxCancelFn context.CancelFunc + config Config +} + +func NewXboxRefundPoller(logger *zap.Logger, db *sql.DB, config Config) *LocalXboxRefundPoller { + ctx, ctxCancelFn := context.WithCancel(context.Background()) + + return &LocalXboxRefundPoller{ + ctx: ctx, + logger: logger, + db: db, + active: atomic.NewUint32(0), + ctxCancelFn: ctxCancelFn, + config: config, + } +} + +func (x *LocalXboxRefundPoller) Start(runtime *Runtime) { + period := x.config.GetIAP().Xbox.RefundCheckPeriodMin + if period != 0 { + if runtime.purchaseNotificationXboxFunction != nil && period != 0 { + go func() { + ticker := time.NewTicker(1 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-x.ctx.Done(): + return + case <-ticker.C: + err := runtime.iapXboxManager.HandleRefund(x.ctx, x.logger, x.db) + if err != nil { + x.logger.Error("xbox refund poller failed", zap.Error(err)) + continue + } + } + } + }() + } + } +} + +func (x *LocalXboxRefundPoller) Pause() { + x.active.Store(0) +} + +func (x *LocalXboxRefundPoller) Resume() { + x.active.Store(1) +} + +func (x *LocalXboxRefundPoller) Stop() { + x.ctxCancelFn() +} diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index 2af429c214..9585f1d770 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.29.3 +// protoc-gen-go v1.36.6 +// protoc v4.24.3 // source: api.proto package api @@ -30,6 +30,7 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -51,6 +52,8 @@ const ( StoreProvider_HUAWEI_APP_GALLERY StoreProvider = 2 // Facebook Instant Store StoreProvider_FACEBOOK_INSTANT_STORE StoreProvider = 3 + // Xbox Store + StoreProvider_XBOX_STORE StoreProvider = 4 ) // Enum value maps for StoreProvider. @@ -60,12 +63,14 @@ var ( 1: "GOOGLE_PLAY_STORE", 2: "HUAWEI_APP_GALLERY", 3: "FACEBOOK_INSTANT_STORE", + 4: "XBOX_STORE", } StoreProvider_value = map[string]int32{ "APPLE_APP_STORE": 0, "GOOGLE_PLAY_STORE": 1, "HUAWEI_APP_GALLERY": 2, "FACEBOOK_INSTANT_STORE": 3, + "XBOX_STORE": 4, } ) @@ -383,10 +388,7 @@ func (UserGroupList_UserGroup_State) EnumDescriptor() ([]byte, []int) { // A user with additional account details. Always the current user. type Account struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user object. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // The user's wallet data. @@ -400,16 +402,16 @@ type Account struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's email was verified. VerifyTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=verify_time,json=verifyTime,proto3" json:"verify_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's account was disabled/banned. - DisableTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` + DisableTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Account) Reset() { *x = Account{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Account) String() string { @@ -420,7 +422,7 @@ func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -486,23 +488,20 @@ func (x *Account) GetDisableTime() *timestamppb.Timestamp { // Obtain a new authentication token using a refresh token. type AccountRefresh struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Refresh token. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountRefresh) Reset() { *x = AccountRefresh{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountRefresh) String() string { @@ -513,7 +512,7 @@ func (*AccountRefresh) ProtoMessage() {} func (x *AccountRefresh) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -544,23 +543,20 @@ func (x *AccountRefresh) GetVars() map[string]string { // Send a Apple Sign In token to the server. Used with authenticate/link/unlink. type AccountApple struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID token received from Apple to validate. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountApple) Reset() { *x = AccountApple{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountApple) String() string { @@ -571,7 +567,7 @@ func (*AccountApple) ProtoMessage() {} func (x *AccountApple) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -602,23 +598,20 @@ func (x *AccountApple) GetVars() map[string]string { // Send a custom ID to the server. Used with authenticate/link/unlink. type AccountCustom struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A custom identifier. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountCustom) Reset() { *x = AccountCustom{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountCustom) String() string { @@ -629,7 +622,7 @@ func (*AccountCustom) ProtoMessage() {} func (x *AccountCustom) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -660,23 +653,20 @@ func (x *AccountCustom) GetVars() map[string]string { // Send a device to the server. Used with authenticate/link/unlink and user. type AccountDevice struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A device identifier. Should be obtained by a platform-specific device API. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountDevice) Reset() { *x = AccountDevice{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountDevice) String() string { @@ -687,7 +677,7 @@ func (*AccountDevice) ProtoMessage() {} func (x *AccountDevice) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -718,25 +708,22 @@ func (x *AccountDevice) GetVars() map[string]string { // Send an email with password to the server. Used with authenticate/link/unlink. type AccountEmail struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A valid RFC-5322 email address. Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` // A password for the user account. Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` // Ignored with unlink operations. // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,3,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,3,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountEmail) Reset() { *x = AccountEmail{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountEmail) String() string { @@ -747,7 +734,7 @@ func (*AccountEmail) ProtoMessage() {} func (x *AccountEmail) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -785,23 +772,20 @@ func (x *AccountEmail) GetVars() map[string]string { // Send a Facebook token to the server. Used with authenticate/link/unlink. type AccountFacebook struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The OAuth token received from Facebook to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountFacebook) Reset() { *x = AccountFacebook{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountFacebook) String() string { @@ -812,7 +796,7 @@ func (*AccountFacebook) ProtoMessage() {} func (x *AccountFacebook) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -843,23 +827,20 @@ func (x *AccountFacebook) GetVars() map[string]string { // Send a Facebook Instant Game token to the server. Used with authenticate/link/unlink. type AccountFacebookInstantGame struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The OAuth token received from a Facebook Instant Game that may be decoded with the Application Secret (must be available with the nakama configuration) SignedPlayerInfo string `protobuf:"bytes,1,opt,name=signed_player_info,json=signedPlayerInfo,proto3" json:"signed_player_info,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountFacebookInstantGame) Reset() { *x = AccountFacebookInstantGame{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountFacebookInstantGame) String() string { @@ -870,7 +851,7 @@ func (*AccountFacebookInstantGame) ProtoMessage() {} func (x *AccountFacebookInstantGame) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -901,10 +882,7 @@ func (x *AccountFacebookInstantGame) GetVars() map[string]string { // Send Apple's Game Center account credentials to the server. Used with authenticate/link/unlink. type AccountGameCenter struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Player ID (generated by GameCenter). PlayerId string `protobuf:"bytes,1,opt,name=player_id,json=playerId,proto3" json:"player_id,omitempty"` // Bundle ID (generated by GameCenter). @@ -918,16 +896,16 @@ type AccountGameCenter struct { // The URL for the public encryption key. PublicKeyUrl string `protobuf:"bytes,6,opt,name=public_key_url,json=publicKeyUrl,proto3" json:"public_key_url,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountGameCenter) Reset() { *x = AccountGameCenter{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountGameCenter) String() string { @@ -938,7 +916,7 @@ func (*AccountGameCenter) ProtoMessage() {} func (x *AccountGameCenter) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1004,23 +982,20 @@ func (x *AccountGameCenter) GetVars() map[string]string { // Send a Google token to the server. Used with authenticate/link/unlink. type AccountGoogle struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The OAuth token received from Google to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountGoogle) Reset() { *x = AccountGoogle{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountGoogle) String() string { @@ -1031,7 +1006,7 @@ func (*AccountGoogle) ProtoMessage() {} func (x *AccountGoogle) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1062,23 +1037,20 @@ func (x *AccountGoogle) GetVars() map[string]string { // Send a Steam token to the server. Used with authenticate/link/unlink. type AccountSteam struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account token received from Steam to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountSteam) Reset() { *x = AccountSteam{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountSteam) String() string { @@ -1089,7 +1061,7 @@ func (*AccountSteam) ProtoMessage() {} func (x *AccountSteam) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1120,25 +1092,22 @@ func (x *AccountSteam) GetVars() map[string]string { // Add one or more friends to the current user. type AddFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` // Optional metadata to add to friends. - Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddFriendsRequest) Reset() { *x = AddFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddFriendsRequest) String() string { @@ -1149,7 +1118,7 @@ func (*AddFriendsRequest) ProtoMessage() {} func (x *AddFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1187,23 +1156,20 @@ func (x *AddFriendsRequest) GetMetadata() string { // Add users to a group. type AddGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group to add users to. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to add. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddGroupUsersRequest) Reset() { *x = AddGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddGroupUsersRequest) String() string { @@ -1214,7 +1180,7 @@ func (*AddGroupUsersRequest) ProtoMessage() {} func (x *AddGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1245,23 +1211,20 @@ func (x *AddGroupUsersRequest) GetUserIds() []string { // Authenticate against the server with a refresh token. type SessionRefreshRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Refresh token. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SessionRefreshRequest) Reset() { *x = SessionRefreshRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SessionRefreshRequest) String() string { @@ -1272,7 +1235,7 @@ func (*SessionRefreshRequest) ProtoMessage() {} func (x *SessionRefreshRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1303,23 +1266,20 @@ func (x *SessionRefreshRequest) GetVars() map[string]string { // Log out a session, invalidate a refresh token, or log out all sessions/refresh tokens for a user. type SessionLogoutRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Session token to log out. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Refresh token to invalidate. - RefreshToken string `protobuf:"bytes,2,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + RefreshToken string `protobuf:"bytes,2,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SessionLogoutRequest) Reset() { *x = SessionLogoutRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SessionLogoutRequest) String() string { @@ -1330,7 +1290,7 @@ func (*SessionLogoutRequest) ProtoMessage() {} func (x *SessionLogoutRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1361,25 +1321,22 @@ func (x *SessionLogoutRequest) GetRefreshToken() string { // Authenticate against the server with Apple Sign In. type AuthenticateAppleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Apple account details. Account *AccountApple `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateAppleRequest) Reset() { *x = AuthenticateAppleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateAppleRequest) String() string { @@ -1390,7 +1347,7 @@ func (*AuthenticateAppleRequest) ProtoMessage() {} func (x *AuthenticateAppleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1428,25 +1385,22 @@ func (x *AuthenticateAppleRequest) GetUsername() string { // Authenticate against the server with a custom ID. type AuthenticateCustomRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The custom account details. Account *AccountCustom `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateCustomRequest) Reset() { *x = AuthenticateCustomRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateCustomRequest) String() string { @@ -1457,7 +1411,7 @@ func (*AuthenticateCustomRequest) ProtoMessage() {} func (x *AuthenticateCustomRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1495,25 +1449,22 @@ func (x *AuthenticateCustomRequest) GetUsername() string { // Authenticate against the server with a device ID. type AuthenticateDeviceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The device account details. Account *AccountDevice `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateDeviceRequest) Reset() { *x = AuthenticateDeviceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateDeviceRequest) String() string { @@ -1524,7 +1475,7 @@ func (*AuthenticateDeviceRequest) ProtoMessage() {} func (x *AuthenticateDeviceRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1562,25 +1513,22 @@ func (x *AuthenticateDeviceRequest) GetUsername() string { // Authenticate against the server with email+password. type AuthenticateEmailRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The email account details. Account *AccountEmail `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateEmailRequest) Reset() { *x = AuthenticateEmailRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateEmailRequest) String() string { @@ -1591,7 +1539,7 @@ func (*AuthenticateEmailRequest) ProtoMessage() {} func (x *AuthenticateEmailRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1629,10 +1577,7 @@ func (x *AuthenticateEmailRequest) GetUsername() string { // Authenticate against the server with Facebook. type AuthenticateFacebookRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. @@ -1640,16 +1585,16 @@ type AuthenticateFacebookRequest struct { // Set the username on the account at register. Must be unique. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` // Import Facebook friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateFacebookRequest) Reset() { *x = AuthenticateFacebookRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateFacebookRequest) String() string { @@ -1660,7 +1605,7 @@ func (*AuthenticateFacebookRequest) ProtoMessage() {} func (x *AuthenticateFacebookRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1705,25 +1650,22 @@ func (x *AuthenticateFacebookRequest) GetSync() *wrapperspb.BoolValue { // Authenticate against the server with Facebook Instant Game token. type AuthenticateFacebookInstantGameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook Instant Game account details. Account *AccountFacebookInstantGame `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateFacebookInstantGameRequest) Reset() { *x = AuthenticateFacebookInstantGameRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateFacebookInstantGameRequest) String() string { @@ -1734,7 +1676,7 @@ func (*AuthenticateFacebookInstantGameRequest) ProtoMessage() {} func (x *AuthenticateFacebookInstantGameRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1772,25 +1714,22 @@ func (x *AuthenticateFacebookInstantGameRequest) GetUsername() string { // Authenticate against the server with Apple's Game Center. type AuthenticateGameCenterRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Game Center account details. Account *AccountGameCenter `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateGameCenterRequest) Reset() { *x = AuthenticateGameCenterRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateGameCenterRequest) String() string { @@ -1801,7 +1740,7 @@ func (*AuthenticateGameCenterRequest) ProtoMessage() {} func (x *AuthenticateGameCenterRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1839,25 +1778,22 @@ func (x *AuthenticateGameCenterRequest) GetUsername() string { // Authenticate against the server with Google. type AuthenticateGoogleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Google account details. Account *AccountGoogle `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateGoogleRequest) Reset() { *x = AuthenticateGoogleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateGoogleRequest) String() string { @@ -1868,7 +1804,7 @@ func (*AuthenticateGoogleRequest) ProtoMessage() {} func (x *AuthenticateGoogleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1906,10 +1842,7 @@ func (x *AuthenticateGoogleRequest) GetUsername() string { // Authenticate against the server with Steam. type AuthenticateSteamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Steam account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. @@ -1917,16 +1850,16 @@ type AuthenticateSteamRequest struct { // Set the username on the account at register. Must be unique. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` // Import Steam friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateSteamRequest) Reset() { *x = AuthenticateSteamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateSteamRequest) String() string { @@ -1937,7 +1870,7 @@ func (*AuthenticateSteamRequest) ProtoMessage() {} func (x *AuthenticateSteamRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1982,23 +1915,20 @@ func (x *AuthenticateSteamRequest) GetSync() *wrapperspb.BoolValue { // Ban users from a group. type BanGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group to ban users from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to ban. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BanGroupUsersRequest) Reset() { *x = BanGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *BanGroupUsersRequest) String() string { @@ -2009,7 +1939,7 @@ func (*BanGroupUsersRequest) ProtoMessage() {} func (x *BanGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2040,23 +1970,20 @@ func (x *BanGroupUsersRequest) GetUserIds() []string { // Block one or more friends for the current user. type BlockFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BlockFriendsRequest) Reset() { *x = BlockFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *BlockFriendsRequest) String() string { @@ -2067,7 +1994,7 @@ func (*BlockFriendsRequest) ProtoMessage() {} func (x *BlockFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2098,10 +2025,7 @@ func (x *BlockFriendsRequest) GetUsernames() []string { // A message sent on a channel. type ChannelMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel this message belongs to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The unique ID of this message. @@ -2127,16 +2051,16 @@ type ChannelMessage struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,12,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,13,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,13,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessage) Reset() { *x = ChannelMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessage) String() string { @@ -2147,7 +2071,7 @@ func (*ChannelMessage) ProtoMessage() {} func (x *ChannelMessage) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2255,10 +2179,7 @@ func (x *ChannelMessage) GetUserIdTwo() string { // A list of channel messages, usually a result of a list operation. type ChannelMessageList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of messages. Messages []*ChannelMessage `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` // The cursor to send when retrieving the next page, if any. @@ -2267,15 +2188,15 @@ type ChannelMessageList struct { PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // Cacheable cursor to list newer messages. Durable and designed to be stored, unlike next/prev cursors. CacheableCursor string `protobuf:"bytes,4,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageList) Reset() { *x = ChannelMessageList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageList) String() string { @@ -2286,7 +2207,7 @@ func (*ChannelMessageList) ProtoMessage() {} func (x *ChannelMessageList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2331,10 +2252,7 @@ func (x *ChannelMessageList) GetCacheableCursor() string { // Create a group with the current user as owner. type CreateGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A unique name for the group. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // A description for the group. @@ -2346,16 +2264,16 @@ type CreateGroupRequest struct { // Mark a group as open or not where only admins can accept members. Open bool `protobuf:"varint,5,opt,name=open,proto3" json:"open,omitempty"` // Maximum number of group members. - MaxCount int32 `protobuf:"varint,6,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` + MaxCount int32 `protobuf:"varint,6,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateGroupRequest) Reset() { *x = CreateGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateGroupRequest) String() string { @@ -2366,7 +2284,7 @@ func (*CreateGroupRequest) ProtoMessage() {} func (x *CreateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2425,23 +2343,20 @@ func (x *CreateGroupRequest) GetMaxCount() int32 { // Delete one or more friends for the current user. type DeleteFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteFriendsRequest) Reset() { *x = DeleteFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteFriendsRequest) String() string { @@ -2452,7 +2367,7 @@ func (*DeleteFriendsRequest) ProtoMessage() {} func (x *DeleteFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2483,21 +2398,18 @@ func (x *DeleteFriendsRequest) GetUsernames() []string { // Delete a group the user has access to. type DeleteGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of a group. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteGroupRequest) Reset() { *x = DeleteGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteGroupRequest) String() string { @@ -2508,7 +2420,7 @@ func (*DeleteGroupRequest) ProtoMessage() {} func (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2532,21 +2444,18 @@ func (x *DeleteGroupRequest) GetGroupId() string { // Delete a leaderboard record. type DeleteLeaderboardRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The leaderboard ID to delete from. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteLeaderboardRecordRequest) Reset() { *x = DeleteLeaderboardRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteLeaderboardRecordRequest) String() string { @@ -2557,7 +2466,7 @@ func (*DeleteLeaderboardRecordRequest) ProtoMessage() {} func (x *DeleteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2581,21 +2490,18 @@ func (x *DeleteLeaderboardRecordRequest) GetLeaderboardId() string { // Delete one or more notifications for the current user. type DeleteNotificationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of notifications. - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteNotificationsRequest) Reset() { *x = DeleteNotificationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteNotificationsRequest) String() string { @@ -2606,7 +2512,7 @@ func (*DeleteNotificationsRequest) ProtoMessage() {} func (x *DeleteNotificationsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2630,21 +2536,18 @@ func (x *DeleteNotificationsRequest) GetIds() []string { // Delete a leaderboard record. type DeleteTournamentRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The tournament ID to delete from. - TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteTournamentRecordRequest) Reset() { *x = DeleteTournamentRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteTournamentRecordRequest) String() string { @@ -2655,7 +2558,7 @@ func (*DeleteTournamentRecordRequest) ProtoMessage() {} func (x *DeleteTournamentRecordRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2679,25 +2582,22 @@ func (x *DeleteTournamentRecordRequest) GetTournamentId() string { // Storage objects to delete. type DeleteStorageObjectId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // The version hash of the object. - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteStorageObjectId) Reset() { *x = DeleteStorageObjectId{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteStorageObjectId) String() string { @@ -2708,7 +2608,7 @@ func (*DeleteStorageObjectId) ProtoMessage() {} func (x *DeleteStorageObjectId) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2746,21 +2646,18 @@ func (x *DeleteStorageObjectId) GetVersion() string { // Batch delete storage objects. type DeleteStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Batch of storage objects. - ObjectIds []*DeleteStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + ObjectIds []*DeleteStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteStorageObjectsRequest) Reset() { *x = DeleteStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteStorageObjectsRequest) String() string { @@ -2771,7 +2668,7 @@ func (*DeleteStorageObjectsRequest) ProtoMessage() {} func (x *DeleteStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2795,27 +2692,24 @@ func (x *DeleteStorageObjectsRequest) GetObjectIds() []*DeleteStorageObjectId { // Represents an event to be passed through the server to registered event handlers. type Event struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // An event name, type, category, or identifier. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Arbitrary event property values. - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // The time when the event was triggered. Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // True if the event came directly from a client call, false otherwise. - External bool `protobuf:"varint,4,opt,name=external,proto3" json:"external,omitempty"` + External bool `protobuf:"varint,4,opt,name=external,proto3" json:"external,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Event) Reset() { *x = Event{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Event) String() string { @@ -2826,7 +2720,7 @@ func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2871,10 +2765,7 @@ func (x *Event) GetExternal() bool { // A friend of a user. type Friend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user object. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // The friend status. @@ -2882,16 +2773,16 @@ type Friend struct { // Time of the latest relationship update. UpdateTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // Metadata. - Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Friend) Reset() { *x = Friend{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Friend) String() string { @@ -2902,7 +2793,7 @@ func (*Friend) ProtoMessage() {} func (x *Friend) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2947,23 +2838,20 @@ func (x *Friend) GetMetadata() string { // A collection of zero or more friends of the user. type FriendList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Friend objects. Friends []*Friend `protobuf:"bytes,1,rep,name=friends,proto3" json:"friends,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FriendList) Reset() { *x = FriendList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FriendList) String() string { @@ -2974,7 +2862,7 @@ func (*FriendList) ProtoMessage() {} func (x *FriendList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3005,23 +2893,20 @@ func (x *FriendList) GetCursor() string { // A List of friends of friends type FriendsOfFriendsList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User friends of friends. FriendsOfFriends []*FriendsOfFriendsList_FriendOfFriend `protobuf:"bytes,1,rep,name=friends_of_friends,json=friendsOfFriends,proto3" json:"friends_of_friends,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FriendsOfFriendsList) Reset() { *x = FriendsOfFriendsList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FriendsOfFriendsList) String() string { @@ -3032,7 +2917,7 @@ func (*FriendsOfFriendsList) ProtoMessage() {} func (x *FriendsOfFriendsList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3063,25 +2948,22 @@ func (x *FriendsOfFriendsList) GetCursor() string { // Fetch a batch of zero or more users from the server. type GetUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` // The Facebook ID of a user. - FacebookIds []string `protobuf:"bytes,3,rep,name=facebook_ids,json=facebookIds,proto3" json:"facebook_ids,omitempty"` + FacebookIds []string `protobuf:"bytes,3,rep,name=facebook_ids,json=facebookIds,proto3" json:"facebook_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetUsersRequest) Reset() { *x = GetUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetUsersRequest) String() string { @@ -3092,7 +2974,7 @@ func (*GetUsersRequest) ProtoMessage() {} func (x *GetUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3130,21 +3012,18 @@ func (x *GetUsersRequest) GetFacebookIds() []string { // Fetch a subscription by product id. type GetSubscriptionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Product id of the subscription - ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` + ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetSubscriptionRequest) Reset() { *x = GetSubscriptionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetSubscriptionRequest) String() string { @@ -3155,7 +3034,7 @@ func (*GetSubscriptionRequest) ProtoMessage() {} func (x *GetSubscriptionRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3179,10 +3058,7 @@ func (x *GetSubscriptionRequest) GetProductId() string { // A group in the server. type Group struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of a group. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The id of the user who created the group. @@ -3206,16 +3082,16 @@ type Group struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Group) Reset() { *x = Group{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Group) String() string { @@ -3226,7 +3102,7 @@ func (*Group) ProtoMessage() {} func (x *Group) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3327,23 +3203,20 @@ func (x *Group) GetUpdateTime() *timestamppb.Timestamp { // One or more groups returned from a listing operation. type GroupList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // One or more groups. Groups []*Group `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` // A cursor used to get the next page. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupList) Reset() { *x = GroupList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupList) String() string { @@ -3354,7 +3227,7 @@ func (*GroupList) ProtoMessage() {} func (x *GroupList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3385,23 +3258,20 @@ func (x *GroupList) GetCursor() string { // A list of users belonging to a group, along with their role. type GroupUserList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User-role pairs for a group. GroupUsers []*GroupUserList_GroupUser `protobuf:"bytes,1,rep,name=group_users,json=groupUsers,proto3" json:"group_users,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupUserList) Reset() { *x = GroupUserList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupUserList) String() string { @@ -3412,7 +3282,7 @@ func (*GroupUserList) ProtoMessage() {} func (x *GroupUserList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3443,23 +3313,20 @@ func (x *GroupUserList) GetCursor() string { // Import Facebook friends into the current user's account. type ImportFacebookFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Reset the current user's friends list. - Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ImportFacebookFriendsRequest) Reset() { *x = ImportFacebookFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImportFacebookFriendsRequest) String() string { @@ -3470,7 +3337,7 @@ func (*ImportFacebookFriendsRequest) ProtoMessage() {} func (x *ImportFacebookFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3501,23 +3368,20 @@ func (x *ImportFacebookFriendsRequest) GetReset_() *wrapperspb.BoolValue { // Import Facebook friends into the current user's account. type ImportSteamFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Reset the current user's friends list. - Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ImportSteamFriendsRequest) Reset() { *x = ImportSteamFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImportSteamFriendsRequest) String() string { @@ -3528,7 +3392,7 @@ func (*ImportSteamFriendsRequest) ProtoMessage() {} func (x *ImportSteamFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3559,21 +3423,18 @@ func (x *ImportSteamFriendsRequest) GetReset_() *wrapperspb.BoolValue { // Immediately join an open group, or request to join a closed one. type JoinGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to join. The group must already exist. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinGroupRequest) Reset() { *x = JoinGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *JoinGroupRequest) String() string { @@ -3584,7 +3445,7 @@ func (*JoinGroupRequest) ProtoMessage() {} func (x *JoinGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3608,21 +3469,18 @@ func (x *JoinGroupRequest) GetGroupId() string { // The request to join a tournament. type JoinTournamentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to join. The tournament must already exist. - TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinTournamentRequest) Reset() { *x = JoinTournamentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *JoinTournamentRequest) String() string { @@ -3633,7 +3491,7 @@ func (*JoinTournamentRequest) ProtoMessage() {} func (x *JoinTournamentRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3657,23 +3515,20 @@ func (x *JoinTournamentRequest) GetTournamentId() string { // Kick a set of users from a group. type KickGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to kick from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to kick. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *KickGroupUsersRequest) Reset() { *x = KickGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *KickGroupUsersRequest) String() string { @@ -3684,7 +3539,7 @@ func (*KickGroupUsersRequest) ProtoMessage() {} func (x *KickGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3715,10 +3570,7 @@ func (x *KickGroupUsersRequest) GetUserIds() []string { // A leaderboard on the server. type Leaderboard struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // ASC(0) or DESC(1) sort mode of scores in the leaderboard. @@ -3735,15 +3587,15 @@ type Leaderboard struct { CreateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // Whether the leaderboard was created authoritatively or not. Authoritative bool `protobuf:"varint,8,opt,name=authoritative,proto3" json:"authoritative,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Leaderboard) Reset() { *x = Leaderboard{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Leaderboard) String() string { @@ -3754,7 +3606,7 @@ func (*Leaderboard) ProtoMessage() {} func (x *Leaderboard) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3827,23 +3679,20 @@ func (x *Leaderboard) GetAuthoritative() bool { // A list of leaderboards type LeaderboardList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of leaderboards returned. Leaderboards []*Leaderboard `protobuf:"bytes,1,rep,name=leaderboards,proto3" json:"leaderboards,omitempty"` // A pagination cursor (optional). - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardList) Reset() { *x = LeaderboardList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardList) String() string { @@ -3854,7 +3703,7 @@ func (*LeaderboardList) ProtoMessage() {} func (x *LeaderboardList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3885,10 +3734,7 @@ func (x *LeaderboardList) GetCursor() string { // Represents a complete leaderboard record with all scores and associated metadata. type LeaderboardRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard this score belongs to. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // The ID of the score owner, usually a user or group. @@ -3912,16 +3758,16 @@ type LeaderboardRecord struct { // The rank of this record. Rank int64 `protobuf:"varint,11,opt,name=rank,proto3" json:"rank,omitempty"` // The maximum number of score updates allowed by the owner. - MaxNumScore uint32 `protobuf:"varint,12,opt,name=max_num_score,json=maxNumScore,proto3" json:"max_num_score,omitempty"` + MaxNumScore uint32 `protobuf:"varint,12,opt,name=max_num_score,json=maxNumScore,proto3" json:"max_num_score,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardRecord) Reset() { *x = LeaderboardRecord{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardRecord) String() string { @@ -3932,7 +3778,7 @@ func (*LeaderboardRecord) ProtoMessage() {} func (x *LeaderboardRecord) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4033,10 +3879,7 @@ func (x *LeaderboardRecord) GetMaxNumScore() uint32 { // A set of leaderboard records, may be part of a leaderboard records page or a batch of individual records. type LeaderboardRecordList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of leaderboard records. Records []*LeaderboardRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` // A batched set of leaderboard records belonging to specified owners. @@ -4046,16 +3889,16 @@ type LeaderboardRecordList struct { // The cursor to send when retrieving the previous page, if any. PrevCursor string `protobuf:"bytes,4,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // The total number of ranks available. - RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardRecordList) Reset() { *x = LeaderboardRecordList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardRecordList) String() string { @@ -4066,7 +3909,7 @@ func (*LeaderboardRecordList) ProtoMessage() {} func (x *LeaderboardRecordList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4118,21 +3961,18 @@ func (x *LeaderboardRecordList) GetRankCount() int64 { // Leave a group. type LeaveGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to leave. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaveGroupRequest) Reset() { *x = LeaveGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaveGroupRequest) String() string { @@ -4143,7 +3983,7 @@ func (*LeaveGroupRequest) ProtoMessage() {} func (x *LeaveGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4167,23 +4007,20 @@ func (x *LeaveGroupRequest) GetGroupId() string { // Link Facebook to the current user's account. type LinkFacebookRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Import Facebook friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LinkFacebookRequest) Reset() { *x = LinkFacebookRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LinkFacebookRequest) String() string { @@ -4194,7 +4031,7 @@ func (*LinkFacebookRequest) ProtoMessage() {} func (x *LinkFacebookRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4225,23 +4062,20 @@ func (x *LinkFacebookRequest) GetSync() *wrapperspb.BoolValue { // Link Steam to the current user's account. type LinkSteamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Import Steam friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LinkSteamRequest) Reset() { *x = LinkSteamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LinkSteamRequest) String() string { @@ -4252,7 +4086,7 @@ func (*LinkSteamRequest) ProtoMessage() {} func (x *LinkSteamRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4283,10 +4117,7 @@ func (x *LinkSteamRequest) GetSync() *wrapperspb.BoolValue { // List a channel's message history. type ListChannelMessagesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel ID to list from. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4294,16 +4125,16 @@ type ListChannelMessagesRequest struct { // True if listing should be older messages to newer, false if reverse. Forward *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=forward,proto3" json:"forward,omitempty"` // A pagination cursor, if any. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListChannelMessagesRequest) Reset() { *x = ListChannelMessagesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListChannelMessagesRequest) String() string { @@ -4314,7 +4145,7 @@ func (*ListChannelMessagesRequest) ProtoMessage() {} func (x *ListChannelMessagesRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4359,25 +4190,22 @@ func (x *ListChannelMessagesRequest) GetCursor() string { // List friends for a user. type ListFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // The friend state to list. State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListFriendsRequest) Reset() { *x = ListFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListFriendsRequest) String() string { @@ -4388,7 +4216,7 @@ func (*ListFriendsRequest) ProtoMessage() {} func (x *ListFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4425,23 +4253,20 @@ func (x *ListFriendsRequest) GetCursor() string { } type ListFriendsOfFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListFriendsOfFriendsRequest) Reset() { *x = ListFriendsOfFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListFriendsOfFriendsRequest) String() string { @@ -4452,7 +4277,7 @@ func (*ListFriendsOfFriendsRequest) ProtoMessage() {} func (x *ListFriendsOfFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4483,10 +4308,7 @@ func (x *ListFriendsOfFriendsRequest) GetCursor() string { // List groups based on given filters. type ListGroupsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // List groups that contain this value in their names. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Optional pagination cursor. @@ -4498,16 +4320,16 @@ type ListGroupsRequest struct { // Number of group members Members *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=members,proto3" json:"members,omitempty"` // Optional Open/Closed filter. - Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListGroupsRequest) Reset() { *x = ListGroupsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListGroupsRequest) String() string { @@ -4518,7 +4340,7 @@ func (*ListGroupsRequest) ProtoMessage() {} func (x *ListGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4577,10 +4399,7 @@ func (x *ListGroupsRequest) GetOpen() *wrapperspb.BoolValue { // List all users that are part of a group. type ListGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to list from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4588,16 +4407,16 @@ type ListGroupUsersRequest struct { // The group user state to list. State *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListGroupUsersRequest) Reset() { *x = ListGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListGroupUsersRequest) String() string { @@ -4608,7 +4427,7 @@ func (*ListGroupUsersRequest) ProtoMessage() {} func (x *ListGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4653,10 +4472,7 @@ func (x *ListGroupUsersRequest) GetCursor() string { // List leaerboard records from a given leaderboard around the owner. type ListLeaderboardRecordsAroundOwnerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to list for. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4666,16 +4482,16 @@ type ListLeaderboardRecordsAroundOwnerRequest struct { // Expiry in seconds (since epoch) to begin fetching records from. Expiry *wrapperspb.Int64Value `protobuf:"bytes,4,opt,name=expiry,proto3" json:"expiry,omitempty"` // A next or previous page cursor. - Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListLeaderboardRecordsAroundOwnerRequest) Reset() { *x = ListLeaderboardRecordsAroundOwnerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListLeaderboardRecordsAroundOwnerRequest) String() string { @@ -4686,7 +4502,7 @@ func (*ListLeaderboardRecordsAroundOwnerRequest) ProtoMessage() {} func (x *ListLeaderboardRecordsAroundOwnerRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4738,10 +4554,7 @@ func (x *ListLeaderboardRecordsAroundOwnerRequest) GetCursor() string { // List leaderboard records from a given leaderboard. type ListLeaderboardRecordsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard to list for. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // One or more owners to retrieve records for. @@ -4751,16 +4564,16 @@ type ListLeaderboardRecordsRequest struct { // A next or previous page cursor. Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // Expiry in seconds (since epoch) to begin fetching records from. Optional. 0 means from current time. - Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListLeaderboardRecordsRequest) Reset() { *x = ListLeaderboardRecordsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListLeaderboardRecordsRequest) String() string { @@ -4771,7 +4584,7 @@ func (*ListLeaderboardRecordsRequest) ProtoMessage() {} func (x *ListLeaderboardRecordsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4823,10 +4636,7 @@ func (x *ListLeaderboardRecordsRequest) GetExpiry() *wrapperspb.Int64Value { // List realtime matches. type ListMatchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Limit the number of returned matches. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // Authoritative or relayed matches. @@ -4838,16 +4648,16 @@ type ListMatchesRequest struct { // Maximum user count. MaxSize *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` // Arbitrary label query. - Query *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=query,proto3" json:"query,omitempty"` + Query *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=query,proto3" json:"query,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListMatchesRequest) Reset() { *x = ListMatchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMatchesRequest) String() string { @@ -4858,7 +4668,7 @@ func (*ListMatchesRequest) ProtoMessage() {} func (x *ListMatchesRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4917,23 +4727,20 @@ func (x *ListMatchesRequest) GetQuery() *wrapperspb.StringValue { // Get a list of unexpired notifications. type ListNotificationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The number of notifications to get. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // A cursor to page through notifications. May be cached by clients to get from point in time forwards. CacheableCursor string `protobuf:"bytes,2,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` // value from NotificationList.cacheable_cursor. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListNotificationsRequest) Reset() { *x = ListNotificationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListNotificationsRequest) String() string { @@ -4944,7 +4751,7 @@ func (*ListNotificationsRequest) ProtoMessage() {} func (x *ListNotificationsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4975,10 +4782,7 @@ func (x *ListNotificationsRequest) GetCacheableCursor() string { // List publicly readable storage objects in a given collection. type ListStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the user. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // The collection which stores the object. @@ -4986,16 +4790,16 @@ type ListStorageObjectsRequest struct { // The number of storage objects to list. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=limit,proto3" json:"limit,omitempty"` // The cursor to page through results from. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // value from StorageObjectList.cursor. + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // value from StorageObjectList.cursor. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListStorageObjectsRequest) Reset() { *x = ListStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListStorageObjectsRequest) String() string { @@ -5006,7 +4810,7 @@ func (*ListStorageObjectsRequest) ProtoMessage() {} func (x *ListStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5051,23 +4855,20 @@ func (x *ListStorageObjectsRequest) GetCursor() string { // List user subscriptions. type ListSubscriptionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Max number of results per page Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // Cursor to retrieve a page of records from - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListSubscriptionsRequest) Reset() { *x = ListSubscriptionsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListSubscriptionsRequest) String() string { @@ -5078,7 +4879,7 @@ func (*ListSubscriptionsRequest) ProtoMessage() {} func (x *ListSubscriptionsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[67] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5109,10 +4910,7 @@ func (x *ListSubscriptionsRequest) GetCursor() string { // List tournament records from a given tournament around the owner. type ListTournamentRecordsAroundOwnerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to list for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -5122,16 +4920,16 @@ type ListTournamentRecordsAroundOwnerRequest struct { // Expiry in seconds (since epoch) to begin fetching records from. Expiry *wrapperspb.Int64Value `protobuf:"bytes,4,opt,name=expiry,proto3" json:"expiry,omitempty"` // A next or previous page cursor. - Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListTournamentRecordsAroundOwnerRequest) Reset() { *x = ListTournamentRecordsAroundOwnerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTournamentRecordsAroundOwnerRequest) String() string { @@ -5142,7 +4940,7 @@ func (*ListTournamentRecordsAroundOwnerRequest) ProtoMessage() {} func (x *ListTournamentRecordsAroundOwnerRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5194,10 +4992,7 @@ func (x *ListTournamentRecordsAroundOwnerRequest) GetCursor() string { // List tournament records from a given tournament. type ListTournamentRecordsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to list for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // One or more owners to retrieve records for. @@ -5207,16 +5002,16 @@ type ListTournamentRecordsRequest struct { // A next or previous page cursor. Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // Expiry in seconds (since epoch) to begin fetching records from. - Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListTournamentRecordsRequest) Reset() { *x = ListTournamentRecordsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTournamentRecordsRequest) String() string { @@ -5227,7 +5022,7 @@ func (*ListTournamentRecordsRequest) ProtoMessage() {} func (x *ListTournamentRecordsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[69] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5279,10 +5074,7 @@ func (x *ListTournamentRecordsRequest) GetExpiry() *wrapperspb.Int64Value { // List active/upcoming tournaments based on given filters. type ListTournamentsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The start of the categories to include. Defaults to 0. CategoryStart *wrapperspb.UInt32Value `protobuf:"bytes,1,opt,name=category_start,json=categoryStart,proto3" json:"category_start,omitempty"` // The end of the categories to include. Defaults to 128. @@ -5294,16 +5086,16 @@ type ListTournamentsRequest struct { // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=limit,proto3" json:"limit,omitempty"` // A next page cursor for listings (optional). - Cursor string `protobuf:"bytes,8,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,8,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListTournamentsRequest) Reset() { *x = ListTournamentsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTournamentsRequest) String() string { @@ -5314,7 +5106,7 @@ func (*ListTournamentsRequest) ProtoMessage() {} func (x *ListTournamentsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5373,10 +5165,7 @@ func (x *ListTournamentsRequest) GetCursor() string { // List the groups a user is part of, and their relationship to each. type ListUserGroupsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the user. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -5384,16 +5173,16 @@ type ListUserGroupsRequest struct { // The user group state to list. State *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListUserGroupsRequest) Reset() { *x = ListUserGroupsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListUserGroupsRequest) String() string { @@ -5404,7 +5193,7 @@ func (*ListUserGroupsRequest) ProtoMessage() {} func (x *ListUserGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5449,10 +5238,7 @@ func (x *ListUserGroupsRequest) GetCursor() string { // Represents a realtime match. type Match struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the match, can be used to join. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // True if it's an server-managed authoritative match, false otherwise. @@ -5464,16 +5250,16 @@ type Match struct { // Tick Rate TickRate int32 `protobuf:"varint,5,opt,name=tick_rate,json=tickRate,proto3" json:"tick_rate,omitempty"` // Handler name - HandlerName string `protobuf:"bytes,6,opt,name=handler_name,json=handlerName,proto3" json:"handler_name,omitempty"` + HandlerName string `protobuf:"bytes,6,opt,name=handler_name,json=handlerName,proto3" json:"handler_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Match) Reset() { *x = Match{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Match) String() string { @@ -5484,7 +5270,7 @@ func (*Match) ProtoMessage() {} func (x *Match) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5543,21 +5329,18 @@ func (x *Match) GetHandlerName() string { // A list of realtime matches. type MatchList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A number of matches corresponding to a list operation. - Matches []*Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` + Matches []*Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchList) Reset() { *x = MatchList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[73] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchList) String() string { @@ -5568,7 +5351,7 @@ func (*MatchList) ProtoMessage() {} func (x *MatchList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[73] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5592,21 +5375,18 @@ func (x *MatchList) GetMatches() []*Match { // Matchmaker ticket completion stats type MatchmakerCompletionStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + CreateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + CompleteTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=complete_time,json=completeTime,proto3" json:"complete_time,omitempty"` unknownFields protoimpl.UnknownFields - - CreateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - CompleteTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=complete_time,json=completeTime,proto3" json:"complete_time,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MatchmakerCompletionStats) Reset() { *x = MatchmakerCompletionStats{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[74] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerCompletionStats) String() string { @@ -5617,7 +5397,7 @@ func (*MatchmakerCompletionStats) ProtoMessage() {} func (x *MatchmakerCompletionStats) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[74] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5648,22 +5428,19 @@ func (x *MatchmakerCompletionStats) GetCompleteTime() *timestamppb.Timestamp { // Matchmaker stats type MatchmakerStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` TicketCount int32 `protobuf:"varint,1,opt,name=ticket_count,json=ticketCount,proto3" json:"ticket_count,omitempty"` OldestTicketCreateTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=oldest_ticket_create_time,json=oldestTicketCreateTime,proto3" json:"oldest_ticket_create_time,omitempty"` Completions []*MatchmakerCompletionStats `protobuf:"bytes,3,rep,name=completions,proto3" json:"completions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerStats) Reset() { *x = MatchmakerStats{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[75] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerStats) String() string { @@ -5674,7 +5451,7 @@ func (*MatchmakerStats) ProtoMessage() {} func (x *MatchmakerStats) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[75] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5712,10 +5489,7 @@ func (x *MatchmakerStats) GetCompletions() []*MatchmakerCompletionStats { // A notification in the server. type Notification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the Notification. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Subject of the notification. @@ -5729,16 +5503,16 @@ type Notification struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the notification was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // True if this notification was persisted to the database. - Persistent bool `protobuf:"varint,7,opt,name=persistent,proto3" json:"persistent,omitempty"` + Persistent bool `protobuf:"varint,7,opt,name=persistent,proto3" json:"persistent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Notification) Reset() { *x = Notification{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Notification) String() string { @@ -5749,7 +5523,7 @@ func (*Notification) ProtoMessage() {} func (x *Notification) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[76] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5815,23 +5589,20 @@ func (x *Notification) GetPersistent() bool { // A collection of zero or more notifications. type NotificationList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Collection of notifications. Notifications []*Notification `protobuf:"bytes,1,rep,name=notifications,proto3" json:"notifications,omitempty"` // Use this cursor to paginate notifications. Cache this to catch up to new notifications. CacheableCursor string `protobuf:"bytes,2,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NotificationList) Reset() { *x = NotificationList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[77] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *NotificationList) String() string { @@ -5842,7 +5613,7 @@ func (*NotificationList) ProtoMessage() {} func (x *NotificationList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[77] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5873,23 +5644,20 @@ func (x *NotificationList) GetCacheableCursor() string { // Promote a set of users in a group to the next role up. type PromoteGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to promote in. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to promote. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PromoteGroupUsersRequest) Reset() { *x = PromoteGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[78] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PromoteGroupUsersRequest) String() string { @@ -5900,7 +5668,7 @@ func (*PromoteGroupUsersRequest) ProtoMessage() {} func (x *PromoteGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[78] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5931,23 +5699,20 @@ func (x *PromoteGroupUsersRequest) GetUserIds() []string { // Demote a set of users in a group to the next role down. type DemoteGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to demote in. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to demote. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DemoteGroupUsersRequest) Reset() { *x = DemoteGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[79] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DemoteGroupUsersRequest) String() string { @@ -5958,7 +5723,7 @@ func (*DemoteGroupUsersRequest) ProtoMessage() {} func (x *DemoteGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[79] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5989,25 +5754,22 @@ func (x *DemoteGroupUsersRequest) GetUserIds() []string { // Storage objects to get. type ReadStorageObjectId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // The user owner of the object. - UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReadStorageObjectId) Reset() { *x = ReadStorageObjectId{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[80] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReadStorageObjectId) String() string { @@ -6018,7 +5780,7 @@ func (*ReadStorageObjectId) ProtoMessage() {} func (x *ReadStorageObjectId) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[80] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6056,21 +5818,18 @@ func (x *ReadStorageObjectId) GetUserId() string { // Batch get storage objects. type ReadStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Batch of storage objects. - ObjectIds []*ReadStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + ObjectIds []*ReadStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReadStorageObjectsRequest) Reset() { *x = ReadStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[81] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReadStorageObjectsRequest) String() string { @@ -6081,7 +5840,7 @@ func (*ReadStorageObjectsRequest) ProtoMessage() {} func (x *ReadStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[81] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6105,25 +5864,22 @@ func (x *ReadStorageObjectsRequest) GetObjectIds() []*ReadStorageObjectId { // Execute an Lua function on the server. type Rpc struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The identifier of the function. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The payload of the function which must be a JSON object. Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` // The authentication key used when executed as a non-client HTTP request. - HttpKey string `protobuf:"bytes,3,opt,name=http_key,json=httpKey,proto3" json:"http_key,omitempty"` + HttpKey string `protobuf:"bytes,3,opt,name=http_key,json=httpKey,proto3" json:"http_key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Rpc) Reset() { *x = Rpc{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[82] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Rpc) String() string { @@ -6134,7 +5890,7 @@ func (*Rpc) ProtoMessage() {} func (x *Rpc) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[82] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6172,25 +5928,22 @@ func (x *Rpc) GetHttpKey() string { // A user's session used to authenticate messages. type Session struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // True if the corresponding account was just created, false otherwise. Created bool `protobuf:"varint,1,opt,name=created,proto3" json:"created,omitempty"` // Authentication credentials. Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` // Refresh token that can be used for session token renewal. - RefreshToken string `protobuf:"bytes,3,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + RefreshToken string `protobuf:"bytes,3,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Session) Reset() { *x = Session{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[83] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Session) String() string { @@ -6201,7 +5954,7 @@ func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[83] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6239,10 +5992,7 @@ func (x *Session) GetRefreshToken() string { // An object within the storage engine. type StorageObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. @@ -6260,16 +6010,16 @@ type StorageObject struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObject) Reset() { *x = StorageObject{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[84] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObject) String() string { @@ -6280,7 +6030,7 @@ func (*StorageObject) ProtoMessage() {} func (x *StorageObject) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[84] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6360,10 +6110,7 @@ func (x *StorageObject) GetUpdateTime() *timestamppb.Timestamp { // A storage acknowledgement. type StorageObjectAck struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. @@ -6375,16 +6122,16 @@ type StorageObjectAck struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjectAck) Reset() { *x = StorageObjectAck{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[85] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[85] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjectAck) String() string { @@ -6395,7 +6142,7 @@ func (*StorageObjectAck) ProtoMessage() {} func (x *StorageObjectAck) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[85] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6454,21 +6201,18 @@ func (x *StorageObjectAck) GetUpdateTime() *timestamppb.Timestamp { // Batch of acknowledgements for the storage object write. type StorageObjectAcks struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Batch of storage write acknowledgements. - Acks []*StorageObjectAck `protobuf:"bytes,1,rep,name=acks,proto3" json:"acks,omitempty"` + Acks []*StorageObjectAck `protobuf:"bytes,1,rep,name=acks,proto3" json:"acks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjectAcks) Reset() { *x = StorageObjectAcks{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[86] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjectAcks) String() string { @@ -6479,7 +6223,7 @@ func (*StorageObjectAcks) ProtoMessage() {} func (x *StorageObjectAcks) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[86] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6503,21 +6247,18 @@ func (x *StorageObjectAcks) GetAcks() []*StorageObjectAck { // Batch of storage objects. type StorageObjects struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The batch of storage objects. - Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjects) Reset() { *x = StorageObjects{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[87] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjects) String() string { @@ -6528,7 +6269,7 @@ func (*StorageObjects) ProtoMessage() {} func (x *StorageObjects) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[87] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6552,23 +6293,20 @@ func (x *StorageObjects) GetObjects() []*StorageObject { // List of storage objects. type StorageObjectList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of storage objects. Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` // The cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjectList) Reset() { *x = StorageObjectList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[88] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjectList) String() string { @@ -6579,7 +6317,7 @@ func (*StorageObjectList) ProtoMessage() {} func (x *StorageObjectList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[88] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6610,10 +6348,7 @@ func (x *StorageObjectList) GetCursor() string { // A tournament on the server. type Tournament struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The title for the tournament. @@ -6654,15 +6389,15 @@ type Tournament struct { Operator Operator `protobuf:"varint,19,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` // Whether the leaderboard was created authoritatively or not. Authoritative bool `protobuf:"varint,20,opt,name=authoritative,proto3" json:"authoritative,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Tournament) Reset() { *x = Tournament{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[89] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Tournament) String() string { @@ -6673,7 +6408,7 @@ func (*Tournament) ProtoMessage() {} func (x *Tournament) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[89] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6830,23 +6565,20 @@ func (x *Tournament) GetAuthoritative() bool { // A list of tournaments. type TournamentList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of tournaments returned. Tournaments []*Tournament `protobuf:"bytes,1,rep,name=tournaments,proto3" json:"tournaments,omitempty"` // A pagination cursor (optional). - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TournamentList) Reset() { *x = TournamentList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[90] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[90] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TournamentList) String() string { @@ -6857,7 +6589,7 @@ func (*TournamentList) ProtoMessage() {} func (x *TournamentList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[90] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6888,10 +6620,7 @@ func (x *TournamentList) GetCursor() string { // A set of tournament records which may be part of a tournament records page or a batch of individual records. type TournamentRecordList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of tournament records. Records []*LeaderboardRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` // A batched set of tournament records belonging to specified owners. @@ -6901,16 +6630,16 @@ type TournamentRecordList struct { // The cursor to send when retrieving the previous page (optional). PrevCursor string `protobuf:"bytes,4,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // The total number of ranks available. - RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TournamentRecordList) Reset() { *x = TournamentRecordList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[91] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[91] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TournamentRecordList) String() string { @@ -6921,7 +6650,7 @@ func (*TournamentRecordList) ProtoMessage() {} func (x *TournamentRecordList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[91] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6973,10 +6702,7 @@ func (x *TournamentRecordList) GetRankCount() int64 { // Update a user's account details. type UpdateAccountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The username of the user's account. Username *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // The display name of the user. @@ -6988,16 +6714,16 @@ type UpdateAccountRequest struct { // The location set by the user. Location *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=location,proto3" json:"location,omitempty"` // The timezone set by the user. - Timezone *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=timezone,proto3" json:"timezone,omitempty"` + Timezone *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=timezone,proto3" json:"timezone,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateAccountRequest) Reset() { *x = UpdateAccountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[92] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAccountRequest) String() string { @@ -7008,7 +6734,7 @@ func (*UpdateAccountRequest) ProtoMessage() {} func (x *UpdateAccountRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[92] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7067,10 +6793,7 @@ func (x *UpdateAccountRequest) GetTimezone() *wrapperspb.StringValue { // Update fields in a given group. type UpdateGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the group to update. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // Name. @@ -7082,16 +6805,16 @@ type UpdateGroupRequest struct { // Avatar URL. AvatarUrl *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // Open is true if anyone should be allowed to join, or false if joins must be approved by a group admin. - Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateGroupRequest) Reset() { *x = UpdateGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[93] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateGroupRequest) String() string { @@ -7102,7 +6825,7 @@ func (*UpdateGroupRequest) ProtoMessage() {} func (x *UpdateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[93] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7161,10 +6884,7 @@ func (x *UpdateGroupRequest) GetOpen() *wrapperspb.BoolValue { // A user in the server. type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of the user's account. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The username of the user's account. @@ -7200,16 +6920,16 @@ type User struct { // The Facebook Instant Game ID in the user's account. FacebookInstantGameId string `protobuf:"bytes,17,opt,name=facebook_instant_game_id,json=facebookInstantGameId,proto3" json:"facebook_instant_game_id,omitempty"` // The Apple Sign In ID in the user's account. - AppleId string `protobuf:"bytes,18,opt,name=apple_id,json=appleId,proto3" json:"apple_id,omitempty"` + AppleId string `protobuf:"bytes,18,opt,name=apple_id,json=appleId,proto3" json:"apple_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *User) Reset() { *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[94] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[94] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *User) String() string { @@ -7220,7 +6940,7 @@ func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[94] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7363,23 +7083,20 @@ func (x *User) GetAppleId() string { // A list of groups belonging to a user, along with the user's role in each group. type UserGroupList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Group-role pairs for a user. UserGroups []*UserGroupList_UserGroup `protobuf:"bytes,1,rep,name=user_groups,json=userGroups,proto3" json:"user_groups,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserGroupList) Reset() { *x = UserGroupList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[95] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[95] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserGroupList) String() string { @@ -7390,7 +7107,7 @@ func (*UserGroupList) ProtoMessage() {} func (x *UserGroupList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[95] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7421,21 +7138,18 @@ func (x *UserGroupList) GetCursor() string { // A collection of zero or more users. type Users struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The User objects. - Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Users) Reset() { *x = Users{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[96] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[96] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Users) String() string { @@ -7446,7 +7160,7 @@ func (*Users) ProtoMessage() {} func (x *Users) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[96] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7470,23 +7184,20 @@ func (x *Users) GetUsers() []*User { // Apple IAP Purchases validation request type ValidatePurchaseAppleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Base64 encoded Apple receipt data payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseAppleRequest) Reset() { *x = ValidatePurchaseAppleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[97] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[97] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseAppleRequest) String() string { @@ -7497,7 +7208,7 @@ func (*ValidatePurchaseAppleRequest) ProtoMessage() {} func (x *ValidatePurchaseAppleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[97] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7528,23 +7239,20 @@ func (x *ValidatePurchaseAppleRequest) GetPersist() *wrapperspb.BoolValue { // Apple Subscription validation request type ValidateSubscriptionAppleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Base64 encoded Apple receipt data payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the subscription. - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidateSubscriptionAppleRequest) Reset() { *x = ValidateSubscriptionAppleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[98] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateSubscriptionAppleRequest) String() string { @@ -7555,7 +7263,7 @@ func (*ValidateSubscriptionAppleRequest) ProtoMessage() {} func (x *ValidateSubscriptionAppleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[98] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7586,23 +7294,20 @@ func (x *ValidateSubscriptionAppleRequest) GetPersist() *wrapperspb.BoolValue { // Google IAP Purchase validation request type ValidatePurchaseGoogleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // JSON encoded Google purchase payload. Purchase string `protobuf:"bytes,1,opt,name=purchase,proto3" json:"purchase,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseGoogleRequest) Reset() { *x = ValidatePurchaseGoogleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[99] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[99] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseGoogleRequest) String() string { @@ -7613,7 +7318,7 @@ func (*ValidatePurchaseGoogleRequest) ProtoMessage() {} func (x *ValidatePurchaseGoogleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[99] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7644,23 +7349,20 @@ func (x *ValidatePurchaseGoogleRequest) GetPersist() *wrapperspb.BoolValue { // Google Subscription validation request type ValidateSubscriptionGoogleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // JSON encoded Google purchase payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the subscription. - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidateSubscriptionGoogleRequest) Reset() { *x = ValidateSubscriptionGoogleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[100] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateSubscriptionGoogleRequest) String() string { @@ -7671,7 +7373,7 @@ func (*ValidateSubscriptionGoogleRequest) ProtoMessage() {} func (x *ValidateSubscriptionGoogleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[100] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7702,25 +7404,22 @@ func (x *ValidateSubscriptionGoogleRequest) GetPersist() *wrapperspb.BoolValue { // Huawei IAP Purchase validation request type ValidatePurchaseHuaweiRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // JSON encoded Huawei InAppPurchaseData. Purchase string `protobuf:"bytes,1,opt,name=purchase,proto3" json:"purchase,omitempty"` // InAppPurchaseData signature. Signature string `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseHuaweiRequest) Reset() { *x = ValidatePurchaseHuaweiRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[101] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseHuaweiRequest) String() string { @@ -7731,7 +7430,7 @@ func (*ValidatePurchaseHuaweiRequest) ProtoMessage() {} func (x *ValidatePurchaseHuaweiRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[101] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7769,23 +7468,20 @@ func (x *ValidatePurchaseHuaweiRequest) GetPersist() *wrapperspb.BoolValue { // Facebook Instant IAP Purchase validation request type ValidatePurchaseFacebookInstantRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Base64 encoded Facebook Instant signedRequest receipt data payload. SignedRequest string `protobuf:"bytes,1,opt,name=signed_request,json=signedRequest,proto3" json:"signed_request,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseFacebookInstantRequest) Reset() { *x = ValidatePurchaseFacebookInstantRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[102] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseFacebookInstantRequest) String() string { @@ -7796,7 +7492,7 @@ func (*ValidatePurchaseFacebookInstantRequest) ProtoMessage() {} func (x *ValidatePurchaseFacebookInstantRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[102] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7825,12 +7521,62 @@ func (x *ValidatePurchaseFacebookInstantRequest) GetPersist() *wrapperspb.BoolVa return nil } -// Validated Purchase stored by Nakama. -type ValidatedPurchase struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Xbox Purchase validation request +type ValidatePurchaseXboxRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProductId string `protobuf:"bytes,1,opt,name=productId,proto3" json:"productId,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchaseXboxRequest) Reset() { + *x = ValidatePurchaseXboxRequest{} + mi := &file_api_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseXboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseXboxRequest) ProtoMessage() {} + +func (x *ValidatePurchaseXboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[103] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseXboxRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseXboxRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{103} +} +func (x *ValidatePurchaseXboxRequest) GetProductId() string { + if x != nil { + return x.ProductId + } + return "" +} + +func (x *ValidatePurchaseXboxRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + +// Validated Purchase stored by Nakama. +type ValidatedPurchase struct { + state protoimpl.MessageState `protogen:"open.v1"` // Purchase User ID. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Purchase Product ID. @@ -7852,16 +7598,16 @@ type ValidatedPurchase struct { // Whether the purchase was done in production or sandbox environment. Environment StoreEnvironment `protobuf:"varint,10,opt,name=environment,proto3,enum=nakama.api.StoreEnvironment" json:"environment,omitempty"` // Whether the purchase had already been validated by Nakama before. - SeenBefore bool `protobuf:"varint,11,opt,name=seen_before,json=seenBefore,proto3" json:"seen_before,omitempty"` + SeenBefore bool `protobuf:"varint,11,opt,name=seen_before,json=seenBefore,proto3" json:"seen_before,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatedPurchase) Reset() { *x = ValidatedPurchase{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[103] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[104] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatedPurchase) String() string { @@ -7871,8 +7617,8 @@ func (x *ValidatedPurchase) String() string { func (*ValidatedPurchase) ProtoMessage() {} func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[103] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[104] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7884,7 +7630,7 @@ func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedPurchase.ProtoReflect.Descriptor instead. func (*ValidatedPurchase) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{103} + return file_api_proto_rawDescGZIP(), []int{104} } func (x *ValidatedPurchase) GetUserId() string { @@ -7966,21 +7712,18 @@ func (x *ValidatedPurchase) GetSeenBefore() bool { // Validate IAP response. type ValidatePurchaseResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Newly seen validated purchases. ValidatedPurchases []*ValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseResponse) Reset() { *x = ValidatePurchaseResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[104] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[105] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseResponse) String() string { @@ -7990,8 +7733,8 @@ func (x *ValidatePurchaseResponse) String() string { func (*ValidatePurchaseResponse) ProtoMessage() {} func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[104] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[105] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8003,7 +7746,7 @@ func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseResponse.ProtoReflect.Descriptor instead. func (*ValidatePurchaseResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{104} + return file_api_proto_rawDescGZIP(), []int{105} } func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase { @@ -8015,20 +7758,17 @@ func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase // Validate Subscription response. type ValidateSubscriptionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ValidatedSubscription *ValidatedSubscription `protobuf:"bytes,1,opt,name=validated_subscription,json=validatedSubscription,proto3" json:"validated_subscription,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidateSubscriptionResponse) Reset() { *x = ValidateSubscriptionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[105] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateSubscriptionResponse) String() string { @@ -8038,8 +7778,8 @@ func (x *ValidateSubscriptionResponse) String() string { func (*ValidateSubscriptionResponse) ProtoMessage() {} func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[105] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[106] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8051,7 +7791,7 @@ func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{105} + return file_api_proto_rawDescGZIP(), []int{106} } func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubscription { @@ -8062,10 +7802,7 @@ func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubs } type ValidatedSubscription struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Subscription User ID. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Purchase Product ID. @@ -8091,16 +7828,16 @@ type ValidatedSubscription struct { // Raw provider notification body. ProviderNotification string `protobuf:"bytes,12,opt,name=provider_notification,json=providerNotification,proto3" json:"provider_notification,omitempty"` // Whether the subscription is currently active or not. - Active bool `protobuf:"varint,13,opt,name=active,proto3" json:"active,omitempty"` + Active bool `protobuf:"varint,13,opt,name=active,proto3" json:"active,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatedSubscription) Reset() { *x = ValidatedSubscription{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[106] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatedSubscription) String() string { @@ -8110,8 +7847,8 @@ func (x *ValidatedSubscription) String() string { func (*ValidatedSubscription) ProtoMessage() {} func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[106] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[107] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8123,7 +7860,7 @@ func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedSubscription.ProtoReflect.Descriptor instead. func (*ValidatedSubscription) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{106} + return file_api_proto_rawDescGZIP(), []int{107} } func (x *ValidatedSubscription) GetUserId() string { @@ -8219,25 +7956,22 @@ func (x *ValidatedSubscription) GetActive() bool { // A list of validated purchases stored by Nakama. type PurchaseList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Stored validated purchases. ValidatedPurchases []*ValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` // The cursor to send when retrieving the next page, if any. Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` // The cursor to send when retrieving the previous page, if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PurchaseList) Reset() { *x = PurchaseList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[107] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[108] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PurchaseList) String() string { @@ -8247,8 +7981,8 @@ func (x *PurchaseList) String() string { func (*PurchaseList) ProtoMessage() {} func (x *PurchaseList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[107] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[108] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8260,7 +7994,7 @@ func (x *PurchaseList) ProtoReflect() protoreflect.Message { // Deprecated: Use PurchaseList.ProtoReflect.Descriptor instead. func (*PurchaseList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{107} + return file_api_proto_rawDescGZIP(), []int{108} } func (x *PurchaseList) GetValidatedPurchases() []*ValidatedPurchase { @@ -8286,25 +8020,22 @@ func (x *PurchaseList) GetPrevCursor() string { // A list of validated subscriptions stored by Nakama. type SubscriptionList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Stored validated subscriptions. ValidatedSubscriptions []*ValidatedSubscription `protobuf:"bytes,1,rep,name=validated_subscriptions,json=validatedSubscriptions,proto3" json:"validated_subscriptions,omitempty"` // The cursor to send when retrieving the next page, if any. Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` // The cursor to send when retrieving the previous page, if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[108] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[109] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscriptionList) String() string { @@ -8314,8 +8045,8 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[108] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[109] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8327,7 +8058,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{108} + return file_api_proto_rawDescGZIP(), []int{109} } func (x *SubscriptionList) GetValidatedSubscriptions() []*ValidatedSubscription { @@ -8353,23 +8084,20 @@ func (x *SubscriptionList) GetPrevCursor() string { // A request to submit a score to a leaderboard. type WriteLeaderboardRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard to write to. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // Record input. - Record *WriteLeaderboardRecordRequest_LeaderboardRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + Record *WriteLeaderboardRecordRequest_LeaderboardRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteLeaderboardRecordRequest) Reset() { *x = WriteLeaderboardRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[109] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteLeaderboardRecordRequest) String() string { @@ -8379,8 +8107,8 @@ func (x *WriteLeaderboardRecordRequest) String() string { func (*WriteLeaderboardRecordRequest) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[109] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[110] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8392,7 +8120,7 @@ func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteLeaderboardRecordRequest.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{109} + return file_api_proto_rawDescGZIP(), []int{110} } func (x *WriteLeaderboardRecordRequest) GetLeaderboardId() string { @@ -8411,10 +8139,7 @@ func (x *WriteLeaderboardRecordRequest) GetRecord() *WriteLeaderboardRecordReque // The object to store. type WriteStorageObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection to store the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key for the object within the collection. @@ -8427,15 +8152,15 @@ type WriteStorageObject struct { PermissionRead *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=permission_read,json=permissionRead,proto3" json:"permission_read,omitempty"` // The write access permissions for the object. PermissionWrite *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=permission_write,json=permissionWrite,proto3" json:"permission_write,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteStorageObject) Reset() { *x = WriteStorageObject{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[110] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteStorageObject) String() string { @@ -8445,8 +8170,8 @@ func (x *WriteStorageObject) String() string { func (*WriteStorageObject) ProtoMessage() {} func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[110] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[111] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8458,7 +8183,7 @@ func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObject.ProtoReflect.Descriptor instead. func (*WriteStorageObject) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{110} + return file_api_proto_rawDescGZIP(), []int{111} } func (x *WriteStorageObject) GetCollection() string { @@ -8505,21 +8230,18 @@ func (x *WriteStorageObject) GetPermissionWrite() *wrapperspb.Int32Value { // Write objects to the storage engine. type WriteStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The objects to store on the server. - Objects []*WriteStorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + Objects []*WriteStorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteStorageObjectsRequest) Reset() { *x = WriteStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[111] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteStorageObjectsRequest) String() string { @@ -8529,8 +8251,8 @@ func (x *WriteStorageObjectsRequest) String() string { func (*WriteStorageObjectsRequest) ProtoMessage() {} func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[111] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[112] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8542,7 +8264,7 @@ func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObjectsRequest.ProtoReflect.Descriptor instead. func (*WriteStorageObjectsRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{111} + return file_api_proto_rawDescGZIP(), []int{112} } func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { @@ -8554,23 +8276,20 @@ func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { // A request to submit a score to a tournament. type WriteTournamentRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The tournament ID to write the record for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // Record input. - Record *WriteTournamentRecordRequest_TournamentRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + Record *WriteTournamentRecordRequest_TournamentRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteTournamentRecordRequest) Reset() { *x = WriteTournamentRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[112] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[113] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteTournamentRecordRequest) String() string { @@ -8580,8 +8299,8 @@ func (x *WriteTournamentRecordRequest) String() string { func (*WriteTournamentRecordRequest) ProtoMessage() {} func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[112] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[113] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8593,7 +8312,7 @@ func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteTournamentRecordRequest.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{112} + return file_api_proto_rawDescGZIP(), []int{113} } func (x *WriteTournamentRecordRequest) GetTournamentId() string { @@ -8612,23 +8331,20 @@ func (x *WriteTournamentRecordRequest) GetRecord() *WriteTournamentRecordRequest // A friend of a friend. type FriendsOfFriendsList_FriendOfFriend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user who referred its friend. Referrer string `protobuf:"bytes,1,opt,name=referrer,proto3" json:"referrer,omitempty"` // User. - User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FriendsOfFriendsList_FriendOfFriend) Reset() { *x = FriendsOfFriendsList_FriendOfFriend{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[125] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[126] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FriendsOfFriendsList_FriendOfFriend) String() string { @@ -8638,8 +8354,8 @@ func (x *FriendsOfFriendsList_FriendOfFriend) String() string { func (*FriendsOfFriendsList_FriendOfFriend) ProtoMessage() {} func (x *FriendsOfFriendsList_FriendOfFriend) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[125] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[126] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8670,23 +8386,20 @@ func (x *FriendsOfFriendsList_FriendOfFriend) GetUser() *User { // A single user-role pair. type GroupUserList_GroupUser struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // Their relationship to the group. - State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupUserList_GroupUser) Reset() { *x = GroupUserList_GroupUser{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[126] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[127] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupUserList_GroupUser) String() string { @@ -8696,8 +8409,8 @@ func (x *GroupUserList_GroupUser) String() string { func (*GroupUserList_GroupUser) ProtoMessage() {} func (x *GroupUserList_GroupUser) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[126] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[127] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8728,23 +8441,20 @@ func (x *GroupUserList_GroupUser) GetState() *wrapperspb.Int32Value { // A single group-role pair. type UserGroupList_UserGroup struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Group. Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` // The user's relationship to the group. - State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserGroupList_UserGroup) Reset() { *x = UserGroupList_UserGroup{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[127] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[128] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserGroupList_UserGroup) String() string { @@ -8754,8 +8464,8 @@ func (x *UserGroupList_UserGroup) String() string { func (*UserGroupList_UserGroup) ProtoMessage() {} func (x *UserGroupList_UserGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[127] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[128] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8786,10 +8496,7 @@ func (x *UserGroupList_UserGroup) GetState() *wrapperspb.Int32Value { // Record values to write. type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The score value to submit. Score int64 `protobuf:"varint,1,opt,name=score,proto3" json:"score,omitempty"` // An optional secondary value. @@ -8797,16 +8504,16 @@ type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { // Optional record metadata. Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` // Operator override. - Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Reset() { *x = WriteLeaderboardRecordRequest_LeaderboardRecordWrite{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[128] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[129] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { @@ -8816,8 +8523,8 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[128] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[129] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8829,7 +8536,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() pr // Deprecated: Use WriteLeaderboardRecordRequest_LeaderboardRecordWrite.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{109, 0} + return file_api_proto_rawDescGZIP(), []int{110, 0} } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetScore() int64 { @@ -8862,10 +8569,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetOperator() Ope // Record values to write. type WriteTournamentRecordRequest_TournamentRecordWrite struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The score value to submit. Score int64 `protobuf:"varint,1,opt,name=score,proto3" json:"score,omitempty"` // An optional secondary value. @@ -8873,16 +8577,16 @@ type WriteTournamentRecordRequest_TournamentRecordWrite struct { // A JSON object of additional properties (optional). Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` // Operator override. - Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) Reset() { *x = WriteTournamentRecordRequest_TournamentRecordWrite{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[129] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[130] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { @@ -8892,8 +8596,8 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { func (*WriteTournamentRecordRequest_TournamentRecordWrite) ProtoMessage() {} func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[129] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[130] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8905,7 +8609,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() prot // Deprecated: Use WriteTournamentRecordRequest_TournamentRecordWrite.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest_TournamentRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{112, 0} + return file_api_proto_rawDescGZIP(), []int{113, 0} } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetScore() int64 { @@ -8938,1364 +8642,741 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetOperator() Opera var File_api_proto protoreflect.FileDescriptor -var file_api_proto_rawDesc = []byte{ - 0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x02, 0x0a, 0x07, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x0a, - 0x09, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x99, 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, - 0x70, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, - 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x91, 0x01, 0x0a, 0x0d, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x37, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x91, - 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x37, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xb1, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x39, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x2e, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x1a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, - 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x44, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xc8, 0x02, 0x0a, 0x11, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, - 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, - 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x61, 0x6c, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x24, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x3b, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x97, 0x01, 0x0a, 0x0d, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x74, 0x65, 0x61, 0x6d, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5f, 0x0a, - 0x11, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4c, - 0x0a, 0x14, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xa7, 0x01, 0x0a, - 0x15, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x14, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, - 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, - 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa0, 0x01, - 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x1b, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xba, 0x01, 0x0a, 0x26, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x1d, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, - 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, - 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0xce, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, - 0x73, 0x79, 0x6e, 0x63, 0x22, 0x4c, 0x0a, 0x14, 0x42, 0x61, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x73, 0x22, 0x45, 0x0a, 0x13, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x80, 0x04, 0x0a, 0x0e, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, - 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, 0xb9, 0x01, 0x0a, - 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, - 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x29, 0x0a, - 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xb5, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, - 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, - 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, - 0x70, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x46, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, - 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x1e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, - 0x64, 0x73, 0x22, 0x44, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, - 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x52, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x73, 0x22, 0xf3, - 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x82, 0x02, 0x0a, 0x06, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, - 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x46, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x52, - 0x49, 0x45, 0x4e, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x56, 0x49, 0x54, 0x45, - 0x5f, 0x53, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x56, 0x49, 0x54, - 0x45, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, - 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x03, 0x22, 0x52, 0x0a, 0x0a, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x07, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe1, 0x01, - 0x0a, 0x14, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x12, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x52, 0x10, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x1a, 0x52, 0x0a, - 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x22, 0x64, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x63, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x37, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, - 0x22, 0xa8, 0x03, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, - 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x64, 0x67, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x09, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x96, 0x02, 0x0a, 0x0d, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, - 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x1a, 0xa6, 0x01, 0x0a, 0x09, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, - 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x22, 0x40, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, - 0x55, 0x50, 0x45, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, - 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, - 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, - 0x53, 0x54, 0x10, 0x03, 0x22, 0x87, 0x01, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, - 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x81, - 0x01, 0x0a, 0x19, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x22, 0x2d, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x64, 0x22, 0x3c, 0x0a, 0x15, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, - 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, - 0x4d, 0x0a, 0x15, 0x4b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xab, - 0x02, 0x0a, 0x0b, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, - 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x66, 0x0a, 0x0f, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x3b, 0x0a, 0x0c, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x0c, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe9, 0x03, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x22, 0x0a, 0x0d, - 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x22, 0xf5, 0x01, 0x0a, 0x15, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, - 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, - 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, - 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, - 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2e, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x6e, 0x6b, - 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0x76, 0x0a, 0x10, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, - 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, - 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xbc, - 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x34, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x92, 0x01, - 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x22, 0x68, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xf4, 0x01, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x31, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x35, 0x0a, 0x07, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6f, - 0x70, 0x65, 0x6e, 0x22, 0xb0, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x41, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, - 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, - 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe3, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x31, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x22, 0xe1, 0x02, 0x0a, - 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x08, - 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x69, 0x6e, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x32, 0x0a, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x22, 0x78, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x29, 0x0a, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x19, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x65, 0x0a, 0x18, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x22, 0xea, 0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x41, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x22, 0xe0, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x33, - 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x79, 0x22, 0xdf, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, - 0x0a, 0x0e, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x3f, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, - 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x45, 0x6e, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x37, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xae, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xd0, 0x01, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, - 0x6b, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, - 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, - 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, - 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, - 0xd4, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x69, 0x63, 0x6b, 0x65, - 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x19, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, - 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x16, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x54, 0x69, 0x63, - 0x6b, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, - 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x0c, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x10, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, - 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, - 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x50, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6d, - 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x4f, 0x0a, 0x17, 0x44, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x60, 0x0a, 0x13, 0x52, - 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x5b, 0x0a, - 0x19, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x61, 0x64, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x52, - 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x73, 0x22, 0x4a, 0x0a, 0x03, 0x52, 0x70, - 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x68, - 0x74, 0x74, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, - 0x74, 0x74, 0x70, 0x4b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x12, 0x29, 0x0a, 0x10, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0xf1, 0x01, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x61, 0x63, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x52, 0x04, 0x61, 0x63, 0x6b, 0x73, 0x22, 0x45, 0x0a, 0x0e, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x33, - 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbe, 0x05, 0x0a, 0x0a, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6f, - 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6d, - 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, - 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, - 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, - 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x6e, 0x64, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x30, - 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x62, 0x0a, 0x0e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xf4, 0x01, 0x0a, 0x14, 0x54, - 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x42, 0x0a, 0x0d, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x52, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xfb, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, - 0x72, 0x6c, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x38, 0x0a, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x22, - 0xc7, 0x02, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x3b, 0x0a, 0x0a, - 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, - 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, - 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, - 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, - 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6f, - 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x64, 0x67, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x37, - 0x0a, 0x18, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x74, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x6c, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6c, 0x65, - 0x49, 0x64, 0x22, 0x99, 0x02, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0a, - 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x1a, 0xa9, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x12, 0x27, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x40, 0x0a, 0x05, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x50, 0x45, 0x52, 0x41, 0x44, - 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, - 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x03, 0x22, 0x2f, - 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, - 0x6e, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, - 0x61, 0x73, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, - 0x72, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, - 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x73, 0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x1d, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x48, 0x75, 0x61, 0x77, 0x65, 0x69, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, - 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x85, 0x01, - 0x0a, 0x26, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, - 0x73, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0xa9, 0x04, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, - 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x42, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x22, 0x6a, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, - 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, - 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x72, 0x63, 0x68, - 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x22, 0x78, 0x0a, - 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, - 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x05, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, - 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, - 0x66, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, - 0x75, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x22, 0x97, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, - 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, - 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xa7, 0x01, 0x0a, 0x10, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x5a, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbb, 0x02, 0x0a, 0x1d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x58, - 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x98, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x22, 0x84, 0x02, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0f, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x64, 0x12, 0x46, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x56, 0x0a, 0x1a, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x1c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x56, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x1a, 0x97, 0x01, 0x0a, 0x15, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2a, 0x6f, 0x0a, 0x0d, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x13, 0x0a, 0x0f, 0x41, - 0x50, 0x50, 0x4c, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x00, - 0x12, 0x15, 0x0a, 0x11, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x5f, - 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x55, 0x41, 0x57, 0x45, - 0x49, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x47, 0x41, 0x4c, 0x4c, 0x45, 0x52, 0x59, 0x10, 0x02, 0x12, - 0x1a, 0x0a, 0x16, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x5f, 0x49, 0x4e, 0x53, 0x54, - 0x41, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x3c, 0x0a, 0x10, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x52, 0x4f, - 0x44, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x2a, 0x4c, 0x0a, 0x08, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x4f, 0x56, 0x45, 0x52, - 0x52, 0x49, 0x44, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x45, 0x53, 0x54, 0x10, 0x01, - 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x43, - 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x43, 0x52, - 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x42, 0x63, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x68, - 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x42, 0x09, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x41, 0x70, 0x69, 0x50, - 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, - 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0f, 0x4e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} +const file_api_proto_rawDesc = "" + + "\n" + + "\tapi.proto\x12\n" + + "nakama.api\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xab\x02\n" + + "\aAccount\x12$\n" + + "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x12\x16\n" + + "\x06wallet\x18\x02 \x01(\tR\x06wallet\x12\x14\n" + + "\x05email\x18\x03 \x01(\tR\x05email\x123\n" + + "\adevices\x18\x04 \x03(\v2\x19.nakama.api.AccountDeviceR\adevices\x12\x1b\n" + + "\tcustom_id\x18\x05 \x01(\tR\bcustomId\x12;\n" + + "\vverify_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "verifyTime\x12=\n" + + "\fdisable_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\vdisableTime\"\x99\x01\n" + + "\x0eAccountRefresh\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x128\n" + + "\x04vars\x18\x02 \x03(\v2$.nakama.api.AccountRefresh.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x95\x01\n" + + "\fAccountApple\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x126\n" + + "\x04vars\x18\x02 \x03(\v2\".nakama.api.AccountApple.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x91\x01\n" + + "\rAccountCustom\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x127\n" + + "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountCustom.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x91\x01\n" + + "\rAccountDevice\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x127\n" + + "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountDevice.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb1\x01\n" + + "\fAccountEmail\x12\x14\n" + + "\x05email\x18\x01 \x01(\tR\x05email\x12\x1a\n" + + "\bpassword\x18\x02 \x01(\tR\bpassword\x126\n" + + "\x04vars\x18\x03 \x03(\v2\".nakama.api.AccountEmail.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x9b\x01\n" + + "\x0fAccountFacebook\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x129\n" + + "\x04vars\x18\x02 \x03(\v2%.nakama.api.AccountFacebook.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc9\x01\n" + + "\x1aAccountFacebookInstantGame\x12,\n" + + "\x12signed_player_info\x18\x01 \x01(\tR\x10signedPlayerInfo\x12D\n" + + "\x04vars\x18\x02 \x03(\v20.nakama.api.AccountFacebookInstantGame.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc8\x02\n" + + "\x11AccountGameCenter\x12\x1b\n" + + "\tplayer_id\x18\x01 \x01(\tR\bplayerId\x12\x1b\n" + + "\tbundle_id\x18\x02 \x01(\tR\bbundleId\x12+\n" + + "\x11timestamp_seconds\x18\x03 \x01(\x03R\x10timestampSeconds\x12\x12\n" + + "\x04salt\x18\x04 \x01(\tR\x04salt\x12\x1c\n" + + "\tsignature\x18\x05 \x01(\tR\tsignature\x12$\n" + + "\x0epublic_key_url\x18\x06 \x01(\tR\fpublicKeyUrl\x12;\n" + + "\x04vars\x18\a \x03(\v2'.nakama.api.AccountGameCenter.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x97\x01\n" + + "\rAccountGoogle\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x127\n" + + "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountGoogle.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x95\x01\n" + + "\fAccountSteam\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x126\n" + + "\x04vars\x18\x02 \x03(\v2\".nakama.api.AccountSteam.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"_\n" + + "\x11AddFriendsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\x12\x1a\n" + + "\bmetadata\x18\x03 \x01(\tR\bmetadata\"L\n" + + "\x14AddGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"\xa7\x01\n" + + "\x15SessionRefreshRequest\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x12?\n" + + "\x04vars\x18\x02 \x03(\v2+.nakama.api.SessionRefreshRequest.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"Q\n" + + "\x14SessionLogoutRequest\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x12#\n" + + "\rrefresh_token\x18\x02 \x01(\tR\frefreshToken\"\x9e\x01\n" + + "\x18AuthenticateAppleRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountAppleR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + + "\x19AuthenticateCustomRequest\x123\n" + + "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountCustomR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + + "\x19AuthenticateDeviceRequest\x123\n" + + "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountDeviceR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\x9e\x01\n" + + "\x18AuthenticateEmailRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountEmailR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xd4\x01\n" + + "\x1bAuthenticateFacebookRequest\x125\n" + + "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\x12.\n" + + "\x04sync\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"\xba\x01\n" + + "&AuthenticateFacebookInstantGameRequest\x12@\n" + + "\aaccount\x18\x01 \x01(\v2&.nakama.api.AccountFacebookInstantGameR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa8\x01\n" + + "\x1dAuthenticateGameCenterRequest\x127\n" + + "\aaccount\x18\x01 \x01(\v2\x1d.nakama.api.AccountGameCenterR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + + "\x19AuthenticateGoogleRequest\x123\n" + + "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountGoogleR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xce\x01\n" + + "\x18AuthenticateSteamRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\x12.\n" + + "\x04sync\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"L\n" + + "\x14BanGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"E\n" + + "\x13BlockFriendsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\"\x80\x04\n" + + "\x0eChannelMessage\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\x12/\n" + + "\x04code\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x04code\x12\x1b\n" + + "\tsender_id\x18\x04 \x01(\tR\bsenderId\x12\x1a\n" + + "\busername\x18\x05 \x01(\tR\busername\x12\x18\n" + + "\acontent\x18\x06 \x01(\tR\acontent\x12;\n" + + "\vcreate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12:\n" + + "\n" + + "persistent\x18\t \x01(\v2\x1a.google.protobuf.BoolValueR\n" + + "persistent\x12\x1b\n" + + "\troom_name\x18\n" + + " \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\v \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\f \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\r \x01(\tR\tuserIdTwo\"\xb9\x01\n" + + "\x12ChannelMessageList\x126\n" + + "\bmessages\x18\x01 \x03(\v2\x1a.nakama.api.ChannelMessageR\bmessages\x12\x1f\n" + + "\vnext_cursor\x18\x02 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\x12)\n" + + "\x10cacheable_cursor\x18\x04 \x01(\tR\x0fcacheableCursor\"\xb5\x01\n" + + "\x12CreateGroupRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12 \n" + + "\vdescription\x18\x02 \x01(\tR\vdescription\x12\x19\n" + + "\blang_tag\x18\x03 \x01(\tR\alangTag\x12\x1d\n" + + "\n" + + "avatar_url\x18\x04 \x01(\tR\tavatarUrl\x12\x12\n" + + "\x04open\x18\x05 \x01(\bR\x04open\x12\x1b\n" + + "\tmax_count\x18\x06 \x01(\x05R\bmaxCount\"F\n" + + "\x14DeleteFriendsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\"/\n" + + "\x12DeleteGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\"G\n" + + "\x1eDeleteLeaderboardRecordRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\".\n" + + "\x1aDeleteNotificationsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\"D\n" + + "\x1dDeleteTournamentRecordRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\"c\n" + + "\x15DeleteStorageObjectId\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x18\n" + + "\aversion\x18\x03 \x01(\tR\aversion\"_\n" + + "\x1bDeleteStorageObjectsRequest\x12@\n" + + "\n" + + "object_ids\x18\x01 \x03(\v2!.nakama.api.DeleteStorageObjectIdR\tobjectIds\"\xf3\x01\n" + + "\x05Event\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12A\n" + + "\n" + + "properties\x18\x02 \x03(\v2!.nakama.api.Event.PropertiesEntryR\n" + + "properties\x128\n" + + "\ttimestamp\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12\x1a\n" + + "\bexternal\x18\x04 \x01(\bR\bexternal\x1a=\n" + + "\x0fPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x82\x02\n" + + "\x06Friend\x12$\n" + + "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12;\n" + + "\vupdate_time\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12\x1a\n" + + "\bmetadata\x18\x04 \x01(\tR\bmetadata\"F\n" + + "\x05State\x12\n" + + "\n" + + "\x06FRIEND\x10\x00\x12\x0f\n" + + "\vINVITE_SENT\x10\x01\x12\x13\n" + + "\x0fINVITE_RECEIVED\x10\x02\x12\v\n" + + "\aBLOCKED\x10\x03\"R\n" + + "\n" + + "FriendList\x12,\n" + + "\afriends\x18\x01 \x03(\v2\x12.nakama.api.FriendR\afriends\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xe1\x01\n" + + "\x14FriendsOfFriendsList\x12]\n" + + "\x12friends_of_friends\x18\x01 \x03(\v2/.nakama.api.FriendsOfFriendsList.FriendOfFriendR\x10friendsOfFriends\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1aR\n" + + "\x0eFriendOfFriend\x12\x1a\n" + + "\breferrer\x18\x01 \x01(\tR\breferrer\x12$\n" + + "\x04user\x18\x02 \x01(\v2\x10.nakama.api.UserR\x04user\"d\n" + + "\x0fGetUsersRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\x12!\n" + + "\ffacebook_ids\x18\x03 \x03(\tR\vfacebookIds\"7\n" + + "\x16GetSubscriptionRequest\x12\x1d\n" + + "\n" + + "product_id\x18\x01 \x01(\tR\tproductId\"\xa8\x03\n" + + "\x05Group\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "creator_id\x18\x02 \x01(\tR\tcreatorId\x12\x12\n" + + "\x04name\x18\x03 \x01(\tR\x04name\x12 \n" + + "\vdescription\x18\x04 \x01(\tR\vdescription\x12\x19\n" + + "\blang_tag\x18\x05 \x01(\tR\alangTag\x12\x1a\n" + + "\bmetadata\x18\x06 \x01(\tR\bmetadata\x12\x1d\n" + + "\n" + + "avatar_url\x18\a \x01(\tR\tavatarUrl\x12.\n" + + "\x04open\x18\b \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\x12\x1d\n" + + "\n" + + "edge_count\x18\t \x01(\x05R\tedgeCount\x12\x1b\n" + + "\tmax_count\x18\n" + + " \x01(\x05R\bmaxCount\x12;\n" + + "\vcreate_time\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\"N\n" + + "\tGroupList\x12)\n" + + "\x06groups\x18\x01 \x03(\v2\x11.nakama.api.GroupR\x06groups\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\x96\x02\n" + + "\rGroupUserList\x12D\n" + + "\vgroup_users\x18\x01 \x03(\v2#.nakama.api.GroupUserList.GroupUserR\n" + + "groupUsers\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1a\xa6\x01\n" + + "\tGroupUser\x12$\n" + + "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\"@\n" + + "\x05State\x12\x0e\n" + + "\n" + + "SUPERADMIN\x10\x00\x12\t\n" + + "\x05ADMIN\x10\x01\x12\n" + + "\n" + + "\x06MEMBER\x10\x02\x12\x10\n" + + "\fJOIN_REQUEST\x10\x03\"\x87\x01\n" + + "\x1cImportFacebookFriendsRequest\x125\n" + + "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x120\n" + + "\x05reset\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x05reset\"\x81\x01\n" + + "\x19ImportSteamFriendsRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x120\n" + + "\x05reset\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x05reset\"-\n" + + "\x10JoinGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\"<\n" + + "\x15JoinTournamentRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\"M\n" + + "\x15KickGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"\xab\x02\n" + + "\vLeaderboard\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "sort_order\x18\x02 \x01(\rR\tsortOrder\x120\n" + + "\boperator\x18\x03 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\x12\x1d\n" + + "\n" + + "prev_reset\x18\x04 \x01(\rR\tprevReset\x12\x1d\n" + + "\n" + + "next_reset\x18\x05 \x01(\rR\tnextReset\x12\x1a\n" + + "\bmetadata\x18\x06 \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12$\n" + + "\rauthoritative\x18\b \x01(\bR\rauthoritative\"f\n" + + "\x0fLeaderboardList\x12;\n" + + "\fleaderboards\x18\x01 \x03(\v2\x17.nakama.api.LeaderboardR\fleaderboards\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xe9\x03\n" + + "\x11LeaderboardRecord\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12\x19\n" + + "\bowner_id\x18\x02 \x01(\tR\aownerId\x128\n" + + "\busername\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\busername\x12\x14\n" + + "\x05score\x18\x04 \x01(\x03R\x05score\x12\x1a\n" + + "\bsubscore\x18\x05 \x01(\x03R\bsubscore\x12\x1b\n" + + "\tnum_score\x18\x06 \x01(\x05R\bnumScore\x12\x1a\n" + + "\bmetadata\x18\a \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12;\n" + + "\vexpiry_time\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "expiryTime\x12\x12\n" + + "\x04rank\x18\v \x01(\x03R\x04rank\x12\"\n" + + "\rmax_num_score\x18\f \x01(\rR\vmaxNumScore\"\xf5\x01\n" + + "\x15LeaderboardRecordList\x127\n" + + "\arecords\x18\x01 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\arecords\x12B\n" + + "\rowner_records\x18\x02 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\fownerRecords\x12\x1f\n" + + "\vnext_cursor\x18\x03 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x04 \x01(\tR\n" + + "prevCursor\x12\x1d\n" + + "\n" + + "rank_count\x18\x05 \x01(\x03R\trankCount\".\n" + + "\x11LeaveGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\"|\n" + + "\x13LinkFacebookRequest\x125\n" + + "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x12.\n" + + "\x04sync\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"v\n" + + "\x10LinkSteamRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x12.\n" + + "\x04sync\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"\xbc\x01\n" + + "\x1aListChannelMessagesRequest\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x121\n" + + "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x124\n" + + "\aforward\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\aforward\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\x92\x01\n" + + "\x12ListFriendsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"h\n" + + "\x1bListFriendsOfFriendsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xf4\x01\n" + + "\x11ListGroupsRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x19\n" + + "\blang_tag\x18\x04 \x01(\tR\alangTag\x125\n" + + "\amembers\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\amembers\x12.\n" + + "\x04open\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\"\xb0\x01\n" + + "\x15ListGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x121\n" + + "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + + "\x05state\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\xed\x01\n" + + "(ListLeaderboardRecordsAroundOwnerRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x122\n" + + "\x05limit\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\x05limit\x12\x19\n" + + "\bowner_id\x18\x03 \x01(\tR\aownerId\x123\n" + + "\x06expiry\x18\x04 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\x12\x16\n" + + "\x06cursor\x18\x05 \x01(\tR\x06cursor\"\xe3\x01\n" + + "\x1dListLeaderboardRecordsRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12\x1b\n" + + "\towner_ids\x18\x02 \x03(\tR\bownerIds\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\x123\n" + + "\x06expiry\x18\x05 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\"\xe1\x02\n" + + "\x12ListMatchesRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12@\n" + + "\rauthoritative\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\rauthoritative\x122\n" + + "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x126\n" + + "\bmin_size\x18\x04 \x01(\v2\x1b.google.protobuf.Int32ValueR\aminSize\x126\n" + + "\bmax_size\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\amaxSize\x122\n" + + "\x05query\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\x05query\"x\n" + + "\x18ListNotificationsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12)\n" + + "\x10cacheable_cursor\x18\x02 \x01(\tR\x0fcacheableCursor\"\x9f\x01\n" + + "\x19ListStorageObjectsRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1e\n" + + "\n" + + "collection\x18\x02 \x01(\tR\n" + + "collection\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"e\n" + + "\x18ListSubscriptionsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xea\x01\n" + + "'ListTournamentRecordsAroundOwnerRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x122\n" + + "\x05limit\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\x05limit\x12\x19\n" + + "\bowner_id\x18\x03 \x01(\tR\aownerId\x123\n" + + "\x06expiry\x18\x04 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\x12\x16\n" + + "\x06cursor\x18\x05 \x01(\tR\x06cursor\"\xe0\x01\n" + + "\x1cListTournamentRecordsRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x12\x1b\n" + + "\towner_ids\x18\x02 \x03(\tR\bownerIds\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\x123\n" + + "\x06expiry\x18\x05 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\"\xdf\x02\n" + + "\x16ListTournamentsRequest\x12C\n" + + "\x0ecategory_start\x18\x01 \x01(\v2\x1c.google.protobuf.UInt32ValueR\rcategoryStart\x12?\n" + + "\fcategory_end\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\vcategoryEnd\x12;\n" + + "\n" + + "start_time\x18\x03 \x01(\v2\x1c.google.protobuf.UInt32ValueR\tstartTime\x127\n" + + "\bend_time\x18\x04 \x01(\v2\x1c.google.protobuf.UInt32ValueR\aendTime\x121\n" + + "\x05limit\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\b \x01(\tR\x06cursor\"\xae\x01\n" + + "\x15ListUserGroupsRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x121\n" + + "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + + "\x05state\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\xd0\x01\n" + + "\x05Match\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12$\n" + + "\rauthoritative\x18\x02 \x01(\bR\rauthoritative\x122\n" + + "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x12\x12\n" + + "\x04size\x18\x04 \x01(\x05R\x04size\x12\x1b\n" + + "\ttick_rate\x18\x05 \x01(\x05R\btickRate\x12!\n" + + "\fhandler_name\x18\x06 \x01(\tR\vhandlerName\"8\n" + + "\tMatchList\x12+\n" + + "\amatches\x18\x01 \x03(\v2\x11.nakama.api.MatchR\amatches\"\x99\x01\n" + + "\x19MatchmakerCompletionStats\x12;\n" + + "\vcreate_time\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12?\n" + + "\rcomplete_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\fcompleteTime\"\xd4\x01\n" + + "\x0fMatchmakerStats\x12!\n" + + "\fticket_count\x18\x01 \x01(\x05R\vticketCount\x12U\n" + + "\x19oldest_ticket_create_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x16oldestTicketCreateTime\x12G\n" + + "\vcompletions\x18\x03 \x03(\v2%.nakama.api.MatchmakerCompletionStatsR\vcompletions\"\xe0\x01\n" + + "\fNotification\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x18\n" + + "\asubject\x18\x02 \x01(\tR\asubject\x12\x18\n" + + "\acontent\x18\x03 \x01(\tR\acontent\x12\x12\n" + + "\x04code\x18\x04 \x01(\x05R\x04code\x12\x1b\n" + + "\tsender_id\x18\x05 \x01(\tR\bsenderId\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12\x1e\n" + + "\n" + + "persistent\x18\a \x01(\bR\n" + + "persistent\"}\n" + + "\x10NotificationList\x12>\n" + + "\rnotifications\x18\x01 \x03(\v2\x18.nakama.api.NotificationR\rnotifications\x12)\n" + + "\x10cacheable_cursor\x18\x02 \x01(\tR\x0fcacheableCursor\"P\n" + + "\x18PromoteGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"O\n" + + "\x17DemoteGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"`\n" + + "\x13ReadStorageObjectId\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\"[\n" + + "\x19ReadStorageObjectsRequest\x12>\n" + + "\n" + + "object_ids\x18\x01 \x03(\v2\x1f.nakama.api.ReadStorageObjectIdR\tobjectIds\"J\n" + + "\x03Rpc\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x18\n" + + "\apayload\x18\x02 \x01(\tR\apayload\x12\x19\n" + + "\bhttp_key\x18\x03 \x01(\tR\ahttpKey\"^\n" + + "\aSession\x12\x18\n" + + "\acreated\x18\x01 \x01(\bR\acreated\x12\x14\n" + + "\x05token\x18\x02 \x01(\tR\x05token\x12#\n" + + "\rrefresh_token\x18\x03 \x01(\tR\frefreshToken\"\xd8\x02\n" + + "\rStorageObject\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\x12\x14\n" + + "\x05value\x18\x04 \x01(\tR\x05value\x12\x18\n" + + "\aversion\x18\x05 \x01(\tR\aversion\x12'\n" + + "\x0fpermission_read\x18\x06 \x01(\x05R\x0epermissionRead\x12)\n" + + "\x10permission_write\x18\a \x01(\x05R\x0fpermissionWrite\x12;\n" + + "\vcreate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\"\xf1\x01\n" + + "\x10StorageObjectAck\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x18\n" + + "\aversion\x18\x03 \x01(\tR\aversion\x12\x17\n" + + "\auser_id\x18\x04 \x01(\tR\x06userId\x12;\n" + + "\vcreate_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\"E\n" + + "\x11StorageObjectAcks\x120\n" + + "\x04acks\x18\x01 \x03(\v2\x1c.nakama.api.StorageObjectAckR\x04acks\"E\n" + + "\x0eStorageObjects\x123\n" + + "\aobjects\x18\x01 \x03(\v2\x19.nakama.api.StorageObjectR\aobjects\"`\n" + + "\x11StorageObjectList\x123\n" + + "\aobjects\x18\x01 \x03(\v2\x19.nakama.api.StorageObjectR\aobjects\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xbe\x05\n" + + "\n" + + "Tournament\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + + "\x05title\x18\x02 \x01(\tR\x05title\x12 \n" + + "\vdescription\x18\x03 \x01(\tR\vdescription\x12\x1a\n" + + "\bcategory\x18\x04 \x01(\rR\bcategory\x12\x1d\n" + + "\n" + + "sort_order\x18\x05 \x01(\rR\tsortOrder\x12\x12\n" + + "\x04size\x18\x06 \x01(\rR\x04size\x12\x19\n" + + "\bmax_size\x18\a \x01(\rR\amaxSize\x12\"\n" + + "\rmax_num_score\x18\b \x01(\rR\vmaxNumScore\x12\x1b\n" + + "\tcan_enter\x18\t \x01(\bR\bcanEnter\x12\x1d\n" + + "\n" + + "end_active\x18\n" + + " \x01(\rR\tendActive\x12\x1d\n" + + "\n" + + "next_reset\x18\v \x01(\rR\tnextReset\x12\x1a\n" + + "\bmetadata\x18\f \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x129\n" + + "\n" + + "start_time\x18\x0e \x01(\v2\x1a.google.protobuf.TimestampR\tstartTime\x125\n" + + "\bend_time\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\aendTime\x12\x1a\n" + + "\bduration\x18\x10 \x01(\rR\bduration\x12!\n" + + "\fstart_active\x18\x11 \x01(\rR\vstartActive\x12\x1d\n" + + "\n" + + "prev_reset\x18\x12 \x01(\rR\tprevReset\x120\n" + + "\boperator\x18\x13 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\x12$\n" + + "\rauthoritative\x18\x14 \x01(\bR\rauthoritative\"b\n" + + "\x0eTournamentList\x128\n" + + "\vtournaments\x18\x01 \x03(\v2\x16.nakama.api.TournamentR\vtournaments\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xf4\x01\n" + + "\x14TournamentRecordList\x127\n" + + "\arecords\x18\x01 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\arecords\x12B\n" + + "\rowner_records\x18\x02 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\fownerRecords\x12\x1f\n" + + "\vnext_cursor\x18\x03 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x04 \x01(\tR\n" + + "prevCursor\x12\x1d\n" + + "\n" + + "rank_count\x18\x05 \x01(\x03R\trankCount\"\xfb\x02\n" + + "\x14UpdateAccountRequest\x128\n" + + "\busername\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\busername\x12?\n" + + "\fdisplay_name\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\vdisplayName\x12;\n" + + "\n" + + "avatar_url\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x127\n" + + "\blang_tag\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x128\n" + + "\blocation\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\blocation\x128\n" + + "\btimezone\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\btimezone\"\xc7\x02\n" + + "\x12UpdateGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x120\n" + + "\x04name\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12>\n" + + "\vdescription\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\vdescription\x127\n" + + "\blang_tag\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x12;\n" + + "\n" + + "avatar_url\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x12.\n" + + "\x04open\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\"\xe6\x04\n" + + "\x04User\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1a\n" + + "\busername\x18\x02 \x01(\tR\busername\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x1d\n" + + "\n" + + "avatar_url\x18\x04 \x01(\tR\tavatarUrl\x12\x19\n" + + "\blang_tag\x18\x05 \x01(\tR\alangTag\x12\x1a\n" + + "\blocation\x18\x06 \x01(\tR\blocation\x12\x1a\n" + + "\btimezone\x18\a \x01(\tR\btimezone\x12\x1a\n" + + "\bmetadata\x18\b \x01(\tR\bmetadata\x12\x1f\n" + + "\vfacebook_id\x18\t \x01(\tR\n" + + "facebookId\x12\x1b\n" + + "\tgoogle_id\x18\n" + + " \x01(\tR\bgoogleId\x12#\n" + + "\rgamecenter_id\x18\v \x01(\tR\fgamecenterId\x12\x19\n" + + "\bsteam_id\x18\f \x01(\tR\asteamId\x12\x16\n" + + "\x06online\x18\r \x01(\bR\x06online\x12\x1d\n" + + "\n" + + "edge_count\x18\x0e \x01(\x05R\tedgeCount\x12;\n" + + "\vcreate_time\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\x10 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x127\n" + + "\x18facebook_instant_game_id\x18\x11 \x01(\tR\x15facebookInstantGameId\x12\x19\n" + + "\bapple_id\x18\x12 \x01(\tR\aappleId\"\x99\x02\n" + + "\rUserGroupList\x12D\n" + + "\vuser_groups\x18\x01 \x03(\v2#.nakama.api.UserGroupList.UserGroupR\n" + + "userGroups\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1a\xa9\x01\n" + + "\tUserGroup\x12'\n" + + "\x05group\x18\x01 \x01(\v2\x11.nakama.api.GroupR\x05group\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\"@\n" + + "\x05State\x12\x0e\n" + + "\n" + + "SUPERADMIN\x10\x00\x12\t\n" + + "\x05ADMIN\x10\x01\x12\n" + + "\n" + + "\x06MEMBER\x10\x02\x12\x10\n" + + "\fJOIN_REQUEST\x10\x03\"/\n" + + "\x05Users\x12&\n" + + "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\"n\n" + + "\x1cValidatePurchaseAppleRequest\x12\x18\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"r\n" + + " ValidateSubscriptionAppleRequest\x12\x18\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"q\n" + + "\x1dValidatePurchaseGoogleRequest\x12\x1a\n" + + "\bpurchase\x18\x01 \x01(\tR\bpurchase\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"s\n" + + "!ValidateSubscriptionGoogleRequest\x12\x18\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x8f\x01\n" + + "\x1dValidatePurchaseHuaweiRequest\x12\x1a\n" + + "\bpurchase\x18\x01 \x01(\tR\bpurchase\x12\x1c\n" + + "\tsignature\x18\x02 \x01(\tR\tsignature\x124\n" + + "\apersist\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x85\x01\n" + + "&ValidatePurchaseFacebookInstantRequest\x12%\n" + + "\x0esigned_request\x18\x01 \x01(\tR\rsignedRequest\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"q\n" + + "\x1bValidatePurchaseXboxRequest\x12\x1c\n" + + "\tproductId\x18\x01 \x01(\tR\tproductId\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\xa9\x04\n" + + "\x11ValidatedPurchase\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + + "\n" + + "product_id\x18\x02 \x01(\tR\tproductId\x12%\n" + + "\x0etransaction_id\x18\x03 \x01(\tR\rtransactionId\x12/\n" + + "\x05store\x18\x04 \x01(\x0e2\x19.nakama.api.StoreProviderR\x05store\x12?\n" + + "\rpurchase_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\fpurchaseTime\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12;\n" + + "\vrefund_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "refundTime\x12+\n" + + "\x11provider_response\x18\t \x01(\tR\x10providerResponse\x12>\n" + + "\venvironment\x18\n" + + " \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\x12\x1f\n" + + "\vseen_before\x18\v \x01(\bR\n" + + "seenBefore\"j\n" + + "\x18ValidatePurchaseResponse\x12N\n" + + "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\"x\n" + + "\x1cValidateSubscriptionResponse\x12X\n" + + "\x16validated_subscription\x18\x01 \x01(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\xa7\x05\n" + + "\x15ValidatedSubscription\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + + "\n" + + "product_id\x18\x02 \x01(\tR\tproductId\x126\n" + + "\x17original_transaction_id\x18\x03 \x01(\tR\x15originalTransactionId\x12/\n" + + "\x05store\x18\x04 \x01(\x0e2\x19.nakama.api.StoreProviderR\x05store\x12?\n" + + "\rpurchase_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\fpurchaseTime\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12>\n" + + "\venvironment\x18\b \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\x12;\n" + + "\vexpiry_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "expiryTime\x12;\n" + + "\vrefund_time\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "refundTime\x12+\n" + + "\x11provider_response\x18\v \x01(\tR\x10providerResponse\x123\n" + + "\x15provider_notification\x18\f \x01(\tR\x14providerNotification\x12\x16\n" + + "\x06active\x18\r \x01(\bR\x06active\"\x97\x01\n" + + "\fPurchaseList\x12N\n" + + "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\"\xa7\x01\n" + + "\x10SubscriptionList\x12Z\n" + + "\x17validated_subscriptions\x18\x01 \x03(\v2!.nakama.api.ValidatedSubscriptionR\x16validatedSubscriptions\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\"\xbb\x02\n" + + "\x1dWriteLeaderboardRecordRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12X\n" + + "\x06record\x18\x02 \x01(\v2@.nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWriteR\x06record\x1a\x98\x01\n" + + "\x16LeaderboardRecordWrite\x12\x14\n" + + "\x05score\x18\x01 \x01(\x03R\x05score\x12\x1a\n" + + "\bsubscore\x18\x02 \x01(\x03R\bsubscore\x12\x1a\n" + + "\bmetadata\x18\x03 \x01(\tR\bmetadata\x120\n" + + "\boperator\x18\x04 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\"\x84\x02\n" + + "\x12WriteStorageObject\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x03 \x01(\tR\x05value\x12\x18\n" + + "\aversion\x18\x04 \x01(\tR\aversion\x12D\n" + + "\x0fpermission_read\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\x0epermissionRead\x12F\n" + + "\x10permission_write\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\x0fpermissionWrite\"V\n" + + "\x1aWriteStorageObjectsRequest\x128\n" + + "\aobjects\x18\x01 \x03(\v2\x1e.nakama.api.WriteStorageObjectR\aobjects\"\xb5\x02\n" + + "\x1cWriteTournamentRecordRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x12V\n" + + "\x06record\x18\x02 \x01(\v2>.nakama.api.WriteTournamentRecordRequest.TournamentRecordWriteR\x06record\x1a\x97\x01\n" + + "\x15TournamentRecordWrite\x12\x14\n" + + "\x05score\x18\x01 \x01(\x03R\x05score\x12\x1a\n" + + "\bsubscore\x18\x02 \x01(\x03R\bsubscore\x12\x1a\n" + + "\bmetadata\x18\x03 \x01(\tR\bmetadata\x120\n" + + "\boperator\x18\x04 \x01(\x0e2\x14.nakama.api.OperatorR\boperator*\x7f\n" + + "\rStoreProvider\x12\x13\n" + + "\x0fAPPLE_APP_STORE\x10\x00\x12\x15\n" + + "\x11GOOGLE_PLAY_STORE\x10\x01\x12\x16\n" + + "\x12HUAWEI_APP_GALLERY\x10\x02\x12\x1a\n" + + "\x16FACEBOOK_INSTANT_STORE\x10\x03\x12\x0e\n" + + "\n" + + "XBOX_STORE\x10\x04*<\n" + + "\x10StoreEnvironment\x12\v\n" + + "\aUNKNOWN\x10\x00\x12\v\n" + + "\aSANDBOX\x10\x01\x12\x0e\n" + + "\n" + + "PRODUCTION\x10\x02*L\n" + + "\bOperator\x12\x0f\n" + + "\vNO_OVERRIDE\x10\x00\x12\b\n" + + "\x04BEST\x10\x01\x12\a\n" + + "\x03SET\x10\x02\x12\r\n" + + "\tINCREMENT\x10\x03\x12\r\n" + + "\tDECREMENT\x10\x04Bc\n" + + "\x19com.heroiclabs.nakama.apiB\tNakamaApiP\x01Z'github.com/heroiclabs/nakama-common/api\xaa\x02\x0fNakama.Protobufb\x06proto3" var ( file_api_proto_rawDescOnce sync.Once - file_api_proto_rawDescData = file_api_proto_rawDesc + file_api_proto_rawDescData []byte ) func file_api_proto_rawDescGZIP() []byte { file_api_proto_rawDescOnce.Do(func() { - file_api_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_proto_rawDescData) + file_api_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc))) }) return file_api_proto_rawDescData } var file_api_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 130) -var file_api_proto_goTypes = []interface{}{ +var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 131) +var file_api_proto_goTypes = []any{ (StoreProvider)(0), // 0: nakama.api.StoreProvider (StoreEnvironment)(0), // 1: nakama.api.StoreEnvironment (Operator)(0), // 2: nakama.api.Operator @@ -10405,223 +9486,225 @@ var file_api_proto_goTypes = []interface{}{ (*ValidateSubscriptionGoogleRequest)(nil), // 106: nakama.api.ValidateSubscriptionGoogleRequest (*ValidatePurchaseHuaweiRequest)(nil), // 107: nakama.api.ValidatePurchaseHuaweiRequest (*ValidatePurchaseFacebookInstantRequest)(nil), // 108: nakama.api.ValidatePurchaseFacebookInstantRequest - (*ValidatedPurchase)(nil), // 109: nakama.api.ValidatedPurchase - (*ValidatePurchaseResponse)(nil), // 110: nakama.api.ValidatePurchaseResponse - (*ValidateSubscriptionResponse)(nil), // 111: nakama.api.ValidateSubscriptionResponse - (*ValidatedSubscription)(nil), // 112: nakama.api.ValidatedSubscription - (*PurchaseList)(nil), // 113: nakama.api.PurchaseList - (*SubscriptionList)(nil), // 114: nakama.api.SubscriptionList - (*WriteLeaderboardRecordRequest)(nil), // 115: nakama.api.WriteLeaderboardRecordRequest - (*WriteStorageObject)(nil), // 116: nakama.api.WriteStorageObject - (*WriteStorageObjectsRequest)(nil), // 117: nakama.api.WriteStorageObjectsRequest - (*WriteTournamentRecordRequest)(nil), // 118: nakama.api.WriteTournamentRecordRequest - nil, // 119: nakama.api.AccountRefresh.VarsEntry - nil, // 120: nakama.api.AccountApple.VarsEntry - nil, // 121: nakama.api.AccountCustom.VarsEntry - nil, // 122: nakama.api.AccountDevice.VarsEntry - nil, // 123: nakama.api.AccountEmail.VarsEntry - nil, // 124: nakama.api.AccountFacebook.VarsEntry - nil, // 125: nakama.api.AccountFacebookInstantGame.VarsEntry - nil, // 126: nakama.api.AccountGameCenter.VarsEntry - nil, // 127: nakama.api.AccountGoogle.VarsEntry - nil, // 128: nakama.api.AccountSteam.VarsEntry - nil, // 129: nakama.api.SessionRefreshRequest.VarsEntry - nil, // 130: nakama.api.Event.PropertiesEntry - (*FriendsOfFriendsList_FriendOfFriend)(nil), // 131: nakama.api.FriendsOfFriendsList.FriendOfFriend - (*GroupUserList_GroupUser)(nil), // 132: nakama.api.GroupUserList.GroupUser - (*UserGroupList_UserGroup)(nil), // 133: nakama.api.UserGroupList.UserGroup - (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 134: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 135: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - (*timestamppb.Timestamp)(nil), // 136: google.protobuf.Timestamp - (*wrapperspb.BoolValue)(nil), // 137: google.protobuf.BoolValue - (*wrapperspb.Int32Value)(nil), // 138: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 139: google.protobuf.StringValue - (*wrapperspb.UInt32Value)(nil), // 140: google.protobuf.UInt32Value - (*wrapperspb.Int64Value)(nil), // 141: google.protobuf.Int64Value + (*ValidatePurchaseXboxRequest)(nil), // 109: nakama.api.ValidatePurchaseXboxRequest + (*ValidatedPurchase)(nil), // 110: nakama.api.ValidatedPurchase + (*ValidatePurchaseResponse)(nil), // 111: nakama.api.ValidatePurchaseResponse + (*ValidateSubscriptionResponse)(nil), // 112: nakama.api.ValidateSubscriptionResponse + (*ValidatedSubscription)(nil), // 113: nakama.api.ValidatedSubscription + (*PurchaseList)(nil), // 114: nakama.api.PurchaseList + (*SubscriptionList)(nil), // 115: nakama.api.SubscriptionList + (*WriteLeaderboardRecordRequest)(nil), // 116: nakama.api.WriteLeaderboardRecordRequest + (*WriteStorageObject)(nil), // 117: nakama.api.WriteStorageObject + (*WriteStorageObjectsRequest)(nil), // 118: nakama.api.WriteStorageObjectsRequest + (*WriteTournamentRecordRequest)(nil), // 119: nakama.api.WriteTournamentRecordRequest + nil, // 120: nakama.api.AccountRefresh.VarsEntry + nil, // 121: nakama.api.AccountApple.VarsEntry + nil, // 122: nakama.api.AccountCustom.VarsEntry + nil, // 123: nakama.api.AccountDevice.VarsEntry + nil, // 124: nakama.api.AccountEmail.VarsEntry + nil, // 125: nakama.api.AccountFacebook.VarsEntry + nil, // 126: nakama.api.AccountFacebookInstantGame.VarsEntry + nil, // 127: nakama.api.AccountGameCenter.VarsEntry + nil, // 128: nakama.api.AccountGoogle.VarsEntry + nil, // 129: nakama.api.AccountSteam.VarsEntry + nil, // 130: nakama.api.SessionRefreshRequest.VarsEntry + nil, // 131: nakama.api.Event.PropertiesEntry + (*FriendsOfFriendsList_FriendOfFriend)(nil), // 132: nakama.api.FriendsOfFriendsList.FriendOfFriend + (*GroupUserList_GroupUser)(nil), // 133: nakama.api.GroupUserList.GroupUser + (*UserGroupList_UserGroup)(nil), // 134: nakama.api.UserGroupList.UserGroup + (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 135: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 136: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + (*timestamppb.Timestamp)(nil), // 137: google.protobuf.Timestamp + (*wrapperspb.BoolValue)(nil), // 138: google.protobuf.BoolValue + (*wrapperspb.Int32Value)(nil), // 139: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 140: google.protobuf.StringValue + (*wrapperspb.UInt32Value)(nil), // 141: google.protobuf.UInt32Value + (*wrapperspb.Int64Value)(nil), // 142: google.protobuf.Int64Value } var file_api_proto_depIdxs = []int32{ 100, // 0: nakama.api.Account.user:type_name -> nakama.api.User 10, // 1: nakama.api.Account.devices:type_name -> nakama.api.AccountDevice - 136, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp - 136, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp - 119, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry - 120, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry - 121, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry - 122, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry - 123, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry - 124, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry - 125, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry - 126, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry - 127, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry - 128, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry - 129, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry + 137, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp + 137, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp + 120, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry + 121, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry + 122, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry + 123, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry + 124, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry + 125, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry + 126, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry + 127, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry + 128, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry + 129, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry + 130, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry 8, // 15: nakama.api.AuthenticateAppleRequest.account:type_name -> nakama.api.AccountApple - 137, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue + 138, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue 9, // 17: nakama.api.AuthenticateCustomRequest.account:type_name -> nakama.api.AccountCustom - 137, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue + 138, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue 10, // 19: nakama.api.AuthenticateDeviceRequest.account:type_name -> nakama.api.AccountDevice - 137, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue + 138, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue 11, // 21: nakama.api.AuthenticateEmailRequest.account:type_name -> nakama.api.AccountEmail - 137, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue + 138, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue 12, // 23: nakama.api.AuthenticateFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 137, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue - 137, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 138, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue + 138, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue 13, // 26: nakama.api.AuthenticateFacebookInstantGameRequest.account:type_name -> nakama.api.AccountFacebookInstantGame - 137, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue + 138, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue 14, // 28: nakama.api.AuthenticateGameCenterRequest.account:type_name -> nakama.api.AccountGameCenter - 137, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue + 138, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue 15, // 30: nakama.api.AuthenticateGoogleRequest.account:type_name -> nakama.api.AccountGoogle - 137, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue + 138, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue 16, // 32: nakama.api.AuthenticateSteamRequest.account:type_name -> nakama.api.AccountSteam - 137, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue - 137, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue - 138, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value - 136, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp - 136, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp - 137, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue + 138, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue + 138, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue + 139, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value + 137, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp + 137, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp + 138, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue 32, // 39: nakama.api.ChannelMessageList.messages:type_name -> nakama.api.ChannelMessage 40, // 40: nakama.api.DeleteStorageObjectsRequest.object_ids:type_name -> nakama.api.DeleteStorageObjectId - 130, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry - 136, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp + 131, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry + 137, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp 100, // 43: nakama.api.Friend.user:type_name -> nakama.api.User - 138, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value - 136, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp + 139, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value + 137, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp 43, // 46: nakama.api.FriendList.friends:type_name -> nakama.api.Friend - 131, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend - 137, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue - 136, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp - 136, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp + 132, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend + 138, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue + 137, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp + 137, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp 48, // 51: nakama.api.GroupList.groups:type_name -> nakama.api.Group - 132, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser + 133, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser 12, // 53: nakama.api.ImportFacebookFriendsRequest.account:type_name -> nakama.api.AccountFacebook - 137, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 138, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue 16, // 55: nakama.api.ImportSteamFriendsRequest.account:type_name -> nakama.api.AccountSteam - 137, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 138, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue 2, // 57: nakama.api.Leaderboard.operator:type_name -> nakama.api.Operator - 136, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp + 137, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp 56, // 59: nakama.api.LeaderboardList.leaderboards:type_name -> nakama.api.Leaderboard - 139, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue - 136, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp - 136, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp - 136, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp + 140, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue + 137, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp + 137, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp + 137, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp 58, // 64: nakama.api.LeaderboardRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 65: nakama.api.LeaderboardRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord 12, // 66: nakama.api.LinkFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 137, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 138, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue 16, // 68: nakama.api.LinkSteamRequest.account:type_name -> nakama.api.AccountSteam - 137, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue - 138, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value - 137, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue - 138, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value - 138, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value - 137, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue - 138, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value - 140, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 141, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 138, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 141, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 138, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value - 137, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue - 139, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue - 138, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value - 138, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value - 139, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue - 138, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value - 140, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 141, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 138, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 141, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 140, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value - 140, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value - 140, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value - 140, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value - 138, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value - 139, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue + 138, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue + 139, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue + 139, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value + 139, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value + 138, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue + 139, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value + 141, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 142, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 139, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 142, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 139, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue + 140, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue + 139, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value + 139, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value + 140, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue + 139, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value + 141, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 142, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 139, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 142, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 141, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value + 141, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value + 141, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value + 141, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value + 139, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value + 140, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue 78, // 105: nakama.api.MatchList.matches:type_name -> nakama.api.Match - 136, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp - 136, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp - 136, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp + 137, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp + 137, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp + 137, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp 80, // 109: nakama.api.MatchmakerStats.completions:type_name -> nakama.api.MatchmakerCompletionStats - 136, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp + 137, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp 82, // 111: nakama.api.NotificationList.notifications:type_name -> nakama.api.Notification 86, // 112: nakama.api.ReadStorageObjectsRequest.object_ids:type_name -> nakama.api.ReadStorageObjectId - 136, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp - 136, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp - 136, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp - 136, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp + 137, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp + 137, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp + 137, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp + 137, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp 91, // 117: nakama.api.StorageObjectAcks.acks:type_name -> nakama.api.StorageObjectAck 90, // 118: nakama.api.StorageObjects.objects:type_name -> nakama.api.StorageObject 90, // 119: nakama.api.StorageObjectList.objects:type_name -> nakama.api.StorageObject - 136, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp - 136, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp - 136, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp + 137, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp + 137, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp + 137, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp 2, // 123: nakama.api.Tournament.operator:type_name -> nakama.api.Operator 95, // 124: nakama.api.TournamentList.tournaments:type_name -> nakama.api.Tournament 58, // 125: nakama.api.TournamentRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 126: nakama.api.TournamentRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord - 139, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue - 139, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue - 139, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue - 139, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue - 139, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue - 139, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue - 139, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue - 139, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue - 139, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue - 139, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue - 137, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue - 136, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp - 136, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp - 133, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup + 140, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue + 140, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue + 140, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue + 140, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue + 140, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue + 140, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue + 140, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue + 140, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue + 140, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue + 140, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue + 138, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue + 137, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp + 137, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp + 134, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup 100, // 141: nakama.api.Users.users:type_name -> nakama.api.User - 137, // 142: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 143: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 144: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 145: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 146: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 147: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue - 0, // 148: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider - 136, // 149: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp - 136, // 150: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp - 136, // 151: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp - 136, // 152: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp - 1, // 153: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment - 109, // 154: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 112, // 155: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription - 0, // 156: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider - 136, // 157: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp - 136, // 158: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp - 136, // 159: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp - 1, // 160: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment - 136, // 161: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp - 136, // 162: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp - 109, // 163: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 112, // 164: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription - 134, // 165: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - 138, // 166: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value - 138, // 167: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value - 116, // 168: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject - 135, // 169: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - 100, // 170: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User - 100, // 171: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User - 138, // 172: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value - 48, // 173: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group - 138, // 174: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value - 2, // 175: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator - 2, // 176: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator - 177, // [177:177] is the sub-list for method output_type - 177, // [177:177] is the sub-list for method input_type - 177, // [177:177] is the sub-list for extension type_name - 177, // [177:177] is the sub-list for extension extendee - 0, // [0:177] is the sub-list for field type_name + 138, // 142: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 143: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 144: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 145: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 146: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 147: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 148: nakama.api.ValidatePurchaseXboxRequest.persist:type_name -> google.protobuf.BoolValue + 0, // 149: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider + 137, // 150: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp + 137, // 151: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp + 137, // 152: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp + 137, // 153: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp + 1, // 154: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment + 110, // 155: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 113, // 156: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription + 0, // 157: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider + 137, // 158: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp + 137, // 159: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp + 137, // 160: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp + 1, // 161: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment + 137, // 162: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp + 137, // 163: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp + 110, // 164: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 113, // 165: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription + 135, // 166: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + 139, // 167: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value + 139, // 168: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value + 117, // 169: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject + 136, // 170: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + 100, // 171: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User + 100, // 172: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User + 139, // 173: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value + 48, // 174: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group + 139, // 175: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value + 2, // 176: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator + 2, // 177: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator + 178, // [178:178] is the sub-list for method output_type + 178, // [178:178] is the sub-list for method input_type + 178, // [178:178] is the sub-list for extension type_name + 178, // [178:178] is the sub-list for extension extendee + 0, // [0:178] is the sub-list for field type_name } func init() { file_api_proto_init() } @@ -10629,1431 +9712,13 @@ func file_api_proto_init() { if File_api_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_api_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Account); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountRefresh); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountApple); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountCustom); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountDevice); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountEmail); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountFacebook); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountFacebookInstantGame); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountGameCenter); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountGoogle); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountSteam); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionRefreshRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionLogoutRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateAppleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateCustomRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateDeviceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateEmailRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateFacebookRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateFacebookInstantGameRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateGameCenterRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateGoogleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateSteamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BanGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteLeaderboardRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNotificationsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTournamentRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageObjectId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Friend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendsOfFriendsList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSubscriptionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Group); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupUserList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportFacebookFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportSteamFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinTournamentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KickGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Leaderboard); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardRecord); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardRecordList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaveGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LinkFacebookRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LinkSteamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListChannelMessagesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFriendsOfFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGroupsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLeaderboardRecordsAroundOwnerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLeaderboardRecordsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMatchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNotificationsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSubscriptionsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTournamentRecordsAroundOwnerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTournamentRecordsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTournamentsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListUserGroupsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Match); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerCompletionStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Notification); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NotificationList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PromoteGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DemoteGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadStorageObjectId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Rpc); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjectAck); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjectAcks); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjects); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjectList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Tournament); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TournamentList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TournamentRecordList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAccountRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserGroupList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Users); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseAppleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSubscriptionAppleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseGoogleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSubscriptionGoogleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseHuaweiRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseFacebookInstantRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatedPurchase); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSubscriptionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatedSubscription); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PurchaseList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriptionList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteLeaderboardRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteStorageObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteTournamentRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendsOfFriendsList_FriendOfFriend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupUserList_GroupUser); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserGroupList_UserGroup); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteLeaderboardRecordRequest_LeaderboardRecordWrite); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteTournamentRecordRequest_TournamentRecordWrite); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_api_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc)), NumEnums: 6, - NumMessages: 130, + NumMessages: 131, NumExtensions: 0, NumServices: 0, }, @@ -12063,7 +9728,6 @@ func file_api_proto_init() { MessageInfos: file_api_proto_msgTypes, }.Build() File_api_proto = out.File - file_api_proto_rawDesc = nil file_api_proto_goTypes = nil file_api_proto_depIdxs = nil } diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index f6962a457f..88704a4dc0 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1237,6 +1237,12 @@ message ValidatePurchaseFacebookInstantRequest { google.protobuf.BoolValue persist = 2; } +// Xbox Purchase validation request +message ValidatePurchaseXboxRequest { + string productId = 1; + google.protobuf.BoolValue persist = 2; +} + // Validated Purchase stored by Nakama. message ValidatedPurchase { // Purchase User ID. @@ -1284,6 +1290,8 @@ enum StoreProvider { HUAWEI_APP_GALLERY = 2; // Facebook Instant Store FACEBOOK_INSTANT_STORE = 3; + // Xbox Store + XBOX_STORE = 4; } // Environment where a purchase/subscription took place, diff --git a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go index 974f671730..78425e8ac3 100644 --- a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.29.3 +// protoc-gen-go v1.36.6 +// protoc v4.24.3 // source: realtime.proto package rtapi @@ -31,6 +31,7 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -172,12 +173,9 @@ func (Error_Code) EnumDescriptor() ([]byte, []int) { // An envelope for a realtime message. type Envelope struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` - // Types that are assignable to Message: + state protoimpl.MessageState `protogen:"open.v1"` + Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` + // Types that are valid to be assigned to Message: // // *Envelope_Channel // *Envelope_ChannelJoin @@ -228,16 +226,16 @@ type Envelope struct { // *Envelope_PartyData // *Envelope_PartyDataSend // *Envelope_PartyPresenceEvent - Message isEnvelope_Message `protobuf_oneof:"message"` + Message isEnvelope_Message `protobuf_oneof:"message"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Envelope) Reset() { *x = Envelope{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Envelope) String() string { @@ -248,7 +246,7 @@ func (*Envelope) ProtoMessage() {} func (x *Envelope) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -270,352 +268,450 @@ func (x *Envelope) GetCid() string { return "" } -func (m *Envelope) GetMessage() isEnvelope_Message { - if m != nil { - return m.Message +func (x *Envelope) GetMessage() isEnvelope_Message { + if x != nil { + return x.Message } return nil } func (x *Envelope) GetChannel() *Channel { - if x, ok := x.GetMessage().(*Envelope_Channel); ok { - return x.Channel + if x != nil { + if x, ok := x.Message.(*Envelope_Channel); ok { + return x.Channel + } } return nil } func (x *Envelope) GetChannelJoin() *ChannelJoin { - if x, ok := x.GetMessage().(*Envelope_ChannelJoin); ok { - return x.ChannelJoin + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelJoin); ok { + return x.ChannelJoin + } } return nil } func (x *Envelope) GetChannelLeave() *ChannelLeave { - if x, ok := x.GetMessage().(*Envelope_ChannelLeave); ok { - return x.ChannelLeave + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelLeave); ok { + return x.ChannelLeave + } } return nil } func (x *Envelope) GetChannelMessage() *api.ChannelMessage { - if x, ok := x.GetMessage().(*Envelope_ChannelMessage); ok { - return x.ChannelMessage + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessage); ok { + return x.ChannelMessage + } } return nil } func (x *Envelope) GetChannelMessageAck() *ChannelMessageAck { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageAck); ok { - return x.ChannelMessageAck + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageAck); ok { + return x.ChannelMessageAck + } } return nil } func (x *Envelope) GetChannelMessageSend() *ChannelMessageSend { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageSend); ok { - return x.ChannelMessageSend + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageSend); ok { + return x.ChannelMessageSend + } } return nil } func (x *Envelope) GetChannelMessageUpdate() *ChannelMessageUpdate { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageUpdate); ok { - return x.ChannelMessageUpdate + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageUpdate); ok { + return x.ChannelMessageUpdate + } } return nil } func (x *Envelope) GetChannelMessageRemove() *ChannelMessageRemove { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageRemove); ok { - return x.ChannelMessageRemove + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageRemove); ok { + return x.ChannelMessageRemove + } } return nil } func (x *Envelope) GetChannelPresenceEvent() *ChannelPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_ChannelPresenceEvent); ok { - return x.ChannelPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelPresenceEvent); ok { + return x.ChannelPresenceEvent + } } return nil } func (x *Envelope) GetError() *Error { - if x, ok := x.GetMessage().(*Envelope_Error); ok { - return x.Error + if x != nil { + if x, ok := x.Message.(*Envelope_Error); ok { + return x.Error + } } return nil } func (x *Envelope) GetMatch() *Match { - if x, ok := x.GetMessage().(*Envelope_Match); ok { - return x.Match + if x != nil { + if x, ok := x.Message.(*Envelope_Match); ok { + return x.Match + } } return nil } func (x *Envelope) GetMatchCreate() *MatchCreate { - if x, ok := x.GetMessage().(*Envelope_MatchCreate); ok { - return x.MatchCreate + if x != nil { + if x, ok := x.Message.(*Envelope_MatchCreate); ok { + return x.MatchCreate + } } return nil } func (x *Envelope) GetMatchData() *MatchData { - if x, ok := x.GetMessage().(*Envelope_MatchData); ok { - return x.MatchData + if x != nil { + if x, ok := x.Message.(*Envelope_MatchData); ok { + return x.MatchData + } } return nil } func (x *Envelope) GetMatchDataSend() *MatchDataSend { - if x, ok := x.GetMessage().(*Envelope_MatchDataSend); ok { - return x.MatchDataSend + if x != nil { + if x, ok := x.Message.(*Envelope_MatchDataSend); ok { + return x.MatchDataSend + } } return nil } func (x *Envelope) GetMatchJoin() *MatchJoin { - if x, ok := x.GetMessage().(*Envelope_MatchJoin); ok { - return x.MatchJoin + if x != nil { + if x, ok := x.Message.(*Envelope_MatchJoin); ok { + return x.MatchJoin + } } return nil } func (x *Envelope) GetMatchLeave() *MatchLeave { - if x, ok := x.GetMessage().(*Envelope_MatchLeave); ok { - return x.MatchLeave + if x != nil { + if x, ok := x.Message.(*Envelope_MatchLeave); ok { + return x.MatchLeave + } } return nil } func (x *Envelope) GetMatchPresenceEvent() *MatchPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_MatchPresenceEvent); ok { - return x.MatchPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_MatchPresenceEvent); ok { + return x.MatchPresenceEvent + } } return nil } func (x *Envelope) GetMatchmakerAdd() *MatchmakerAdd { - if x, ok := x.GetMessage().(*Envelope_MatchmakerAdd); ok { - return x.MatchmakerAdd + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerAdd); ok { + return x.MatchmakerAdd + } } return nil } func (x *Envelope) GetMatchmakerMatched() *MatchmakerMatched { - if x, ok := x.GetMessage().(*Envelope_MatchmakerMatched); ok { - return x.MatchmakerMatched + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerMatched); ok { + return x.MatchmakerMatched + } } return nil } func (x *Envelope) GetMatchmakerRemove() *MatchmakerRemove { - if x, ok := x.GetMessage().(*Envelope_MatchmakerRemove); ok { - return x.MatchmakerRemove + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerRemove); ok { + return x.MatchmakerRemove + } } return nil } func (x *Envelope) GetMatchmakerTicket() *MatchmakerTicket { - if x, ok := x.GetMessage().(*Envelope_MatchmakerTicket); ok { - return x.MatchmakerTicket + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerTicket); ok { + return x.MatchmakerTicket + } } return nil } func (x *Envelope) GetNotifications() *Notifications { - if x, ok := x.GetMessage().(*Envelope_Notifications); ok { - return x.Notifications + if x != nil { + if x, ok := x.Message.(*Envelope_Notifications); ok { + return x.Notifications + } } return nil } func (x *Envelope) GetRpc() *api.Rpc { - if x, ok := x.GetMessage().(*Envelope_Rpc); ok { - return x.Rpc + if x != nil { + if x, ok := x.Message.(*Envelope_Rpc); ok { + return x.Rpc + } } return nil } func (x *Envelope) GetStatus() *Status { - if x, ok := x.GetMessage().(*Envelope_Status); ok { - return x.Status + if x != nil { + if x, ok := x.Message.(*Envelope_Status); ok { + return x.Status + } } return nil } func (x *Envelope) GetStatusFollow() *StatusFollow { - if x, ok := x.GetMessage().(*Envelope_StatusFollow); ok { - return x.StatusFollow + if x != nil { + if x, ok := x.Message.(*Envelope_StatusFollow); ok { + return x.StatusFollow + } } return nil } func (x *Envelope) GetStatusPresenceEvent() *StatusPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_StatusPresenceEvent); ok { - return x.StatusPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_StatusPresenceEvent); ok { + return x.StatusPresenceEvent + } } return nil } func (x *Envelope) GetStatusUnfollow() *StatusUnfollow { - if x, ok := x.GetMessage().(*Envelope_StatusUnfollow); ok { - return x.StatusUnfollow + if x != nil { + if x, ok := x.Message.(*Envelope_StatusUnfollow); ok { + return x.StatusUnfollow + } } return nil } func (x *Envelope) GetStatusUpdate() *StatusUpdate { - if x, ok := x.GetMessage().(*Envelope_StatusUpdate); ok { - return x.StatusUpdate + if x != nil { + if x, ok := x.Message.(*Envelope_StatusUpdate); ok { + return x.StatusUpdate + } } return nil } func (x *Envelope) GetStreamData() *StreamData { - if x, ok := x.GetMessage().(*Envelope_StreamData); ok { - return x.StreamData + if x != nil { + if x, ok := x.Message.(*Envelope_StreamData); ok { + return x.StreamData + } } return nil } func (x *Envelope) GetStreamPresenceEvent() *StreamPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_StreamPresenceEvent); ok { - return x.StreamPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_StreamPresenceEvent); ok { + return x.StreamPresenceEvent + } } return nil } func (x *Envelope) GetPing() *Ping { - if x, ok := x.GetMessage().(*Envelope_Ping); ok { - return x.Ping + if x != nil { + if x, ok := x.Message.(*Envelope_Ping); ok { + return x.Ping + } } return nil } func (x *Envelope) GetPong() *Pong { - if x, ok := x.GetMessage().(*Envelope_Pong); ok { - return x.Pong + if x != nil { + if x, ok := x.Message.(*Envelope_Pong); ok { + return x.Pong + } } return nil } func (x *Envelope) GetParty() *Party { - if x, ok := x.GetMessage().(*Envelope_Party); ok { - return x.Party + if x != nil { + if x, ok := x.Message.(*Envelope_Party); ok { + return x.Party + } } return nil } func (x *Envelope) GetPartyCreate() *PartyCreate { - if x, ok := x.GetMessage().(*Envelope_PartyCreate); ok { - return x.PartyCreate + if x != nil { + if x, ok := x.Message.(*Envelope_PartyCreate); ok { + return x.PartyCreate + } } return nil } func (x *Envelope) GetPartyJoin() *PartyJoin { - if x, ok := x.GetMessage().(*Envelope_PartyJoin); ok { - return x.PartyJoin + if x != nil { + if x, ok := x.Message.(*Envelope_PartyJoin); ok { + return x.PartyJoin + } } return nil } func (x *Envelope) GetPartyLeave() *PartyLeave { - if x, ok := x.GetMessage().(*Envelope_PartyLeave); ok { - return x.PartyLeave + if x != nil { + if x, ok := x.Message.(*Envelope_PartyLeave); ok { + return x.PartyLeave + } } return nil } func (x *Envelope) GetPartyPromote() *PartyPromote { - if x, ok := x.GetMessage().(*Envelope_PartyPromote); ok { - return x.PartyPromote + if x != nil { + if x, ok := x.Message.(*Envelope_PartyPromote); ok { + return x.PartyPromote + } } return nil } func (x *Envelope) GetPartyLeader() *PartyLeader { - if x, ok := x.GetMessage().(*Envelope_PartyLeader); ok { - return x.PartyLeader + if x != nil { + if x, ok := x.Message.(*Envelope_PartyLeader); ok { + return x.PartyLeader + } } return nil } func (x *Envelope) GetPartyAccept() *PartyAccept { - if x, ok := x.GetMessage().(*Envelope_PartyAccept); ok { - return x.PartyAccept + if x != nil { + if x, ok := x.Message.(*Envelope_PartyAccept); ok { + return x.PartyAccept + } } return nil } func (x *Envelope) GetPartyRemove() *PartyRemove { - if x, ok := x.GetMessage().(*Envelope_PartyRemove); ok { - return x.PartyRemove + if x != nil { + if x, ok := x.Message.(*Envelope_PartyRemove); ok { + return x.PartyRemove + } } return nil } func (x *Envelope) GetPartyClose() *PartyClose { - if x, ok := x.GetMessage().(*Envelope_PartyClose); ok { - return x.PartyClose + if x != nil { + if x, ok := x.Message.(*Envelope_PartyClose); ok { + return x.PartyClose + } } return nil } func (x *Envelope) GetPartyJoinRequestList() *PartyJoinRequestList { - if x, ok := x.GetMessage().(*Envelope_PartyJoinRequestList); ok { - return x.PartyJoinRequestList + if x != nil { + if x, ok := x.Message.(*Envelope_PartyJoinRequestList); ok { + return x.PartyJoinRequestList + } } return nil } func (x *Envelope) GetPartyJoinRequest() *PartyJoinRequest { - if x, ok := x.GetMessage().(*Envelope_PartyJoinRequest); ok { - return x.PartyJoinRequest + if x != nil { + if x, ok := x.Message.(*Envelope_PartyJoinRequest); ok { + return x.PartyJoinRequest + } } return nil } func (x *Envelope) GetPartyMatchmakerAdd() *PartyMatchmakerAdd { - if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerAdd); ok { - return x.PartyMatchmakerAdd + if x != nil { + if x, ok := x.Message.(*Envelope_PartyMatchmakerAdd); ok { + return x.PartyMatchmakerAdd + } } return nil } func (x *Envelope) GetPartyMatchmakerRemove() *PartyMatchmakerRemove { - if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerRemove); ok { - return x.PartyMatchmakerRemove + if x != nil { + if x, ok := x.Message.(*Envelope_PartyMatchmakerRemove); ok { + return x.PartyMatchmakerRemove + } } return nil } func (x *Envelope) GetPartyMatchmakerTicket() *PartyMatchmakerTicket { - if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerTicket); ok { - return x.PartyMatchmakerTicket + if x != nil { + if x, ok := x.Message.(*Envelope_PartyMatchmakerTicket); ok { + return x.PartyMatchmakerTicket + } } return nil } func (x *Envelope) GetPartyData() *PartyData { - if x, ok := x.GetMessage().(*Envelope_PartyData); ok { - return x.PartyData + if x != nil { + if x, ok := x.Message.(*Envelope_PartyData); ok { + return x.PartyData + } } return nil } func (x *Envelope) GetPartyDataSend() *PartyDataSend { - if x, ok := x.GetMessage().(*Envelope_PartyDataSend); ok { - return x.PartyDataSend + if x != nil { + if x, ok := x.Message.(*Envelope_PartyDataSend); ok { + return x.PartyDataSend + } } return nil } func (x *Envelope) GetPartyPresenceEvent() *PartyPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_PartyPresenceEvent); ok { - return x.PartyPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_PartyPresenceEvent); ok { + return x.PartyPresenceEvent + } } return nil } @@ -969,10 +1065,7 @@ func (*Envelope_PartyPresenceEvent) isEnvelope_Message() {} // A realtime chat channel. type Channel struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the channel. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The users currently in the channel. @@ -986,16 +1079,16 @@ type Channel struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,6,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Channel) Reset() { *x = Channel{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Channel) String() string { @@ -1006,7 +1099,7 @@ func (*Channel) ProtoMessage() {} func (x *Channel) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1072,10 +1165,7 @@ func (x *Channel) GetUserIdTwo() string { // Join operation for a realtime chat channel. type ChannelJoin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user ID to DM with, group ID to chat with, or room channel name to join. Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` // The type of the chat channel. @@ -1083,16 +1173,16 @@ type ChannelJoin struct { // Whether messages sent on this channel should be persistent. Persistence *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persistence,proto3" json:"persistence,omitempty"` // Whether the user should appear in the channel's presence list and events. - Hidden *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=hidden,proto3" json:"hidden,omitempty"` + Hidden *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=hidden,proto3" json:"hidden,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelJoin) Reset() { *x = ChannelJoin{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelJoin) String() string { @@ -1103,7 +1193,7 @@ func (*ChannelJoin) ProtoMessage() {} func (x *ChannelJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1148,21 +1238,18 @@ func (x *ChannelJoin) GetHidden() *wrapperspb.BoolValue { // Leave a realtime channel. type ChannelLeave struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the channel to leave. - ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` + ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelLeave) Reset() { *x = ChannelLeave{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelLeave) String() string { @@ -1173,7 +1260,7 @@ func (*ChannelLeave) ProtoMessage() {} func (x *ChannelLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1197,10 +1284,7 @@ func (x *ChannelLeave) GetChannelId() string { // A receipt reply from a channel message send operation. type ChannelMessageAck struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The unique ID assigned to the message. @@ -1222,16 +1306,16 @@ type ChannelMessageAck struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,10,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,11,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,11,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageAck) Reset() { *x = ChannelMessageAck{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageAck) String() string { @@ -1242,7 +1326,7 @@ func (*ChannelMessageAck) ProtoMessage() {} func (x *ChannelMessageAck) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1336,23 +1420,20 @@ func (x *ChannelMessageAck) GetUserIdTwo() string { // Send a message to a realtime channel. type ChannelMessageSend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel to sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Message content. - Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageSend) Reset() { *x = ChannelMessageSend{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageSend) String() string { @@ -1363,7 +1444,7 @@ func (*ChannelMessageSend) ProtoMessage() {} func (x *ChannelMessageSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1394,25 +1475,22 @@ func (x *ChannelMessageSend) GetContent() string { // Update a message previously sent to a realtime channel. type ChannelMessageUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The ID assigned to the message to update. MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` // New message content. - Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageUpdate) Reset() { *x = ChannelMessageUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageUpdate) String() string { @@ -1423,7 +1501,7 @@ func (*ChannelMessageUpdate) ProtoMessage() {} func (x *ChannelMessageUpdate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1461,23 +1539,20 @@ func (x *ChannelMessageUpdate) GetContent() string { // Remove a message previously sent to a realtime channel. type ChannelMessageRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The ID assigned to the message to update. - MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` + MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageRemove) Reset() { *x = ChannelMessageRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageRemove) String() string { @@ -1488,7 +1563,7 @@ func (*ChannelMessageRemove) ProtoMessage() {} func (x *ChannelMessageRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1519,10 +1594,7 @@ func (x *ChannelMessageRemove) GetMessageId() string { // A set of joins and leaves on a particular channel. type ChannelPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel identifier this event is for. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Presences joining the channel as part of this event, if any. @@ -1536,16 +1608,16 @@ type ChannelPresenceEvent struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,6,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelPresenceEvent) Reset() { *x = ChannelPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelPresenceEvent) String() string { @@ -1556,7 +1628,7 @@ func (*ChannelPresenceEvent) ProtoMessage() {} func (x *ChannelPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1622,25 +1694,22 @@ func (x *ChannelPresenceEvent) GetUserIdTwo() string { // A logical error which may occur on the server. type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The error code which should be one of "Error.Code" enums. Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // A message in English to help developers debug the response. Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` // Additional error details which may be different for each response. - Context map[string]string `protobuf:"bytes,3,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Context map[string]string `protobuf:"bytes,3,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Error) Reset() { *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Error) String() string { @@ -1651,7 +1720,7 @@ func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1689,10 +1758,7 @@ func (x *Error) GetContext() map[string]string { // A realtime match. type Match struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // True if it's an server-managed authoritative match, false otherwise. @@ -1704,16 +1770,16 @@ type Match struct { // The users currently in the match. Presences []*UserPresence `protobuf:"bytes,5,rep,name=presences,proto3" json:"presences,omitempty"` // A reference to the current user's presence in the match. - Self *UserPresence `protobuf:"bytes,6,opt,name=self,proto3" json:"self,omitempty"` + Self *UserPresence `protobuf:"bytes,6,opt,name=self,proto3" json:"self,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Match) Reset() { *x = Match{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Match) String() string { @@ -1724,7 +1790,7 @@ func (*Match) ProtoMessage() {} func (x *Match) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1783,21 +1849,18 @@ func (x *Match) GetSelf() *UserPresence { // Create a new realtime match. type MatchCreate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Optional name to use when creating the match. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchCreate) Reset() { *x = MatchCreate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchCreate) String() string { @@ -1808,7 +1871,7 @@ func (*MatchCreate) ProtoMessage() {} func (x *MatchCreate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1832,10 +1895,7 @@ func (x *MatchCreate) GetName() string { // Realtime match data received from the server. type MatchData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // A reference to the user presence that sent this data, if any. @@ -1845,16 +1905,16 @@ type MatchData struct { // Data payload, if any. Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` // True if this data was delivered reliably, false otherwise. - Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchData) Reset() { *x = MatchData{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchData) String() string { @@ -1865,7 +1925,7 @@ func (*MatchData) ProtoMessage() {} func (x *MatchData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1917,10 +1977,7 @@ func (x *MatchData) GetReliable() bool { // Send realtime match data to the server. type MatchDataSend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // Op code value. @@ -1930,16 +1987,16 @@ type MatchDataSend struct { // List of presences in the match to deliver to, if filtering is required. Otherwise deliver to everyone in the match. Presences []*UserPresence `protobuf:"bytes,4,rep,name=presences,proto3" json:"presences,omitempty"` // True if the data should be sent reliably, false otherwise. - Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchDataSend) Reset() { *x = MatchDataSend{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchDataSend) String() string { @@ -1950,7 +2007,7 @@ func (*MatchDataSend) ProtoMessage() {} func (x *MatchDataSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2002,26 +2059,23 @@ func (x *MatchDataSend) GetReliable() bool { // Join an existing realtime match. type MatchJoin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Id: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Id: // // *MatchJoin_MatchId // *MatchJoin_Token Id isMatchJoin_Id `protobuf_oneof:"id"` // An optional set of key-value metadata pairs to be passed to the match handler, if any. - Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchJoin) Reset() { *x = MatchJoin{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchJoin) String() string { @@ -2032,7 +2086,7 @@ func (*MatchJoin) ProtoMessage() {} func (x *MatchJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2047,23 +2101,27 @@ func (*MatchJoin) Descriptor() ([]byte, []int) { return file_realtime_proto_rawDescGZIP(), []int{14} } -func (m *MatchJoin) GetId() isMatchJoin_Id { - if m != nil { - return m.Id +func (x *MatchJoin) GetId() isMatchJoin_Id { + if x != nil { + return x.Id } return nil } func (x *MatchJoin) GetMatchId() string { - if x, ok := x.GetId().(*MatchJoin_MatchId); ok { - return x.MatchId + if x != nil { + if x, ok := x.Id.(*MatchJoin_MatchId); ok { + return x.MatchId + } } return "" } func (x *MatchJoin) GetToken() string { - if x, ok := x.GetId().(*MatchJoin_Token); ok { - return x.Token + if x != nil { + if x, ok := x.Id.(*MatchJoin_Token); ok { + return x.Token + } } return "" } @@ -2095,21 +2153,18 @@ func (*MatchJoin_Token) isMatchJoin_Id() {} // Leave a realtime match. type MatchLeave struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. - MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` + MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchLeave) Reset() { *x = MatchLeave{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchLeave) String() string { @@ -2120,7 +2175,7 @@ func (*MatchLeave) ProtoMessage() {} func (x *MatchLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2144,25 +2199,22 @@ func (x *MatchLeave) GetMatchId() string { // A set of joins and leaves on a particular realtime match. type MatchPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // User presences that have just joined the match. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // User presences that have just left the match. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchPresenceEvent) Reset() { *x = MatchPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchPresenceEvent) String() string { @@ -2173,7 +2225,7 @@ func (*MatchPresenceEvent) ProtoMessage() {} func (x *MatchPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2211,10 +2263,7 @@ func (x *MatchPresenceEvent) GetLeaves() []*UserPresence { // Start a new matchmaking process. type MatchmakerAdd struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Minimum total user count to match together. MinCount int32 `protobuf:"varint,1,opt,name=min_count,json=minCount,proto3" json:"min_count,omitempty"` // Maximum total user count to match together. @@ -2222,20 +2271,20 @@ type MatchmakerAdd struct { // Filter query used to identify suitable users. Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,4,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StringProperties map[string]string `protobuf:"bytes,4,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,5,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + NumericProperties map[string]float64 `protobuf:"bytes,5,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` // Optional multiple of the count that must be satisfied. CountMultiple *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=count_multiple,json=countMultiple,proto3" json:"count_multiple,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerAdd) Reset() { *x = MatchmakerAdd{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerAdd) String() string { @@ -2246,7 +2295,7 @@ func (*MatchmakerAdd) ProtoMessage() {} func (x *MatchmakerAdd) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2305,15 +2354,12 @@ func (x *MatchmakerAdd) GetCountMultiple() *wrapperspb.Int32Value { // A successful matchmaking result. type MatchmakerMatched struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The matchmaking ticket that has completed. Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` // The match token or match ID to join. // - // Types that are assignable to Id: + // Types that are valid to be assigned to Id: // // *MatchmakerMatched_MatchId // *MatchmakerMatched_Token @@ -2321,16 +2367,16 @@ type MatchmakerMatched struct { // The users that have been matched together, and information about their matchmaking data. Users []*MatchmakerMatched_MatchmakerUser `protobuf:"bytes,4,rep,name=users,proto3" json:"users,omitempty"` // A reference to the current user and their properties. - Self *MatchmakerMatched_MatchmakerUser `protobuf:"bytes,5,opt,name=self,proto3" json:"self,omitempty"` + Self *MatchmakerMatched_MatchmakerUser `protobuf:"bytes,5,opt,name=self,proto3" json:"self,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerMatched) Reset() { *x = MatchmakerMatched{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerMatched) String() string { @@ -2341,7 +2387,7 @@ func (*MatchmakerMatched) ProtoMessage() {} func (x *MatchmakerMatched) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2363,23 +2409,27 @@ func (x *MatchmakerMatched) GetTicket() string { return "" } -func (m *MatchmakerMatched) GetId() isMatchmakerMatched_Id { - if m != nil { - return m.Id +func (x *MatchmakerMatched) GetId() isMatchmakerMatched_Id { + if x != nil { + return x.Id } return nil } func (x *MatchmakerMatched) GetMatchId() string { - if x, ok := x.GetId().(*MatchmakerMatched_MatchId); ok { - return x.MatchId + if x != nil { + if x, ok := x.Id.(*MatchmakerMatched_MatchId); ok { + return x.MatchId + } } return "" } func (x *MatchmakerMatched) GetToken() string { - if x, ok := x.GetId().(*MatchmakerMatched_Token); ok { - return x.Token + if x != nil { + if x, ok := x.Id.(*MatchmakerMatched_Token); ok { + return x.Token + } } return "" } @@ -2418,21 +2468,18 @@ func (*MatchmakerMatched_Token) isMatchmakerMatched_Id() {} // Cancel an existing ongoing matchmaking process. type MatchmakerRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ticket to cancel. - Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerRemove) Reset() { *x = MatchmakerRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerRemove) String() string { @@ -2443,7 +2490,7 @@ func (*MatchmakerRemove) ProtoMessage() {} func (x *MatchmakerRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2467,21 +2514,18 @@ func (x *MatchmakerRemove) GetTicket() string { // A ticket representing a new matchmaking process. type MatchmakerTicket struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ticket that can be used to cancel matchmaking. - Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerTicket) Reset() { *x = MatchmakerTicket{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerTicket) String() string { @@ -2492,7 +2536,7 @@ func (*MatchmakerTicket) ProtoMessage() {} func (x *MatchmakerTicket) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2516,21 +2560,18 @@ func (x *MatchmakerTicket) GetTicket() string { // A collection of zero or more notifications. type Notifications struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Collection of notifications. Notifications []*api.Notification `protobuf:"bytes,1,rep,name=notifications,proto3" json:"notifications,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Notifications) Reset() { *x = Notifications{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Notifications) String() string { @@ -2541,7 +2582,7 @@ func (*Notifications) ProtoMessage() {} func (x *Notifications) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2565,10 +2606,7 @@ func (x *Notifications) GetNotifications() []*api.Notification { // Incoming information about a party. type Party struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Unique party identifier. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Open flag. @@ -2580,16 +2618,16 @@ type Party struct { // Leader. Leader *UserPresence `protobuf:"bytes,5,opt,name=leader,proto3" json:"leader,omitempty"` // All current party members. - Presences []*UserPresence `protobuf:"bytes,6,rep,name=presences,proto3" json:"presences,omitempty"` + Presences []*UserPresence `protobuf:"bytes,6,rep,name=presences,proto3" json:"presences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Party) Reset() { *x = Party{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Party) String() string { @@ -2600,7 +2638,7 @@ func (*Party) ProtoMessage() {} func (x *Party) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2659,23 +2697,20 @@ func (x *Party) GetPresences() []*UserPresence { // Create a party. type PartyCreate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Whether or not the party will require join requests to be approved by the party leader. Open bool `protobuf:"varint,1,opt,name=open,proto3" json:"open,omitempty"` // Maximum number of party members. - MaxSize int32 `protobuf:"varint,2,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` + MaxSize int32 `protobuf:"varint,2,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyCreate) Reset() { *x = PartyCreate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyCreate) String() string { @@ -2686,7 +2721,7 @@ func (*PartyCreate) ProtoMessage() {} func (x *PartyCreate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2717,21 +2752,18 @@ func (x *PartyCreate) GetMaxSize() int32 { // Join a party, or request to join if the party is not open. type PartyJoin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to join. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyJoin) Reset() { *x = PartyJoin{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyJoin) String() string { @@ -2742,7 +2774,7 @@ func (*PartyJoin) ProtoMessage() {} func (x *PartyJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2766,21 +2798,18 @@ func (x *PartyJoin) GetPartyId() string { // Leave a party. type PartyLeave struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to leave. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyLeave) Reset() { *x = PartyLeave{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyLeave) String() string { @@ -2791,7 +2820,7 @@ func (*PartyLeave) ProtoMessage() {} func (x *PartyLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2815,23 +2844,20 @@ func (x *PartyLeave) GetPartyId() string { // Promote a new party leader. type PartyPromote struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to promote a new leader for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence of an existing party member to promote as the new leader. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyPromote) Reset() { *x = PartyPromote{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyPromote) String() string { @@ -2842,7 +2868,7 @@ func (*PartyPromote) ProtoMessage() {} func (x *PartyPromote) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2873,23 +2899,20 @@ func (x *PartyPromote) GetPresence() *UserPresence { // Announcement of a new party leader. type PartyLeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to announce the new leader for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence of the new party leader. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyLeader) Reset() { *x = PartyLeader{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyLeader) String() string { @@ -2900,7 +2923,7 @@ func (*PartyLeader) ProtoMessage() {} func (x *PartyLeader) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2931,23 +2954,20 @@ func (x *PartyLeader) GetPresence() *UserPresence { // Accept a request to join. type PartyAccept struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to accept a join request for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence to accept as a party member. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyAccept) Reset() { *x = PartyAccept{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyAccept) String() string { @@ -2958,7 +2978,7 @@ func (*PartyAccept) ProtoMessage() {} func (x *PartyAccept) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2989,23 +3009,20 @@ func (x *PartyAccept) GetPresence() *UserPresence { // Kick a party member, or decline a request to join. type PartyRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to remove/reject from. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence to remove or reject. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyRemove) Reset() { *x = PartyRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyRemove) String() string { @@ -3016,7 +3033,7 @@ func (*PartyRemove) ProtoMessage() {} func (x *PartyRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3047,21 +3064,18 @@ func (x *PartyRemove) GetPresence() *UserPresence { // End a party, kicking all party members and closing it. type PartyClose struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to close. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyClose) Reset() { *x = PartyClose{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyClose) String() string { @@ -3072,7 +3086,7 @@ func (*PartyClose) ProtoMessage() {} func (x *PartyClose) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3096,21 +3110,18 @@ func (x *PartyClose) GetPartyId() string { // Request a list of pending join requests for a party. type PartyJoinRequestList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to get a list of join requests for. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyJoinRequestList) Reset() { *x = PartyJoinRequestList{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyJoinRequestList) String() string { @@ -3121,7 +3132,7 @@ func (*PartyJoinRequestList) ProtoMessage() {} func (x *PartyJoinRequestList) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3145,23 +3156,20 @@ func (x *PartyJoinRequestList) GetPartyId() string { // Incoming notification for one or more new presences attempting to join the party. type PartyJoinRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID these presences are attempting to join. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Presences attempting to join. - Presences []*UserPresence `protobuf:"bytes,2,rep,name=presences,proto3" json:"presences,omitempty"` + Presences []*UserPresence `protobuf:"bytes,2,rep,name=presences,proto3" json:"presences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyJoinRequest) Reset() { *x = PartyJoinRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyJoinRequest) String() string { @@ -3172,7 +3180,7 @@ func (*PartyJoinRequest) ProtoMessage() {} func (x *PartyJoinRequest) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3203,10 +3211,7 @@ func (x *PartyJoinRequest) GetPresences() []*UserPresence { // Begin matchmaking as a party. type PartyMatchmakerAdd struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Minimum total user count to match together. @@ -3216,20 +3221,20 @@ type PartyMatchmakerAdd struct { // Filter query used to identify suitable users. Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` // Optional multiple of the count that must be satisfied. CountMultiple *wrapperspb.Int32Value `protobuf:"bytes,7,opt,name=count_multiple,json=countMultiple,proto3" json:"count_multiple,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyMatchmakerAdd) Reset() { *x = PartyMatchmakerAdd{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyMatchmakerAdd) String() string { @@ -3240,7 +3245,7 @@ func (*PartyMatchmakerAdd) ProtoMessage() {} func (x *PartyMatchmakerAdd) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3306,23 +3311,20 @@ func (x *PartyMatchmakerAdd) GetCountMultiple() *wrapperspb.Int32Value { // Cancel a party matchmaking process using a ticket. type PartyMatchmakerRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The ticket to cancel. - Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyMatchmakerRemove) Reset() { *x = PartyMatchmakerRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyMatchmakerRemove) String() string { @@ -3333,7 +3335,7 @@ func (*PartyMatchmakerRemove) ProtoMessage() {} func (x *PartyMatchmakerRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3364,23 +3366,20 @@ func (x *PartyMatchmakerRemove) GetTicket() string { // A response from starting a new party matchmaking process. type PartyMatchmakerTicket struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The ticket that can be used to cancel matchmaking. - Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyMatchmakerTicket) Reset() { *x = PartyMatchmakerTicket{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyMatchmakerTicket) String() string { @@ -3391,7 +3390,7 @@ func (*PartyMatchmakerTicket) ProtoMessage() {} func (x *PartyMatchmakerTicket) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3422,10 +3421,7 @@ func (x *PartyMatchmakerTicket) GetTicket() string { // Incoming party data delivered from the server. type PartyData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // A reference to the user presence that sent this data, if any. @@ -3433,16 +3429,16 @@ type PartyData struct { // Op code value. OpCode int64 `protobuf:"varint,3,opt,name=op_code,json=opCode,proto3" json:"op_code,omitempty"` // Data payload, if any. - Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyData) Reset() { *x = PartyData{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyData) String() string { @@ -3453,7 +3449,7 @@ func (*PartyData) ProtoMessage() {} func (x *PartyData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3498,25 +3494,22 @@ func (x *PartyData) GetData() []byte { // Send data to a party. type PartyDataSend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to send to. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Op code value. OpCode int64 `protobuf:"varint,2,opt,name=op_code,json=opCode,proto3" json:"op_code,omitempty"` // Data payload, if any. - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyDataSend) Reset() { *x = PartyDataSend{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyDataSend) String() string { @@ -3527,7 +3520,7 @@ func (*PartyDataSend) ProtoMessage() {} func (x *PartyDataSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3565,25 +3558,22 @@ func (x *PartyDataSend) GetData() []byte { // Presence update for a particular party. type PartyPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // User presences that have just joined the party. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // User presences that have just left the party. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyPresenceEvent) Reset() { *x = PartyPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyPresenceEvent) String() string { @@ -3594,7 +3584,7 @@ func (*PartyPresenceEvent) ProtoMessage() {} func (x *PartyPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3632,18 +3622,16 @@ func (x *PartyPresenceEvent) GetLeaves() []*UserPresence { // Application-level heartbeat and connection check. type Ping struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Ping) Reset() { *x = Ping{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Ping) String() string { @@ -3654,7 +3642,7 @@ func (*Ping) ProtoMessage() {} func (x *Ping) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3671,18 +3659,16 @@ func (*Ping) Descriptor() ([]byte, []int) { // Application-level heartbeat and connection check response. type Pong struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Pong) Reset() { *x = Pong{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Pong) String() string { @@ -3693,7 +3679,7 @@ func (*Pong) ProtoMessage() {} func (x *Pong) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3710,21 +3696,18 @@ func (*Pong) Descriptor() ([]byte, []int) { // A snapshot of statuses for some set of users. type Status struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User statuses. - Presences []*UserPresence `protobuf:"bytes,1,rep,name=presences,proto3" json:"presences,omitempty"` + Presences []*UserPresence `protobuf:"bytes,1,rep,name=presences,proto3" json:"presences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Status) Reset() { *x = Status{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Status) String() string { @@ -3735,7 +3718,7 @@ func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3759,23 +3742,20 @@ func (x *Status) GetPresences() []*UserPresence { // Start receiving status updates for some set of users. type StatusFollow struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User IDs to follow. UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` // Usernames to follow. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusFollow) Reset() { *x = StatusFollow{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusFollow) String() string { @@ -3786,7 +3766,7 @@ func (*StatusFollow) ProtoMessage() {} func (x *StatusFollow) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3817,23 +3797,20 @@ func (x *StatusFollow) GetUsernames() []string { // A batch of status updates for a given user. type StatusPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // New statuses for the user. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // Previous statuses for the user. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusPresenceEvent) Reset() { *x = StatusPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusPresenceEvent) String() string { @@ -3844,7 +3821,7 @@ func (*StatusPresenceEvent) ProtoMessage() {} func (x *StatusPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3875,21 +3852,18 @@ func (x *StatusPresenceEvent) GetLeaves() []*UserPresence { // Stop receiving status updates for some set of users. type StatusUnfollow struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Users to unfollow. - UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusUnfollow) Reset() { *x = StatusUnfollow{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusUnfollow) String() string { @@ -3900,7 +3874,7 @@ func (*StatusUnfollow) ProtoMessage() {} func (x *StatusUnfollow) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3924,21 +3898,18 @@ func (x *StatusUnfollow) GetUserIds() []string { // Set the user's own status. type StatusUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Status string to set, if not present the user will appear offline. - Status *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Status *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusUpdate) Reset() { *x = StatusUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusUpdate) String() string { @@ -3949,7 +3920,7 @@ func (*StatusUpdate) ProtoMessage() {} func (x *StatusUpdate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3973,10 +3944,7 @@ func (x *StatusUpdate) GetStatus() *wrapperspb.StringValue { // Represents identifying information for a stream. type Stream struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Mode identifies the type of stream. Mode int32 `protobuf:"varint,1,opt,name=mode,proto3" json:"mode,omitempty"` // Subject is the primary identifier, if any. @@ -3984,16 +3952,16 @@ type Stream struct { // Subcontext is a secondary identifier, if any. Subcontext string `protobuf:"bytes,3,opt,name=subcontext,proto3" json:"subcontext,omitempty"` // The label is an arbitrary identifying string, if the stream has one. - Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"` + Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Stream) Reset() { *x = Stream{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Stream) String() string { @@ -4004,7 +3972,7 @@ func (*Stream) ProtoMessage() {} func (x *Stream) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4049,10 +4017,7 @@ func (x *Stream) GetLabel() string { // A data message delivered over a stream. type StreamData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The stream this data message relates to. Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` // The sender, if any. @@ -4060,16 +4025,16 @@ type StreamData struct { // Arbitrary contents of the data message. Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // True if this data was delivered reliably, false otherwise. - Reliable bool `protobuf:"varint,4,opt,name=reliable,proto3" json:"reliable,omitempty"` + Reliable bool `protobuf:"varint,4,opt,name=reliable,proto3" json:"reliable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StreamData) Reset() { *x = StreamData{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StreamData) String() string { @@ -4080,7 +4045,7 @@ func (*StreamData) ProtoMessage() {} func (x *StreamData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4125,25 +4090,22 @@ func (x *StreamData) GetReliable() bool { // A set of joins and leaves on a particular stream. type StreamPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The stream this event relates to. Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` // Presences joining the stream as part of this event, if any. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // Presences leaving the stream as part of this event, if any. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StreamPresenceEvent) Reset() { *x = StreamPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StreamPresenceEvent) String() string { @@ -4154,7 +4116,7 @@ func (*StreamPresenceEvent) ProtoMessage() {} func (x *StreamPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4192,10 +4154,7 @@ func (x *StreamPresenceEvent) GetLeaves() []*UserPresence { // A user session associated to a stream, usually through a list operation or a join/leave event. type UserPresence struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user this presence belongs to. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // A unique session ID identifying the particular connection, because the user may have many. @@ -4205,16 +4164,16 @@ type UserPresence struct { // Whether this presence generates persistent data/messages, if applicable for the stream type. Persistence bool `protobuf:"varint,4,opt,name=persistence,proto3" json:"persistence,omitempty"` // A user-set status message for this stream, if applicable. - Status *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + Status *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserPresence) Reset() { *x = UserPresence{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserPresence) String() string { @@ -4225,7 +4184,7 @@ func (*UserPresence) ProtoMessage() {} func (x *UserPresence) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4276,27 +4235,24 @@ func (x *UserPresence) GetStatus() *wrapperspb.StringValue { } type MatchmakerMatched_MatchmakerUser struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User info. Presence *UserPresence `protobuf:"bytes,1,opt,name=presence,proto3" json:"presence,omitempty"` // Party identifier, if this user was matched as a party member. PartyId string `protobuf:"bytes,2,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerMatched_MatchmakerUser) Reset() { *x = MatchmakerMatched_MatchmakerUser{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerMatched_MatchmakerUser) String() string { @@ -4307,7 +4263,7 @@ func (*MatchmakerMatched_MatchmakerUser) ProtoMessage() {} func (x *MatchmakerMatched_MatchmakerUser) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4352,735 +4308,346 @@ func (x *MatchmakerMatched_MatchmakerUser) GetNumericProperties() map[string]flo var File_realtime_proto protoreflect.FileDescriptor -var file_realtime_proto_rawDesc = []byte{ - 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x0f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x0d, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xf4, 0x1b, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x69, 0x64, - 0x12, 0x34, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x41, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x48, - 0x00, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, - 0x45, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x57, 0x0a, 0x14, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x48, - 0x00, 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x14, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, 0x52, 0x14, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x3b, 0x0a, 0x0a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x09, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x3e, 0x0a, 0x0b, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x12, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, - 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x12, 0x50, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, - 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, - 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x48, 0x00, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x03, - 0x72, 0x70, 0x63, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x70, 0x63, 0x48, 0x00, 0x52, 0x03, 0x72, 0x70, - 0x63, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x66, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x5a, 0x0a, 0x15, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x13, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x5f, 0x75, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, - 0x48, 0x00, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x5a, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x20, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, - 0x67, 0x12, 0x2b, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x2e, - 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x41, - 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x23, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, - 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, - 0x6e, 0x48, 0x00, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x3e, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x25, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, - 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x44, - 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, - 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, - 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x3e, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x2a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x5e, 0x0a, - 0x17, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x51, 0x0a, - 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x57, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, - 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x60, 0x0a, 0x17, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x48, 0x00, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x60, 0x0a, 0x17, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, - 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, - 0x63, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, - 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x30, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, - 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0f, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x31, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x65, 0x6e, 0x64, 0x12, 0x57, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x32, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x07, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, - 0x73, 0x65, 0x6c, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, 0xf2, 0x01, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x45, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4f, 0x4d, - 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x45, 0x53, - 0x53, 0x41, 0x47, 0x45, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, - 0x03, 0x22, 0x2d, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, - 0x22, 0xcc, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, - 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, - 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, - 0x4d, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x6e, - 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x54, - 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x22, 0x99, 0x02, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, - 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, - 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, - 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, - 0x22, 0xfc, 0x02, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x11, - 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x4e, 0x52, 0x45, 0x43, 0x4f, 0x47, 0x4e, 0x49, - 0x5a, 0x45, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, - 0x0f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x41, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, - 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, - 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, - 0x1e, 0x0a, 0x1a, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x06, 0x12, - 0x1e, 0x0a, 0x1a, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x22, - 0x80, 0x02, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, - 0x31, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x73, 0x65, - 0x6c, 0x66, 0x22, 0x21, 0x0a, 0x0b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x39, - 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x65, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4a, - 0x6f, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x44, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, - 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x04, 0x0a, 0x02, 0x69, - 0x64, 0x22, 0x27, 0x0a, 0x0a, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, - 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, - 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0xf7, 0x03, 0x0a, 0x0d, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, - 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, - 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x61, 0x0a, 0x11, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x64, 0x0a, - 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xd9, 0x05, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, - 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x12, 0x1b, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x47, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, - 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x45, - 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x04, 0x73, 0x65, 0x6c, 0x66, 0x1a, 0xe0, 0x03, 0x0a, 0x0e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, - 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x74, - 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x48, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, - 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x43, 0x0a, - 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x04, 0x0a, 0x02, 0x69, 0x64, 0x22, 0x2a, - 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x2a, 0x0a, 0x10, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x4f, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf8, 0x01, 0x0a, 0x05, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x73, - 0x65, 0x6c, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x12, 0x35, - 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, - 0x22, 0x26, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x19, 0x0a, - 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0x27, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x22, 0x64, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0b, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x27, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, - 0x31, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x49, 0x64, 0x22, 0x6a, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xa1, - 0x04, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x66, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, - 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x4a, - 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x57, 0x0a, 0x0d, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, - 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, - 0x65, 0x73, 0x22, 0x06, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x22, 0x06, 0x0a, 0x04, 0x50, 0x6f, - 0x6e, 0x67, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, - 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, - 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, - 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x06, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa4, 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xb2, - 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x06, - 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, 0x65, 0x61, - 0x76, 0x65, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x42, 0x6c, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, - 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x74, 0x61, 0x70, 0x69, 0x42, - 0x0e, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x50, - 0x01, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, - 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x72, 0x74, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0f, 0x4e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_realtime_proto_rawDesc = "" + + "\n" + + "\x0erealtime.proto\x12\x0fnakama.realtime\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\rapi/api.proto\"\xf4\x1b\n" + + "\bEnvelope\x12\x10\n" + + "\x03cid\x18\x01 \x01(\tR\x03cid\x124\n" + + "\achannel\x18\x02 \x01(\v2\x18.nakama.realtime.ChannelH\x00R\achannel\x12A\n" + + "\fchannel_join\x18\x03 \x01(\v2\x1c.nakama.realtime.ChannelJoinH\x00R\vchannelJoin\x12D\n" + + "\rchannel_leave\x18\x04 \x01(\v2\x1d.nakama.realtime.ChannelLeaveH\x00R\fchannelLeave\x12E\n" + + "\x0fchannel_message\x18\x05 \x01(\v2\x1a.nakama.api.ChannelMessageH\x00R\x0echannelMessage\x12T\n" + + "\x13channel_message_ack\x18\x06 \x01(\v2\".nakama.realtime.ChannelMessageAckH\x00R\x11channelMessageAck\x12W\n" + + "\x14channel_message_send\x18\a \x01(\v2#.nakama.realtime.ChannelMessageSendH\x00R\x12channelMessageSend\x12]\n" + + "\x16channel_message_update\x18\b \x01(\v2%.nakama.realtime.ChannelMessageUpdateH\x00R\x14channelMessageUpdate\x12]\n" + + "\x16channel_message_remove\x18\t \x01(\v2%.nakama.realtime.ChannelMessageRemoveH\x00R\x14channelMessageRemove\x12]\n" + + "\x16channel_presence_event\x18\n" + + " \x01(\v2%.nakama.realtime.ChannelPresenceEventH\x00R\x14channelPresenceEvent\x12.\n" + + "\x05error\x18\v \x01(\v2\x16.nakama.realtime.ErrorH\x00R\x05error\x12.\n" + + "\x05match\x18\f \x01(\v2\x16.nakama.realtime.MatchH\x00R\x05match\x12A\n" + + "\fmatch_create\x18\r \x01(\v2\x1c.nakama.realtime.MatchCreateH\x00R\vmatchCreate\x12;\n" + + "\n" + + "match_data\x18\x0e \x01(\v2\x1a.nakama.realtime.MatchDataH\x00R\tmatchData\x12H\n" + + "\x0fmatch_data_send\x18\x0f \x01(\v2\x1e.nakama.realtime.MatchDataSendH\x00R\rmatchDataSend\x12;\n" + + "\n" + + "match_join\x18\x10 \x01(\v2\x1a.nakama.realtime.MatchJoinH\x00R\tmatchJoin\x12>\n" + + "\vmatch_leave\x18\x11 \x01(\v2\x1b.nakama.realtime.MatchLeaveH\x00R\n" + + "matchLeave\x12W\n" + + "\x14match_presence_event\x18\x12 \x01(\v2#.nakama.realtime.MatchPresenceEventH\x00R\x12matchPresenceEvent\x12G\n" + + "\x0ematchmaker_add\x18\x13 \x01(\v2\x1e.nakama.realtime.MatchmakerAddH\x00R\rmatchmakerAdd\x12S\n" + + "\x12matchmaker_matched\x18\x14 \x01(\v2\".nakama.realtime.MatchmakerMatchedH\x00R\x11matchmakerMatched\x12P\n" + + "\x11matchmaker_remove\x18\x15 \x01(\v2!.nakama.realtime.MatchmakerRemoveH\x00R\x10matchmakerRemove\x12P\n" + + "\x11matchmaker_ticket\x18\x16 \x01(\v2!.nakama.realtime.MatchmakerTicketH\x00R\x10matchmakerTicket\x12F\n" + + "\rnotifications\x18\x17 \x01(\v2\x1e.nakama.realtime.NotificationsH\x00R\rnotifications\x12#\n" + + "\x03rpc\x18\x18 \x01(\v2\x0f.nakama.api.RpcH\x00R\x03rpc\x121\n" + + "\x06status\x18\x19 \x01(\v2\x17.nakama.realtime.StatusH\x00R\x06status\x12D\n" + + "\rstatus_follow\x18\x1a \x01(\v2\x1d.nakama.realtime.StatusFollowH\x00R\fstatusFollow\x12Z\n" + + "\x15status_presence_event\x18\x1b \x01(\v2$.nakama.realtime.StatusPresenceEventH\x00R\x13statusPresenceEvent\x12J\n" + + "\x0fstatus_unfollow\x18\x1c \x01(\v2\x1f.nakama.realtime.StatusUnfollowH\x00R\x0estatusUnfollow\x12D\n" + + "\rstatus_update\x18\x1d \x01(\v2\x1d.nakama.realtime.StatusUpdateH\x00R\fstatusUpdate\x12>\n" + + "\vstream_data\x18\x1e \x01(\v2\x1b.nakama.realtime.StreamDataH\x00R\n" + + "streamData\x12Z\n" + + "\x15stream_presence_event\x18\x1f \x01(\v2$.nakama.realtime.StreamPresenceEventH\x00R\x13streamPresenceEvent\x12+\n" + + "\x04ping\x18 \x01(\v2\x15.nakama.realtime.PingH\x00R\x04ping\x12+\n" + + "\x04pong\x18! \x01(\v2\x15.nakama.realtime.PongH\x00R\x04pong\x12.\n" + + "\x05party\x18\" \x01(\v2\x16.nakama.realtime.PartyH\x00R\x05party\x12A\n" + + "\fparty_create\x18# \x01(\v2\x1c.nakama.realtime.PartyCreateH\x00R\vpartyCreate\x12;\n" + + "\n" + + "party_join\x18$ \x01(\v2\x1a.nakama.realtime.PartyJoinH\x00R\tpartyJoin\x12>\n" + + "\vparty_leave\x18% \x01(\v2\x1b.nakama.realtime.PartyLeaveH\x00R\n" + + "partyLeave\x12D\n" + + "\rparty_promote\x18& \x01(\v2\x1d.nakama.realtime.PartyPromoteH\x00R\fpartyPromote\x12A\n" + + "\fparty_leader\x18' \x01(\v2\x1c.nakama.realtime.PartyLeaderH\x00R\vpartyLeader\x12A\n" + + "\fparty_accept\x18( \x01(\v2\x1c.nakama.realtime.PartyAcceptH\x00R\vpartyAccept\x12A\n" + + "\fparty_remove\x18) \x01(\v2\x1c.nakama.realtime.PartyRemoveH\x00R\vpartyRemove\x12>\n" + + "\vparty_close\x18* \x01(\v2\x1b.nakama.realtime.PartyCloseH\x00R\n" + + "partyClose\x12^\n" + + "\x17party_join_request_list\x18+ \x01(\v2%.nakama.realtime.PartyJoinRequestListH\x00R\x14partyJoinRequestList\x12Q\n" + + "\x12party_join_request\x18, \x01(\v2!.nakama.realtime.PartyJoinRequestH\x00R\x10partyJoinRequest\x12W\n" + + "\x14party_matchmaker_add\x18- \x01(\v2#.nakama.realtime.PartyMatchmakerAddH\x00R\x12partyMatchmakerAdd\x12`\n" + + "\x17party_matchmaker_remove\x18. \x01(\v2&.nakama.realtime.PartyMatchmakerRemoveH\x00R\x15partyMatchmakerRemove\x12`\n" + + "\x17party_matchmaker_ticket\x18/ \x01(\v2&.nakama.realtime.PartyMatchmakerTicketH\x00R\x15partyMatchmakerTicket\x12;\n" + + "\n" + + "party_data\x180 \x01(\v2\x1a.nakama.realtime.PartyDataH\x00R\tpartyData\x12H\n" + + "\x0fparty_data_send\x181 \x01(\v2\x1e.nakama.realtime.PartyDataSendH\x00R\rpartyDataSend\x12W\n" + + "\x14party_presence_event\x182 \x01(\v2#.nakama.realtime.PartyPresenceEventH\x00R\x12partyPresenceEventB\t\n" + + "\amessage\"\x81\x02\n" + + "\aChannel\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12;\n" + + "\tpresences\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x121\n" + + "\x04self\x18\x03 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\x12\x1b\n" + + "\troom_name\x18\x04 \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\x05 \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\x06 \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\a \x01(\tR\tuserIdTwo\"\xf2\x01\n" + + "\vChannelJoin\x12\x16\n" + + "\x06target\x18\x01 \x01(\tR\x06target\x12\x12\n" + + "\x04type\x18\x02 \x01(\x05R\x04type\x12<\n" + + "\vpersistence\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\vpersistence\x122\n" + + "\x06hidden\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x06hidden\"E\n" + + "\x04Type\x12\x14\n" + + "\x10TYPE_UNSPECIFIED\x10\x00\x12\b\n" + + "\x04ROOM\x10\x01\x12\x12\n" + + "\x0eDIRECT_MESSAGE\x10\x02\x12\t\n" + + "\x05GROUP\x10\x03\"-\n" + + "\fChannelLeave\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\"\xcc\x03\n" + + "\x11ChannelMessageAck\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\x12/\n" + + "\x04code\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x04code\x12\x1a\n" + + "\busername\x18\x04 \x01(\tR\busername\x12;\n" + + "\vcreate_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12:\n" + + "\n" + + "persistent\x18\a \x01(\v2\x1a.google.protobuf.BoolValueR\n" + + "persistent\x12\x1b\n" + + "\troom_name\x18\b \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\t \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\n" + + " \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\v \x01(\tR\tuserIdTwo\"M\n" + + "\x12ChannelMessageSend\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x18\n" + + "\acontent\x18\x02 \x01(\tR\acontent\"n\n" + + "\x14ChannelMessageUpdate\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\x12\x18\n" + + "\acontent\x18\x03 \x01(\tR\acontent\"T\n" + + "\x14ChannelMessageRemove\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\"\x99\x02\n" + + "\x14ChannelPresenceEvent\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\x12\x1b\n" + + "\troom_name\x18\x04 \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\x05 \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\x06 \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\a \x01(\tR\tuserIdTwo\"\xfc\x02\n" + + "\x05Error\x12\x12\n" + + "\x04code\x18\x01 \x01(\x05R\x04code\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\x12=\n" + + "\acontext\x18\x03 \x03(\v2#.nakama.realtime.Error.ContextEntryR\acontext\x1a:\n" + + "\fContextEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc9\x01\n" + + "\x04Code\x12\x15\n" + + "\x11RUNTIME_EXCEPTION\x10\x00\x12\x18\n" + + "\x14UNRECOGNIZED_PAYLOAD\x10\x01\x12\x13\n" + + "\x0fMISSING_PAYLOAD\x10\x02\x12\r\n" + + "\tBAD_INPUT\x10\x03\x12\x13\n" + + "\x0fMATCH_NOT_FOUND\x10\x04\x12\x17\n" + + "\x13MATCH_JOIN_REJECTED\x10\x05\x12\x1e\n" + + "\x1aRUNTIME_FUNCTION_NOT_FOUND\x10\x06\x12\x1e\n" + + "\x1aRUNTIME_FUNCTION_EXCEPTION\x10\a\"\x80\x02\n" + + "\x05Match\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12$\n" + + "\rauthoritative\x18\x02 \x01(\bR\rauthoritative\x122\n" + + "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x12\x12\n" + + "\x04size\x18\x04 \x01(\x05R\x04size\x12;\n" + + "\tpresences\x18\x05 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x121\n" + + "\x04self\x18\x06 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\"!\n" + + "\vMatchCreate\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"\xaa\x01\n" + + "\tMatchData\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x17\n" + + "\aop_code\x18\x03 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x04 \x01(\fR\x04data\x12\x1a\n" + + "\breliable\x18\x05 \x01(\bR\breliable\"\xb0\x01\n" + + "\rMatchDataSend\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12\x17\n" + + "\aop_code\x18\x02 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x03 \x01(\fR\x04data\x12;\n" + + "\tpresences\x18\x04 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x12\x1a\n" + + "\breliable\x18\x05 \x01(\bR\breliable\"\xc9\x01\n" + + "\tMatchJoin\x12\x1b\n" + + "\bmatch_id\x18\x01 \x01(\tH\x00R\amatchId\x12\x16\n" + + "\x05token\x18\x02 \x01(\tH\x00R\x05token\x12D\n" + + "\bmetadata\x18\x03 \x03(\v2(.nakama.realtime.MatchJoin.MetadataEntryR\bmetadata\x1a;\n" + + "\rMetadataEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x04\n" + + "\x02id\"'\n" + + "\n" + + "MatchLeave\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\"\x9b\x01\n" + + "\x12MatchPresenceEvent\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\xf7\x03\n" + + "\rMatchmakerAdd\x12\x1b\n" + + "\tmin_count\x18\x01 \x01(\x05R\bminCount\x12\x1b\n" + + "\tmax_count\x18\x02 \x01(\x05R\bmaxCount\x12\x14\n" + + "\x05query\x18\x03 \x01(\tR\x05query\x12a\n" + + "\x11string_properties\x18\x04 \x03(\v24.nakama.realtime.MatchmakerAdd.StringPropertiesEntryR\x10stringProperties\x12d\n" + + "\x12numeric_properties\x18\x05 \x03(\v25.nakama.realtime.MatchmakerAdd.NumericPropertiesEntryR\x11numericProperties\x12B\n" + + "\x0ecount_multiple\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\rcountMultiple\x1aC\n" + + "\x15StringPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + + "\x16NumericPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01\"\xd9\x05\n" + + "\x11MatchmakerMatched\x12\x16\n" + + "\x06ticket\x18\x01 \x01(\tR\x06ticket\x12\x1b\n" + + "\bmatch_id\x18\x02 \x01(\tH\x00R\amatchId\x12\x16\n" + + "\x05token\x18\x03 \x01(\tH\x00R\x05token\x12G\n" + + "\x05users\x18\x04 \x03(\v21.nakama.realtime.MatchmakerMatched.MatchmakerUserR\x05users\x12E\n" + + "\x04self\x18\x05 \x01(\v21.nakama.realtime.MatchmakerMatched.MatchmakerUserR\x04self\x1a\xe0\x03\n" + + "\x0eMatchmakerUser\x129\n" + + "\bpresence\x18\x01 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x19\n" + + "\bparty_id\x18\x02 \x01(\tR\apartyId\x12t\n" + + "\x11string_properties\x18\x05 \x03(\v2G.nakama.realtime.MatchmakerMatched.MatchmakerUser.StringPropertiesEntryR\x10stringProperties\x12w\n" + + "\x12numeric_properties\x18\x06 \x03(\v2H.nakama.realtime.MatchmakerMatched.MatchmakerUser.NumericPropertiesEntryR\x11numericProperties\x1aC\n" + + "\x15StringPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + + "\x16NumericPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01B\x04\n" + + "\x02id\"*\n" + + "\x10MatchmakerRemove\x12\x16\n" + + "\x06ticket\x18\x01 \x01(\tR\x06ticket\"*\n" + + "\x10MatchmakerTicket\x12\x16\n" + + "\x06ticket\x18\x01 \x01(\tR\x06ticket\"O\n" + + "\rNotifications\x12>\n" + + "\rnotifications\x18\x01 \x03(\v2\x18.nakama.api.NotificationR\rnotifications\"\xf8\x01\n" + + "\x05Party\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x12\n" + + "\x04open\x18\x02 \x01(\bR\x04open\x12\x19\n" + + "\bmax_size\x18\x03 \x01(\x05R\amaxSize\x121\n" + + "\x04self\x18\x04 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\x125\n" + + "\x06leader\x18\x05 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x06leader\x12;\n" + + "\tpresences\x18\x06 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"<\n" + + "\vPartyCreate\x12\x12\n" + + "\x04open\x18\x01 \x01(\bR\x04open\x12\x19\n" + + "\bmax_size\x18\x02 \x01(\x05R\amaxSize\"&\n" + + "\tPartyJoin\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"'\n" + + "\n" + + "PartyLeave\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"d\n" + + "\fPartyPromote\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + + "\vPartyLeader\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + + "\vPartyAccept\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + + "\vPartyRemove\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"'\n" + + "\n" + + "PartyClose\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"1\n" + + "\x14PartyJoinRequestList\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"j\n" + + "\x10PartyJoinRequest\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12;\n" + + "\tpresences\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"\xa1\x04\n" + + "\x12PartyMatchmakerAdd\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x1b\n" + + "\tmin_count\x18\x02 \x01(\x05R\bminCount\x12\x1b\n" + + "\tmax_count\x18\x03 \x01(\x05R\bmaxCount\x12\x14\n" + + "\x05query\x18\x04 \x01(\tR\x05query\x12f\n" + + "\x11string_properties\x18\x05 \x03(\v29.nakama.realtime.PartyMatchmakerAdd.StringPropertiesEntryR\x10stringProperties\x12i\n" + + "\x12numeric_properties\x18\x06 \x03(\v2:.nakama.realtime.PartyMatchmakerAdd.NumericPropertiesEntryR\x11numericProperties\x12B\n" + + "\x0ecount_multiple\x18\a \x01(\v2\x1b.google.protobuf.Int32ValueR\rcountMultiple\x1aC\n" + + "\x15StringPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + + "\x16NumericPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01\"J\n" + + "\x15PartyMatchmakerRemove\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x16\n" + + "\x06ticket\x18\x02 \x01(\tR\x06ticket\"J\n" + + "\x15PartyMatchmakerTicket\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x16\n" + + "\x06ticket\x18\x02 \x01(\tR\x06ticket\"\x8e\x01\n" + + "\tPartyData\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x17\n" + + "\aop_code\x18\x03 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x04 \x01(\fR\x04data\"W\n" + + "\rPartyDataSend\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x17\n" + + "\aop_code\x18\x02 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x03 \x01(\fR\x04data\"\x9b\x01\n" + + "\x12PartyPresenceEvent\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\x06\n" + + "\x04Ping\"\x06\n" + + "\x04Pong\"E\n" + + "\x06Status\x12;\n" + + "\tpresences\x18\x01 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"G\n" + + "\fStatusFollow\x12\x19\n" + + "\buser_ids\x18\x01 \x03(\tR\auserIds\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\"\x81\x01\n" + + "\x13StatusPresenceEvent\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"+\n" + + "\x0eStatusUnfollow\x12\x19\n" + + "\buser_ids\x18\x01 \x03(\tR\auserIds\"D\n" + + "\fStatusUpdate\x124\n" + + "\x06status\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x06status\"l\n" + + "\x06Stream\x12\x12\n" + + "\x04mode\x18\x01 \x01(\x05R\x04mode\x12\x18\n" + + "\asubject\x18\x02 \x01(\tR\asubject\x12\x1e\n" + + "\n" + + "subcontext\x18\x03 \x01(\tR\n" + + "subcontext\x12\x14\n" + + "\x05label\x18\x04 \x01(\tR\x05label\"\xa4\x01\n" + + "\n" + + "StreamData\x12/\n" + + "\x06stream\x18\x01 \x01(\v2\x17.nakama.realtime.StreamR\x06stream\x125\n" + + "\x06sender\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x06sender\x12\x12\n" + + "\x04data\x18\x03 \x01(\tR\x04data\x12\x1a\n" + + "\breliable\x18\x04 \x01(\bR\breliable\"\xb2\x01\n" + + "\x13StreamPresenceEvent\x12/\n" + + "\x06stream\x18\x01 \x01(\v2\x17.nakama.realtime.StreamR\x06stream\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\xba\x01\n" + + "\fUserPresence\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + + "\n" + + "session_id\x18\x02 \x01(\tR\tsessionId\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\x12 \n" + + "\vpersistence\x18\x04 \x01(\bR\vpersistence\x124\n" + + "\x06status\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\x06statusBl\n" + + "\x1bcom.heroiclabs.nakama.rtapiB\x0eNakamaRealtimeP\x01Z)github.com/heroiclabs/nakama-common/rtapi\xaa\x02\x0fNakama.Protobufb\x06proto3" var ( file_realtime_proto_rawDescOnce sync.Once - file_realtime_proto_rawDescData = file_realtime_proto_rawDesc + file_realtime_proto_rawDescData []byte ) func file_realtime_proto_rawDescGZIP() []byte { file_realtime_proto_rawDescOnce.Do(func() { - file_realtime_proto_rawDescData = protoimpl.X.CompressGZIP(file_realtime_proto_rawDescData) + file_realtime_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_realtime_proto_rawDesc), len(file_realtime_proto_rawDesc))) }) return file_realtime_proto_rawDescData } var file_realtime_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_realtime_proto_msgTypes = make([]protoimpl.MessageInfo, 59) -var file_realtime_proto_goTypes = []interface{}{ +var file_realtime_proto_goTypes = []any{ (ChannelJoin_Type)(0), // 0: nakama.realtime.ChannelJoin.Type (Error_Code)(0), // 1: nakama.realtime.Error.Code (*Envelope)(nil), // 2: nakama.realtime.Envelope @@ -5264,621 +4831,7 @@ func file_realtime_proto_init() { if File_realtime_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_realtime_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Envelope); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Channel); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelJoin); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelLeave); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageAck); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageSend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Match); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchCreate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchDataSend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchJoin); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchLeave); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerAdd); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerMatched); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerTicket); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Notifications); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Party); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyCreate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyJoin); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyLeave); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyPromote); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyLeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyAccept); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyClose); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyJoinRequestList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyJoinRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMatchmakerAdd); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMatchmakerRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMatchmakerTicket); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyDataSend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ping); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pong); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Status); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusFollow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUnfollow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Stream); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserPresence); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerMatched_MatchmakerUser); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_realtime_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_realtime_proto_msgTypes[0].OneofWrappers = []any{ (*Envelope_Channel)(nil), (*Envelope_ChannelJoin)(nil), (*Envelope_ChannelLeave)(nil), @@ -5929,11 +4882,11 @@ func file_realtime_proto_init() { (*Envelope_PartyDataSend)(nil), (*Envelope_PartyPresenceEvent)(nil), } - file_realtime_proto_msgTypes[14].OneofWrappers = []interface{}{ + file_realtime_proto_msgTypes[14].OneofWrappers = []any{ (*MatchJoin_MatchId)(nil), (*MatchJoin_Token)(nil), } - file_realtime_proto_msgTypes[18].OneofWrappers = []interface{}{ + file_realtime_proto_msgTypes[18].OneofWrappers = []any{ (*MatchmakerMatched_MatchId)(nil), (*MatchmakerMatched_Token)(nil), } @@ -5941,7 +4894,7 @@ func file_realtime_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_realtime_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_realtime_proto_rawDesc), len(file_realtime_proto_rawDesc)), NumEnums: 2, NumMessages: 59, NumExtensions: 0, @@ -5953,7 +4906,6 @@ func file_realtime_proto_init() { MessageInfos: file_realtime_proto_msgTypes, }.Build() File_realtime_proto = out.File - file_realtime_proto_rawDesc = nil file_realtime_proto_goTypes = nil file_realtime_proto_depIdxs = nil } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go index 6784eaffab..076913bc9f 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go @@ -93,6 +93,7 @@ type IAPConfig interface { GetGoogle() IAPGoogleConfig GetHuawei() IAPHuaweiConfig GetFacebookInstant() IAPFacebookInstantConfig + GetXbox() IAPXboxConfig } type IAPAppleConfig interface { @@ -125,6 +126,10 @@ type IAPFacebookInstantConfig interface { GetAppSecret() string } +type IAPXboxConfig interface { + GetToken() string +} + type GoogleAuthConfig interface { GetCredentialsJSON() string } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 6e8342b304..be1eae86e9 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -90,12 +90,14 @@ import ( "database/sql" "errors" "fmt" + "github.com/gofrs/uuid/v5" "net/http" "os" "time" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama-common/rtapi" + "go.uber.org/zap" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -376,6 +378,9 @@ type Initializer interface { // RegisterSubscriptionNotificationGoogle RegisterSubscriptionNotificationGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, subscription *api.ValidatedSubscription, providerPayload string) error) error + // RegisterPurchaseNotificationXbox + RegisterPurchaseNotificationXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error) error + // RegisterBeforeGetAccount is used to register a function invoked when the server receives the relevant request. RegisterBeforeGetAccount(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule) error) error @@ -768,6 +773,12 @@ type Initializer interface { // RegisterAfterValidatePurchaseGoogle can be used to perform additional logic after validating a Google Play Store IAP receipt. RegisterAfterValidatePurchaseGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseGoogleRequest) error) error + // RegisterBeforeValidatePurchaseXbox can be used to perform additional logic before validating a Xbox Store receipt + RegisterBeforeValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error)) error + + // RegisterAfterValidatePurchaseXbox can be used to perform additional logic after validating a Xbox Store receipt + RegisterAfterValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error) error + // RegisterBeforeValidateSubscriptionGoogle can be used to perform additional logic before validation an Google Store Subscription receipt. RegisterBeforeValidateSubscriptionGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidateSubscriptionGoogleRequest) (*api.ValidateSubscriptionGoogleRequest, error)) error @@ -876,6 +887,9 @@ type Initializer interface { // RegisterFleetManager can be used to register a FleetManager implementation that can be retrieved from the runtime using GetFleetManager(). RegisterFleetManager(fleetManagerInit FleetManagerInitializer) error + // RegisterIAPManager sets the relevant iapManger in the runtime object + RegisterIAPManager(platform string, iapManager interface{}) error + // RegisterShutdown can be used to register a function that is executed once the server receives a termination signal. // This function only fires if shutdown_grace_sec > 0 and will be terminated early if its execution takes longer than the configured grace seconds. RegisterShutdown(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule)) error @@ -1329,6 +1343,14 @@ type FleetManagerInitializer interface { Delete(ctx context.Context, id string) error } +type xboxRefundHookFn = func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error + +type IAPManager interface { + Init(fn xboxRefundHookFn) + PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, password, productId string, userID uuid.UUID, persist bool) (*api.ValidatePurchaseResponse, error) + HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) error +} + /* Satori runtime integration definitions. */ diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index 81faec7e75..97bd8b06f7 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -225,6 +225,11 @@ var fhBytes = sync.Pool{ }, } +func invalidHTTP1LookingFrameHeader() FrameHeader { + fh, _ := readFrameHeader(make([]byte, frameHeaderLen), strings.NewReader("HTTP/1.1 ")) + return fh +} + // ReadFrameHeader reads 9 bytes from r and returns a FrameHeader. // Most users should use Framer.ReadFrame instead. func ReadFrameHeader(r io.Reader) (FrameHeader, error) { @@ -503,10 +508,16 @@ func (fr *Framer) ReadFrame() (Frame, error) { return nil, err } if fh.Length > fr.maxReadSize { + if fh == invalidHTTP1LookingFrameHeader() { + return nil, fmt.Errorf("http2: failed reading the frame payload: %w, note that the frame header looked like an HTTP/1.1 header", err) + } return nil, ErrFrameTooLarge } payload := fr.getReadBuf(fh.Length) if _, err := io.ReadFull(fr.r, payload); err != nil { + if fh == invalidHTTP1LookingFrameHeader() { + return nil, fmt.Errorf("http2: failed reading the frame payload: %w, note that the frame header looked like an HTTP/1.1 header", err) + } return nil, err } f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, fr.countError, payload) diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index b640deb0e0..51fca38f61 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -1068,7 +1068,10 @@ func (sc *serverConn) serve(conf http2Config) { func (sc *serverConn) handlePingTimer(lastFrameReadTime time.Time) { if sc.pingSent { - sc.vlogf("timeout waiting for PING response") + sc.logf("timeout waiting for PING response") + if f := sc.countErrorFunc; f != nil { + f("conn_close_lost_ping") + } sc.conn.Close() return } diff --git a/vendor/modules.txt b/vendor/modules.txt index d875c57b99..76c0d65a35 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -139,7 +139,7 @@ github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/internal/genopena github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options github.com/grpc-ecosystem/grpc-gateway/v2/runtime github.com/grpc-ecosystem/grpc-gateway/v2/utilities -# github.com/heroiclabs/nakama-common v1.37.0 +# github.com/heroiclabs/nakama-common v1.37.0 => ../../nakama-modular-entiitlements/nakama-common-master/nakama-common ## explicit; go 1.24.3 github.com/heroiclabs/nakama-common/api github.com/heroiclabs/nakama-common/rtapi @@ -253,7 +253,7 @@ go.uber.org/zap/zaptest/observer golang.org/x/crypto/bcrypt golang.org/x/crypto/blowfish golang.org/x/crypto/pbkdf2 -# golang.org/x/net v0.37.0 +# golang.org/x/net v0.38.0 ## explicit; go 1.23.0 golang.org/x/net/http/httpguts golang.org/x/net/http2 @@ -434,3 +434,4 @@ gopkg.in/natefinch/lumberjack.v2 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 +# github.com/heroiclabs/nakama-common => ../../nakama-modular-entiitlements/nakama-common-master/nakama-common From 7eda41724fa16757847e4f39cb3ed378d9225daa Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 1 Jul 2025 18:00:55 +0100 Subject: [PATCH 03/28] removed comments and test logs --- server/api_purchase.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/api_purchase.go b/server/api_purchase.go index a09e1cf8ab..ac5a12b33a 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -260,11 +260,8 @@ func (s *ApiServer) ValidatePurchaseFacebookInstant(ctx context.Context, in *api func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) - s.logger.Info("ValidatePurchaseXbox hit") // Before hook. if fn := s.runtime.BeforeValidatePurchaseXbox(); fn != nil { - s.logger.Info("ValidatePurchaseXbox before hook hit") - beforeFn := func(clientIP, clientPort string) error { result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) if err != nil { @@ -299,7 +296,6 @@ func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePu persist = in.Persist.GetValue() } - //validation, err := ValidatePurchaseFacebookInstant(ctx, s.logger, s.db, userID, s.config.GetIAP().FacebookInstant, in.SignedRequest, persist) validation, err := s.runtime.iapXboxManager.PurchaseValidate(ctx, s.logger, s.db, s.config.GetIAP().Xbox.Token, in.ProductId, userID, persist) if err != nil { return nil, err From 88fb850d523614aa80bed832e0b02397597badaf Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 1 Jul 2025 18:06:12 +0100 Subject: [PATCH 04/28] go mod tidy, go mod vendor --- go.sum | 2 + .../heroiclabs/nakama-common/api/api.pb.go | 6196 ++++++++++++----- .../heroiclabs/nakama-common/api/api.proto | 8 - .../nakama-common/rtapi/realtime.pb.go | 2978 +++++--- .../nakama-common/runtime/config.go | 5 - .../nakama-common/runtime/runtime.go | 22 - vendor/modules.txt | 3 +- 7 files changed, 6282 insertions(+), 2932 deletions(-) diff --git a/go.sum b/go.sum index e96561f36a..8675a82aa0 100644 --- a/go.sum +++ b/go.sum @@ -98,6 +98,8 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/heroiclabs/nakama-common v1.37.0 h1:RceEGzvb+d+kPZY7ONbfozjaVyX3wIqNA/zZyp+M+mw= +github.com/heroiclabs/nakama-common v1.37.0/go.mod h1:gpGzr0tineLtVeNuBNfN4lObWfalcXClXdH/LHV9IX0= github.com/heroiclabs/sql-migrate v0.0.0-20241125131053-95a7949783b0 h1:hHJcYOP6L2/wZIEnYjjkJM+rOk/bK0uaYkDAejYpLhI= github.com/heroiclabs/sql-migrate v0.0.0-20241125131053-95a7949783b0/go.mod h1:uwcmopkVQIfb/JQqul5zmGI9ounclRC08j9S9lLcpRQ= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index 9585f1d770..2af429c214 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 -// protoc v4.24.3 +// protoc-gen-go v1.31.0 +// protoc v5.29.3 // source: api.proto package api @@ -30,7 +30,6 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" - unsafe "unsafe" ) const ( @@ -52,8 +51,6 @@ const ( StoreProvider_HUAWEI_APP_GALLERY StoreProvider = 2 // Facebook Instant Store StoreProvider_FACEBOOK_INSTANT_STORE StoreProvider = 3 - // Xbox Store - StoreProvider_XBOX_STORE StoreProvider = 4 ) // Enum value maps for StoreProvider. @@ -63,14 +60,12 @@ var ( 1: "GOOGLE_PLAY_STORE", 2: "HUAWEI_APP_GALLERY", 3: "FACEBOOK_INSTANT_STORE", - 4: "XBOX_STORE", } StoreProvider_value = map[string]int32{ "APPLE_APP_STORE": 0, "GOOGLE_PLAY_STORE": 1, "HUAWEI_APP_GALLERY": 2, "FACEBOOK_INSTANT_STORE": 3, - "XBOX_STORE": 4, } ) @@ -388,7 +383,10 @@ func (UserGroupList_UserGroup_State) EnumDescriptor() ([]byte, []int) { // A user with additional account details. Always the current user. type Account struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The user object. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // The user's wallet data. @@ -402,16 +400,16 @@ type Account struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's email was verified. VerifyTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=verify_time,json=verifyTime,proto3" json:"verify_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's account was disabled/banned. - DisableTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + DisableTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` } func (x *Account) Reset() { *x = Account{} - mi := &file_api_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Account) String() string { @@ -422,7 +420,7 @@ func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[0] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -488,20 +486,23 @@ func (x *Account) GetDisableTime() *timestamppb.Timestamp { // Obtain a new authentication token using a refresh token. type AccountRefresh struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Refresh token. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountRefresh) Reset() { *x = AccountRefresh{} - mi := &file_api_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountRefresh) String() string { @@ -512,7 +513,7 @@ func (*AccountRefresh) ProtoMessage() {} func (x *AccountRefresh) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[1] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -543,20 +544,23 @@ func (x *AccountRefresh) GetVars() map[string]string { // Send a Apple Sign In token to the server. Used with authenticate/link/unlink. type AccountApple struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID token received from Apple to validate. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountApple) Reset() { *x = AccountApple{} - mi := &file_api_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountApple) String() string { @@ -567,7 +571,7 @@ func (*AccountApple) ProtoMessage() {} func (x *AccountApple) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[2] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -598,20 +602,23 @@ func (x *AccountApple) GetVars() map[string]string { // Send a custom ID to the server. Used with authenticate/link/unlink. type AccountCustom struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // A custom identifier. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountCustom) Reset() { *x = AccountCustom{} - mi := &file_api_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountCustom) String() string { @@ -622,7 +629,7 @@ func (*AccountCustom) ProtoMessage() {} func (x *AccountCustom) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[3] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -653,20 +660,23 @@ func (x *AccountCustom) GetVars() map[string]string { // Send a device to the server. Used with authenticate/link/unlink and user. type AccountDevice struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // A device identifier. Should be obtained by a platform-specific device API. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountDevice) Reset() { *x = AccountDevice{} - mi := &file_api_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountDevice) String() string { @@ -677,7 +687,7 @@ func (*AccountDevice) ProtoMessage() {} func (x *AccountDevice) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[4] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -708,22 +718,25 @@ func (x *AccountDevice) GetVars() map[string]string { // Send an email with password to the server. Used with authenticate/link/unlink. type AccountEmail struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // A valid RFC-5322 email address. Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` // A password for the user account. Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` // Ignored with unlink operations. // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,3,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,3,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountEmail) Reset() { *x = AccountEmail{} - mi := &file_api_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountEmail) String() string { @@ -734,7 +747,7 @@ func (*AccountEmail) ProtoMessage() {} func (x *AccountEmail) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[5] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -772,20 +785,23 @@ func (x *AccountEmail) GetVars() map[string]string { // Send a Facebook token to the server. Used with authenticate/link/unlink. type AccountFacebook struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The OAuth token received from Facebook to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountFacebook) Reset() { *x = AccountFacebook{} - mi := &file_api_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountFacebook) String() string { @@ -796,7 +812,7 @@ func (*AccountFacebook) ProtoMessage() {} func (x *AccountFacebook) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[6] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -827,20 +843,23 @@ func (x *AccountFacebook) GetVars() map[string]string { // Send a Facebook Instant Game token to the server. Used with authenticate/link/unlink. type AccountFacebookInstantGame struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The OAuth token received from a Facebook Instant Game that may be decoded with the Application Secret (must be available with the nakama configuration) SignedPlayerInfo string `protobuf:"bytes,1,opt,name=signed_player_info,json=signedPlayerInfo,proto3" json:"signed_player_info,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountFacebookInstantGame) Reset() { *x = AccountFacebookInstantGame{} - mi := &file_api_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountFacebookInstantGame) String() string { @@ -851,7 +870,7 @@ func (*AccountFacebookInstantGame) ProtoMessage() {} func (x *AccountFacebookInstantGame) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[7] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -882,7 +901,10 @@ func (x *AccountFacebookInstantGame) GetVars() map[string]string { // Send Apple's Game Center account credentials to the server. Used with authenticate/link/unlink. type AccountGameCenter struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Player ID (generated by GameCenter). PlayerId string `protobuf:"bytes,1,opt,name=player_id,json=playerId,proto3" json:"player_id,omitempty"` // Bundle ID (generated by GameCenter). @@ -896,16 +918,16 @@ type AccountGameCenter struct { // The URL for the public encryption key. PublicKeyUrl string `protobuf:"bytes,6,opt,name=public_key_url,json=publicKeyUrl,proto3" json:"public_key_url,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountGameCenter) Reset() { *x = AccountGameCenter{} - mi := &file_api_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountGameCenter) String() string { @@ -916,7 +938,7 @@ func (*AccountGameCenter) ProtoMessage() {} func (x *AccountGameCenter) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[8] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -982,20 +1004,23 @@ func (x *AccountGameCenter) GetVars() map[string]string { // Send a Google token to the server. Used with authenticate/link/unlink. type AccountGoogle struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The OAuth token received from Google to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountGoogle) Reset() { *x = AccountGoogle{} - mi := &file_api_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountGoogle) String() string { @@ -1006,7 +1031,7 @@ func (*AccountGoogle) ProtoMessage() {} func (x *AccountGoogle) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[9] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1037,20 +1062,23 @@ func (x *AccountGoogle) GetVars() map[string]string { // Send a Steam token to the server. Used with authenticate/link/unlink. type AccountSteam struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account token received from Steam to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AccountSteam) Reset() { *x = AccountSteam{} - mi := &file_api_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AccountSteam) String() string { @@ -1061,7 +1089,7 @@ func (*AccountSteam) ProtoMessage() {} func (x *AccountSteam) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[10] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1092,22 +1120,25 @@ func (x *AccountSteam) GetVars() map[string]string { // Add one or more friends to the current user. type AddFriendsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` // Optional metadata to add to friends. - Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` } func (x *AddFriendsRequest) Reset() { *x = AddFriendsRequest{} - mi := &file_api_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AddFriendsRequest) String() string { @@ -1118,7 +1149,7 @@ func (*AddFriendsRequest) ProtoMessage() {} func (x *AddFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[11] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1156,20 +1187,23 @@ func (x *AddFriendsRequest) GetMetadata() string { // Add users to a group. type AddGroupUsersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The group to add users to. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to add. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` } func (x *AddGroupUsersRequest) Reset() { *x = AddGroupUsersRequest{} - mi := &file_api_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AddGroupUsersRequest) String() string { @@ -1180,7 +1214,7 @@ func (*AddGroupUsersRequest) ProtoMessage() {} func (x *AddGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[12] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1211,20 +1245,23 @@ func (x *AddGroupUsersRequest) GetUserIds() []string { // Authenticate against the server with a refresh token. type SessionRefreshRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Refresh token. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *SessionRefreshRequest) Reset() { *x = SessionRefreshRequest{} - mi := &file_api_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SessionRefreshRequest) String() string { @@ -1235,7 +1272,7 @@ func (*SessionRefreshRequest) ProtoMessage() {} func (x *SessionRefreshRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[13] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1266,20 +1303,23 @@ func (x *SessionRefreshRequest) GetVars() map[string]string { // Log out a session, invalidate a refresh token, or log out all sessions/refresh tokens for a user. type SessionLogoutRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Session token to log out. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Refresh token to invalidate. - RefreshToken string `protobuf:"bytes,2,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + RefreshToken string `protobuf:"bytes,2,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` } func (x *SessionLogoutRequest) Reset() { *x = SessionLogoutRequest{} - mi := &file_api_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SessionLogoutRequest) String() string { @@ -1290,7 +1330,7 @@ func (*SessionLogoutRequest) ProtoMessage() {} func (x *SessionLogoutRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[14] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1321,22 +1361,25 @@ func (x *SessionLogoutRequest) GetRefreshToken() string { // Authenticate against the server with Apple Sign In. type AuthenticateAppleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Apple account details. Account *AccountApple `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` } func (x *AuthenticateAppleRequest) Reset() { *x = AuthenticateAppleRequest{} - mi := &file_api_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateAppleRequest) String() string { @@ -1347,7 +1390,7 @@ func (*AuthenticateAppleRequest) ProtoMessage() {} func (x *AuthenticateAppleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[15] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1385,22 +1428,25 @@ func (x *AuthenticateAppleRequest) GetUsername() string { // Authenticate against the server with a custom ID. type AuthenticateCustomRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The custom account details. Account *AccountCustom `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` } func (x *AuthenticateCustomRequest) Reset() { *x = AuthenticateCustomRequest{} - mi := &file_api_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateCustomRequest) String() string { @@ -1411,7 +1457,7 @@ func (*AuthenticateCustomRequest) ProtoMessage() {} func (x *AuthenticateCustomRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[16] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1449,22 +1495,25 @@ func (x *AuthenticateCustomRequest) GetUsername() string { // Authenticate against the server with a device ID. type AuthenticateDeviceRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The device account details. Account *AccountDevice `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` } func (x *AuthenticateDeviceRequest) Reset() { *x = AuthenticateDeviceRequest{} - mi := &file_api_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateDeviceRequest) String() string { @@ -1475,7 +1524,7 @@ func (*AuthenticateDeviceRequest) ProtoMessage() {} func (x *AuthenticateDeviceRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[17] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1513,22 +1562,25 @@ func (x *AuthenticateDeviceRequest) GetUsername() string { // Authenticate against the server with email+password. type AuthenticateEmailRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The email account details. Account *AccountEmail `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` } func (x *AuthenticateEmailRequest) Reset() { *x = AuthenticateEmailRequest{} - mi := &file_api_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateEmailRequest) String() string { @@ -1539,7 +1591,7 @@ func (*AuthenticateEmailRequest) ProtoMessage() {} func (x *AuthenticateEmailRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[18] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1577,7 +1629,10 @@ func (x *AuthenticateEmailRequest) GetUsername() string { // Authenticate against the server with Facebook. type AuthenticateFacebookRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. @@ -1585,16 +1640,16 @@ type AuthenticateFacebookRequest struct { // Set the username on the account at register. Must be unique. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` // Import Facebook friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` } func (x *AuthenticateFacebookRequest) Reset() { *x = AuthenticateFacebookRequest{} - mi := &file_api_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateFacebookRequest) String() string { @@ -1605,7 +1660,7 @@ func (*AuthenticateFacebookRequest) ProtoMessage() {} func (x *AuthenticateFacebookRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[19] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1650,22 +1705,25 @@ func (x *AuthenticateFacebookRequest) GetSync() *wrapperspb.BoolValue { // Authenticate against the server with Facebook Instant Game token. type AuthenticateFacebookInstantGameRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Facebook Instant Game account details. Account *AccountFacebookInstantGame `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` } func (x *AuthenticateFacebookInstantGameRequest) Reset() { *x = AuthenticateFacebookInstantGameRequest{} - mi := &file_api_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateFacebookInstantGameRequest) String() string { @@ -1676,7 +1734,7 @@ func (*AuthenticateFacebookInstantGameRequest) ProtoMessage() {} func (x *AuthenticateFacebookInstantGameRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[20] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1714,22 +1772,25 @@ func (x *AuthenticateFacebookInstantGameRequest) GetUsername() string { // Authenticate against the server with Apple's Game Center. type AuthenticateGameCenterRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Game Center account details. Account *AccountGameCenter `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` } func (x *AuthenticateGameCenterRequest) Reset() { *x = AuthenticateGameCenterRequest{} - mi := &file_api_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateGameCenterRequest) String() string { @@ -1740,7 +1801,7 @@ func (*AuthenticateGameCenterRequest) ProtoMessage() {} func (x *AuthenticateGameCenterRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[21] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1778,22 +1839,25 @@ func (x *AuthenticateGameCenterRequest) GetUsername() string { // Authenticate against the server with Google. type AuthenticateGoogleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Google account details. Account *AccountGoogle `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` } func (x *AuthenticateGoogleRequest) Reset() { *x = AuthenticateGoogleRequest{} - mi := &file_api_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateGoogleRequest) String() string { @@ -1804,7 +1868,7 @@ func (*AuthenticateGoogleRequest) ProtoMessage() {} func (x *AuthenticateGoogleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[22] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1842,7 +1906,10 @@ func (x *AuthenticateGoogleRequest) GetUsername() string { // Authenticate against the server with Steam. type AuthenticateSteamRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Steam account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. @@ -1850,16 +1917,16 @@ type AuthenticateSteamRequest struct { // Set the username on the account at register. Must be unique. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` // Import Steam friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` } func (x *AuthenticateSteamRequest) Reset() { *x = AuthenticateSteamRequest{} - mi := &file_api_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *AuthenticateSteamRequest) String() string { @@ -1870,7 +1937,7 @@ func (*AuthenticateSteamRequest) ProtoMessage() {} func (x *AuthenticateSteamRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[23] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1915,20 +1982,23 @@ func (x *AuthenticateSteamRequest) GetSync() *wrapperspb.BoolValue { // Ban users from a group. type BanGroupUsersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The group to ban users from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to ban. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` } func (x *BanGroupUsersRequest) Reset() { *x = BanGroupUsersRequest{} - mi := &file_api_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *BanGroupUsersRequest) String() string { @@ -1939,7 +2009,7 @@ func (*BanGroupUsersRequest) ProtoMessage() {} func (x *BanGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[24] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1970,20 +2040,23 @@ func (x *BanGroupUsersRequest) GetUserIds() []string { // Block one or more friends for the current user. type BlockFriendsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` } func (x *BlockFriendsRequest) Reset() { *x = BlockFriendsRequest{} - mi := &file_api_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *BlockFriendsRequest) String() string { @@ -1994,7 +2067,7 @@ func (*BlockFriendsRequest) ProtoMessage() {} func (x *BlockFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[25] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2025,7 +2098,10 @@ func (x *BlockFriendsRequest) GetUsernames() []string { // A message sent on a channel. type ChannelMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The channel this message belongs to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The unique ID of this message. @@ -2051,16 +2127,16 @@ type ChannelMessage struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,12,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,13,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIdTwo string `protobuf:"bytes,13,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` } func (x *ChannelMessage) Reset() { *x = ChannelMessage{} - mi := &file_api_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelMessage) String() string { @@ -2071,7 +2147,7 @@ func (*ChannelMessage) ProtoMessage() {} func (x *ChannelMessage) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[26] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2179,7 +2255,10 @@ func (x *ChannelMessage) GetUserIdTwo() string { // A list of channel messages, usually a result of a list operation. type ChannelMessageList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // A list of messages. Messages []*ChannelMessage `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` // The cursor to send when retrieving the next page, if any. @@ -2188,15 +2267,15 @@ type ChannelMessageList struct { PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // Cacheable cursor to list newer messages. Durable and designed to be stored, unlike next/prev cursors. CacheableCursor string `protobuf:"bytes,4,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *ChannelMessageList) Reset() { *x = ChannelMessageList{} - mi := &file_api_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelMessageList) String() string { @@ -2207,7 +2286,7 @@ func (*ChannelMessageList) ProtoMessage() {} func (x *ChannelMessageList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[27] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2252,7 +2331,10 @@ func (x *ChannelMessageList) GetCacheableCursor() string { // Create a group with the current user as owner. type CreateGroupRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // A unique name for the group. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // A description for the group. @@ -2264,16 +2346,16 @@ type CreateGroupRequest struct { // Mark a group as open or not where only admins can accept members. Open bool `protobuf:"varint,5,opt,name=open,proto3" json:"open,omitempty"` // Maximum number of group members. - MaxCount int32 `protobuf:"varint,6,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + MaxCount int32 `protobuf:"varint,6,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` } func (x *CreateGroupRequest) Reset() { *x = CreateGroupRequest{} - mi := &file_api_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *CreateGroupRequest) String() string { @@ -2284,7 +2366,7 @@ func (*CreateGroupRequest) ProtoMessage() {} func (x *CreateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[28] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2343,20 +2425,23 @@ func (x *CreateGroupRequest) GetMaxCount() int32 { // Delete one or more friends for the current user. type DeleteFriendsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` } func (x *DeleteFriendsRequest) Reset() { *x = DeleteFriendsRequest{} - mi := &file_api_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DeleteFriendsRequest) String() string { @@ -2367,7 +2452,7 @@ func (*DeleteFriendsRequest) ProtoMessage() {} func (x *DeleteFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[29] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2398,18 +2483,21 @@ func (x *DeleteFriendsRequest) GetUsernames() []string { // Delete a group the user has access to. type DeleteGroupRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The id of a group. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The id of a group. + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` } func (x *DeleteGroupRequest) Reset() { *x = DeleteGroupRequest{} - mi := &file_api_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DeleteGroupRequest) String() string { @@ -2420,7 +2508,7 @@ func (*DeleteGroupRequest) ProtoMessage() {} func (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[30] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2444,18 +2532,21 @@ func (x *DeleteGroupRequest) GetGroupId() string { // Delete a leaderboard record. type DeleteLeaderboardRecordRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The leaderboard ID to delete from. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *DeleteLeaderboardRecordRequest) Reset() { *x = DeleteLeaderboardRecordRequest{} - mi := &file_api_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DeleteLeaderboardRecordRequest) String() string { @@ -2466,7 +2557,7 @@ func (*DeleteLeaderboardRecordRequest) ProtoMessage() {} func (x *DeleteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[31] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2490,18 +2581,21 @@ func (x *DeleteLeaderboardRecordRequest) GetLeaderboardId() string { // Delete one or more notifications for the current user. type DeleteNotificationsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The id of notifications. - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The id of notifications. + Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` } func (x *DeleteNotificationsRequest) Reset() { *x = DeleteNotificationsRequest{} - mi := &file_api_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DeleteNotificationsRequest) String() string { @@ -2512,7 +2606,7 @@ func (*DeleteNotificationsRequest) ProtoMessage() {} func (x *DeleteNotificationsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[32] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2536,18 +2630,21 @@ func (x *DeleteNotificationsRequest) GetIds() []string { // Delete a leaderboard record. type DeleteTournamentRecordRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The tournament ID to delete from. - TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The tournament ID to delete from. + TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` } func (x *DeleteTournamentRecordRequest) Reset() { *x = DeleteTournamentRecordRequest{} - mi := &file_api_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DeleteTournamentRecordRequest) String() string { @@ -2558,7 +2655,7 @@ func (*DeleteTournamentRecordRequest) ProtoMessage() {} func (x *DeleteTournamentRecordRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[33] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2582,22 +2679,25 @@ func (x *DeleteTournamentRecordRequest) GetTournamentId() string { // Storage objects to delete. type DeleteStorageObjectId struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // The version hash of the object. - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` } func (x *DeleteStorageObjectId) Reset() { *x = DeleteStorageObjectId{} - mi := &file_api_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DeleteStorageObjectId) String() string { @@ -2608,7 +2708,7 @@ func (*DeleteStorageObjectId) ProtoMessage() {} func (x *DeleteStorageObjectId) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[34] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2646,18 +2746,21 @@ func (x *DeleteStorageObjectId) GetVersion() string { // Batch delete storage objects. type DeleteStorageObjectsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Batch of storage objects. - ObjectIds []*DeleteStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Batch of storage objects. + ObjectIds []*DeleteStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` } func (x *DeleteStorageObjectsRequest) Reset() { *x = DeleteStorageObjectsRequest{} - mi := &file_api_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DeleteStorageObjectsRequest) String() string { @@ -2668,7 +2771,7 @@ func (*DeleteStorageObjectsRequest) ProtoMessage() {} func (x *DeleteStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[35] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2692,24 +2795,27 @@ func (x *DeleteStorageObjectsRequest) GetObjectIds() []*DeleteStorageObjectId { // Represents an event to be passed through the server to registered event handlers. type Event struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // An event name, type, category, or identifier. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Arbitrary event property values. - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The time when the event was triggered. Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // True if the event came directly from a client call, false otherwise. - External bool `protobuf:"varint,4,opt,name=external,proto3" json:"external,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + External bool `protobuf:"varint,4,opt,name=external,proto3" json:"external,omitempty"` } func (x *Event) Reset() { *x = Event{} - mi := &file_api_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Event) String() string { @@ -2720,7 +2826,7 @@ func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[36] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2765,7 +2871,10 @@ func (x *Event) GetExternal() bool { // A friend of a user. type Friend struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The user object. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // The friend status. @@ -2773,16 +2882,16 @@ type Friend struct { // Time of the latest relationship update. UpdateTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // Metadata. - Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` } func (x *Friend) Reset() { *x = Friend{} - mi := &file_api_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Friend) String() string { @@ -2793,7 +2902,7 @@ func (*Friend) ProtoMessage() {} func (x *Friend) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[37] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2838,20 +2947,23 @@ func (x *Friend) GetMetadata() string { // A collection of zero or more friends of the user. type FriendList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Friend objects. Friends []*Friend `protobuf:"bytes,1,rep,name=friends,proto3" json:"friends,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *FriendList) Reset() { *x = FriendList{} - mi := &file_api_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *FriendList) String() string { @@ -2862,7 +2974,7 @@ func (*FriendList) ProtoMessage() {} func (x *FriendList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[38] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2893,20 +3005,23 @@ func (x *FriendList) GetCursor() string { // A List of friends of friends type FriendsOfFriendsList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // User friends of friends. FriendsOfFriends []*FriendsOfFriendsList_FriendOfFriend `protobuf:"bytes,1,rep,name=friends_of_friends,json=friendsOfFriends,proto3" json:"friends_of_friends,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *FriendsOfFriendsList) Reset() { *x = FriendsOfFriendsList{} - mi := &file_api_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *FriendsOfFriendsList) String() string { @@ -2917,7 +3032,7 @@ func (*FriendsOfFriendsList) ProtoMessage() {} func (x *FriendsOfFriendsList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[39] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2948,22 +3063,25 @@ func (x *FriendsOfFriendsList) GetCursor() string { // Fetch a batch of zero or more users from the server. type GetUsersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` // The Facebook ID of a user. - FacebookIds []string `protobuf:"bytes,3,rep,name=facebook_ids,json=facebookIds,proto3" json:"facebook_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + FacebookIds []string `protobuf:"bytes,3,rep,name=facebook_ids,json=facebookIds,proto3" json:"facebook_ids,omitempty"` } func (x *GetUsersRequest) Reset() { *x = GetUsersRequest{} - mi := &file_api_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetUsersRequest) String() string { @@ -2974,7 +3092,7 @@ func (*GetUsersRequest) ProtoMessage() {} func (x *GetUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[40] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3012,18 +3130,21 @@ func (x *GetUsersRequest) GetFacebookIds() []string { // Fetch a subscription by product id. type GetSubscriptionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Product id of the subscription - ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Product id of the subscription + ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` } func (x *GetSubscriptionRequest) Reset() { *x = GetSubscriptionRequest{} - mi := &file_api_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetSubscriptionRequest) String() string { @@ -3034,7 +3155,7 @@ func (*GetSubscriptionRequest) ProtoMessage() {} func (x *GetSubscriptionRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[41] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3058,7 +3179,10 @@ func (x *GetSubscriptionRequest) GetProductId() string { // A group in the server. type Group struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The id of a group. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The id of the user who created the group. @@ -3082,16 +3206,16 @@ type Group struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` } func (x *Group) Reset() { *x = Group{} - mi := &file_api_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Group) String() string { @@ -3102,7 +3226,7 @@ func (*Group) ProtoMessage() {} func (x *Group) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[42] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3203,20 +3327,23 @@ func (x *Group) GetUpdateTime() *timestamppb.Timestamp { // One or more groups returned from a listing operation. type GroupList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // One or more groups. Groups []*Group `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` // A cursor used to get the next page. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *GroupList) Reset() { *x = GroupList{} - mi := &file_api_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GroupList) String() string { @@ -3227,7 +3354,7 @@ func (*GroupList) ProtoMessage() {} func (x *GroupList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[43] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3258,20 +3385,23 @@ func (x *GroupList) GetCursor() string { // A list of users belonging to a group, along with their role. type GroupUserList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // User-role pairs for a group. GroupUsers []*GroupUserList_GroupUser `protobuf:"bytes,1,rep,name=group_users,json=groupUsers,proto3" json:"group_users,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *GroupUserList) Reset() { *x = GroupUserList{} - mi := &file_api_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GroupUserList) String() string { @@ -3282,7 +3412,7 @@ func (*GroupUserList) ProtoMessage() {} func (x *GroupUserList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[44] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3313,20 +3443,23 @@ func (x *GroupUserList) GetCursor() string { // Import Facebook friends into the current user's account. type ImportFacebookFriendsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Reset the current user's friends list. - Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` } func (x *ImportFacebookFriendsRequest) Reset() { *x = ImportFacebookFriendsRequest{} - mi := &file_api_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ImportFacebookFriendsRequest) String() string { @@ -3337,7 +3470,7 @@ func (*ImportFacebookFriendsRequest) ProtoMessage() {} func (x *ImportFacebookFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[45] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3368,20 +3501,23 @@ func (x *ImportFacebookFriendsRequest) GetReset_() *wrapperspb.BoolValue { // Import Facebook friends into the current user's account. type ImportSteamFriendsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Facebook account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Reset the current user's friends list. - Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` } func (x *ImportSteamFriendsRequest) Reset() { *x = ImportSteamFriendsRequest{} - mi := &file_api_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ImportSteamFriendsRequest) String() string { @@ -3392,7 +3528,7 @@ func (*ImportSteamFriendsRequest) ProtoMessage() {} func (x *ImportSteamFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[46] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3423,18 +3559,21 @@ func (x *ImportSteamFriendsRequest) GetReset_() *wrapperspb.BoolValue { // Immediately join an open group, or request to join a closed one. type JoinGroupRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The group ID to join. The group must already exist. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The group ID to join. The group must already exist. + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` } func (x *JoinGroupRequest) Reset() { *x = JoinGroupRequest{} - mi := &file_api_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *JoinGroupRequest) String() string { @@ -3445,7 +3584,7 @@ func (*JoinGroupRequest) ProtoMessage() {} func (x *JoinGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[47] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3469,18 +3608,21 @@ func (x *JoinGroupRequest) GetGroupId() string { // The request to join a tournament. type JoinTournamentRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The ID of the tournament to join. The tournament must already exist. - TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ID of the tournament to join. The tournament must already exist. + TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` } func (x *JoinTournamentRequest) Reset() { *x = JoinTournamentRequest{} - mi := &file_api_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *JoinTournamentRequest) String() string { @@ -3491,7 +3633,7 @@ func (*JoinTournamentRequest) ProtoMessage() {} func (x *JoinTournamentRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[48] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3515,20 +3657,23 @@ func (x *JoinTournamentRequest) GetTournamentId() string { // Kick a set of users from a group. type KickGroupUsersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The group ID to kick from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to kick. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` } func (x *KickGroupUsersRequest) Reset() { *x = KickGroupUsersRequest{} - mi := &file_api_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KickGroupUsersRequest) String() string { @@ -3539,7 +3684,7 @@ func (*KickGroupUsersRequest) ProtoMessage() {} func (x *KickGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[49] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3570,7 +3715,10 @@ func (x *KickGroupUsersRequest) GetUserIds() []string { // A leaderboard on the server. type Leaderboard struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the leaderboard. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // ASC(0) or DESC(1) sort mode of scores in the leaderboard. @@ -3587,15 +3735,15 @@ type Leaderboard struct { CreateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // Whether the leaderboard was created authoritatively or not. Authoritative bool `protobuf:"varint,8,opt,name=authoritative,proto3" json:"authoritative,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *Leaderboard) Reset() { *x = Leaderboard{} - mi := &file_api_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Leaderboard) String() string { @@ -3606,7 +3754,7 @@ func (*Leaderboard) ProtoMessage() {} func (x *Leaderboard) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[50] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3679,20 +3827,23 @@ func (x *Leaderboard) GetAuthoritative() bool { // A list of leaderboards type LeaderboardList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The list of leaderboards returned. Leaderboards []*Leaderboard `protobuf:"bytes,1,rep,name=leaderboards,proto3" json:"leaderboards,omitempty"` // A pagination cursor (optional). - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *LeaderboardList) Reset() { *x = LeaderboardList{} - mi := &file_api_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *LeaderboardList) String() string { @@ -3703,7 +3854,7 @@ func (*LeaderboardList) ProtoMessage() {} func (x *LeaderboardList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[51] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3734,7 +3885,10 @@ func (x *LeaderboardList) GetCursor() string { // Represents a complete leaderboard record with all scores and associated metadata. type LeaderboardRecord struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the leaderboard this score belongs to. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // The ID of the score owner, usually a user or group. @@ -3758,16 +3912,16 @@ type LeaderboardRecord struct { // The rank of this record. Rank int64 `protobuf:"varint,11,opt,name=rank,proto3" json:"rank,omitempty"` // The maximum number of score updates allowed by the owner. - MaxNumScore uint32 `protobuf:"varint,12,opt,name=max_num_score,json=maxNumScore,proto3" json:"max_num_score,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + MaxNumScore uint32 `protobuf:"varint,12,opt,name=max_num_score,json=maxNumScore,proto3" json:"max_num_score,omitempty"` } func (x *LeaderboardRecord) Reset() { *x = LeaderboardRecord{} - mi := &file_api_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *LeaderboardRecord) String() string { @@ -3778,7 +3932,7 @@ func (*LeaderboardRecord) ProtoMessage() {} func (x *LeaderboardRecord) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[52] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3879,7 +4033,10 @@ func (x *LeaderboardRecord) GetMaxNumScore() uint32 { // A set of leaderboard records, may be part of a leaderboard records page or a batch of individual records. type LeaderboardRecordList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // A list of leaderboard records. Records []*LeaderboardRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` // A batched set of leaderboard records belonging to specified owners. @@ -3889,16 +4046,16 @@ type LeaderboardRecordList struct { // The cursor to send when retrieving the previous page, if any. PrevCursor string `protobuf:"bytes,4,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // The total number of ranks available. - RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` } func (x *LeaderboardRecordList) Reset() { *x = LeaderboardRecordList{} - mi := &file_api_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *LeaderboardRecordList) String() string { @@ -3909,7 +4066,7 @@ func (*LeaderboardRecordList) ProtoMessage() {} func (x *LeaderboardRecordList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[53] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3961,18 +4118,21 @@ func (x *LeaderboardRecordList) GetRankCount() int64 { // Leave a group. type LeaveGroupRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The group ID to leave. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The group ID to leave. + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` } func (x *LeaveGroupRequest) Reset() { *x = LeaveGroupRequest{} - mi := &file_api_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *LeaveGroupRequest) String() string { @@ -3983,7 +4143,7 @@ func (*LeaveGroupRequest) ProtoMessage() {} func (x *LeaveGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[54] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4007,20 +4167,23 @@ func (x *LeaveGroupRequest) GetGroupId() string { // Link Facebook to the current user's account. type LinkFacebookRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Import Facebook friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` } func (x *LinkFacebookRequest) Reset() { *x = LinkFacebookRequest{} - mi := &file_api_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *LinkFacebookRequest) String() string { @@ -4031,7 +4194,7 @@ func (*LinkFacebookRequest) ProtoMessage() {} func (x *LinkFacebookRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[55] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4062,20 +4225,23 @@ func (x *LinkFacebookRequest) GetSync() *wrapperspb.BoolValue { // Link Steam to the current user's account. type LinkSteamRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The Facebook account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Import Steam friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` } func (x *LinkSteamRequest) Reset() { *x = LinkSteamRequest{} - mi := &file_api_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *LinkSteamRequest) String() string { @@ -4086,7 +4252,7 @@ func (*LinkSteamRequest) ProtoMessage() {} func (x *LinkSteamRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[56] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4117,7 +4283,10 @@ func (x *LinkSteamRequest) GetSync() *wrapperspb.BoolValue { // List a channel's message history. type ListChannelMessagesRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The channel ID to list from. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4125,16 +4294,16 @@ type ListChannelMessagesRequest struct { // True if listing should be older messages to newer, false if reverse. Forward *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=forward,proto3" json:"forward,omitempty"` // A pagination cursor, if any. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListChannelMessagesRequest) Reset() { *x = ListChannelMessagesRequest{} - mi := &file_api_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListChannelMessagesRequest) String() string { @@ -4145,7 +4314,7 @@ func (*ListChannelMessagesRequest) ProtoMessage() {} func (x *ListChannelMessagesRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[57] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4190,22 +4359,25 @@ func (x *ListChannelMessagesRequest) GetCursor() string { // List friends for a user. type ListFriendsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // The friend state to list. State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListFriendsRequest) Reset() { *x = ListFriendsRequest{} - mi := &file_api_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListFriendsRequest) String() string { @@ -4216,7 +4388,7 @@ func (*ListFriendsRequest) ProtoMessage() {} func (x *ListFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[58] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4253,20 +4425,23 @@ func (x *ListFriendsRequest) GetCursor() string { } type ListFriendsOfFriendsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListFriendsOfFriendsRequest) Reset() { *x = ListFriendsOfFriendsRequest{} - mi := &file_api_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListFriendsOfFriendsRequest) String() string { @@ -4277,7 +4452,7 @@ func (*ListFriendsOfFriendsRequest) ProtoMessage() {} func (x *ListFriendsOfFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[59] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4308,7 +4483,10 @@ func (x *ListFriendsOfFriendsRequest) GetCursor() string { // List groups based on given filters. type ListGroupsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // List groups that contain this value in their names. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Optional pagination cursor. @@ -4320,16 +4498,16 @@ type ListGroupsRequest struct { // Number of group members Members *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=members,proto3" json:"members,omitempty"` // Optional Open/Closed filter. - Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` } func (x *ListGroupsRequest) Reset() { *x = ListGroupsRequest{} - mi := &file_api_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListGroupsRequest) String() string { @@ -4340,7 +4518,7 @@ func (*ListGroupsRequest) ProtoMessage() {} func (x *ListGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[60] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4399,7 +4577,10 @@ func (x *ListGroupsRequest) GetOpen() *wrapperspb.BoolValue { // List all users that are part of a group. type ListGroupUsersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The group ID to list from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4407,16 +4588,16 @@ type ListGroupUsersRequest struct { // The group user state to list. State *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListGroupUsersRequest) Reset() { *x = ListGroupUsersRequest{} - mi := &file_api_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListGroupUsersRequest) String() string { @@ -4427,7 +4608,7 @@ func (*ListGroupUsersRequest) ProtoMessage() {} func (x *ListGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[61] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4472,7 +4653,10 @@ func (x *ListGroupUsersRequest) GetCursor() string { // List leaerboard records from a given leaderboard around the owner. type ListLeaderboardRecordsAroundOwnerRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the tournament to list for. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4482,16 +4666,16 @@ type ListLeaderboardRecordsAroundOwnerRequest struct { // Expiry in seconds (since epoch) to begin fetching records from. Expiry *wrapperspb.Int64Value `protobuf:"bytes,4,opt,name=expiry,proto3" json:"expiry,omitempty"` // A next or previous page cursor. - Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListLeaderboardRecordsAroundOwnerRequest) Reset() { *x = ListLeaderboardRecordsAroundOwnerRequest{} - mi := &file_api_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListLeaderboardRecordsAroundOwnerRequest) String() string { @@ -4502,7 +4686,7 @@ func (*ListLeaderboardRecordsAroundOwnerRequest) ProtoMessage() {} func (x *ListLeaderboardRecordsAroundOwnerRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[62] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4554,7 +4738,10 @@ func (x *ListLeaderboardRecordsAroundOwnerRequest) GetCursor() string { // List leaderboard records from a given leaderboard. type ListLeaderboardRecordsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the leaderboard to list for. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // One or more owners to retrieve records for. @@ -4564,16 +4751,16 @@ type ListLeaderboardRecordsRequest struct { // A next or previous page cursor. Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // Expiry in seconds (since epoch) to begin fetching records from. Optional. 0 means from current time. - Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` } func (x *ListLeaderboardRecordsRequest) Reset() { *x = ListLeaderboardRecordsRequest{} - mi := &file_api_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListLeaderboardRecordsRequest) String() string { @@ -4584,7 +4771,7 @@ func (*ListLeaderboardRecordsRequest) ProtoMessage() {} func (x *ListLeaderboardRecordsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[63] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4636,7 +4823,10 @@ func (x *ListLeaderboardRecordsRequest) GetExpiry() *wrapperspb.Int64Value { // List realtime matches. type ListMatchesRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Limit the number of returned matches. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // Authoritative or relayed matches. @@ -4648,16 +4838,16 @@ type ListMatchesRequest struct { // Maximum user count. MaxSize *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` // Arbitrary label query. - Query *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=query,proto3" json:"query,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Query *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=query,proto3" json:"query,omitempty"` } func (x *ListMatchesRequest) Reset() { *x = ListMatchesRequest{} - mi := &file_api_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListMatchesRequest) String() string { @@ -4668,7 +4858,7 @@ func (*ListMatchesRequest) ProtoMessage() {} func (x *ListMatchesRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[64] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4727,20 +4917,23 @@ func (x *ListMatchesRequest) GetQuery() *wrapperspb.StringValue { // Get a list of unexpired notifications. type ListNotificationsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The number of notifications to get. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // A cursor to page through notifications. May be cached by clients to get from point in time forwards. CacheableCursor string `protobuf:"bytes,2,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` // value from NotificationList.cacheable_cursor. - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *ListNotificationsRequest) Reset() { *x = ListNotificationsRequest{} - mi := &file_api_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListNotificationsRequest) String() string { @@ -4751,7 +4944,7 @@ func (*ListNotificationsRequest) ProtoMessage() {} func (x *ListNotificationsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[65] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4782,7 +4975,10 @@ func (x *ListNotificationsRequest) GetCacheableCursor() string { // List publicly readable storage objects in a given collection. type ListStorageObjectsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // ID of the user. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // The collection which stores the object. @@ -4790,16 +4986,16 @@ type ListStorageObjectsRequest struct { // The number of storage objects to list. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=limit,proto3" json:"limit,omitempty"` // The cursor to page through results from. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // value from StorageObjectList.cursor. - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // value from StorageObjectList.cursor. } func (x *ListStorageObjectsRequest) Reset() { *x = ListStorageObjectsRequest{} - mi := &file_api_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListStorageObjectsRequest) String() string { @@ -4810,7 +5006,7 @@ func (*ListStorageObjectsRequest) ProtoMessage() {} func (x *ListStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[66] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4855,20 +5051,23 @@ func (x *ListStorageObjectsRequest) GetCursor() string { // List user subscriptions. type ListSubscriptionsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Max number of results per page Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // Cursor to retrieve a page of records from - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListSubscriptionsRequest) Reset() { *x = ListSubscriptionsRequest{} - mi := &file_api_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListSubscriptionsRequest) String() string { @@ -4879,7 +5078,7 @@ func (*ListSubscriptionsRequest) ProtoMessage() {} func (x *ListSubscriptionsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[67] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4910,7 +5109,10 @@ func (x *ListSubscriptionsRequest) GetCursor() string { // List tournament records from a given tournament around the owner. type ListTournamentRecordsAroundOwnerRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the tournament to list for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4920,16 +5122,16 @@ type ListTournamentRecordsAroundOwnerRequest struct { // Expiry in seconds (since epoch) to begin fetching records from. Expiry *wrapperspb.Int64Value `protobuf:"bytes,4,opt,name=expiry,proto3" json:"expiry,omitempty"` // A next or previous page cursor. - Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListTournamentRecordsAroundOwnerRequest) Reset() { *x = ListTournamentRecordsAroundOwnerRequest{} - mi := &file_api_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListTournamentRecordsAroundOwnerRequest) String() string { @@ -4940,7 +5142,7 @@ func (*ListTournamentRecordsAroundOwnerRequest) ProtoMessage() {} func (x *ListTournamentRecordsAroundOwnerRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[68] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4992,7 +5194,10 @@ func (x *ListTournamentRecordsAroundOwnerRequest) GetCursor() string { // List tournament records from a given tournament. type ListTournamentRecordsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the tournament to list for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // One or more owners to retrieve records for. @@ -5002,16 +5207,16 @@ type ListTournamentRecordsRequest struct { // A next or previous page cursor. Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // Expiry in seconds (since epoch) to begin fetching records from. - Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` } func (x *ListTournamentRecordsRequest) Reset() { *x = ListTournamentRecordsRequest{} - mi := &file_api_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListTournamentRecordsRequest) String() string { @@ -5022,7 +5227,7 @@ func (*ListTournamentRecordsRequest) ProtoMessage() {} func (x *ListTournamentRecordsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[69] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5074,7 +5279,10 @@ func (x *ListTournamentRecordsRequest) GetExpiry() *wrapperspb.Int64Value { // List active/upcoming tournaments based on given filters. type ListTournamentsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The start of the categories to include. Defaults to 0. CategoryStart *wrapperspb.UInt32Value `protobuf:"bytes,1,opt,name=category_start,json=categoryStart,proto3" json:"category_start,omitempty"` // The end of the categories to include. Defaults to 128. @@ -5086,16 +5294,16 @@ type ListTournamentsRequest struct { // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=limit,proto3" json:"limit,omitempty"` // A next page cursor for listings (optional). - Cursor string `protobuf:"bytes,8,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,8,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListTournamentsRequest) Reset() { *x = ListTournamentsRequest{} - mi := &file_api_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListTournamentsRequest) String() string { @@ -5106,7 +5314,7 @@ func (*ListTournamentsRequest) ProtoMessage() {} func (x *ListTournamentsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[70] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5165,7 +5373,10 @@ func (x *ListTournamentsRequest) GetCursor() string { // List the groups a user is part of, and their relationship to each. type ListUserGroupsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // ID of the user. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -5173,16 +5384,16 @@ type ListUserGroupsRequest struct { // The user group state to list. State *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *ListUserGroupsRequest) Reset() { *x = ListUserGroupsRequest{} - mi := &file_api_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ListUserGroupsRequest) String() string { @@ -5193,7 +5404,7 @@ func (*ListUserGroupsRequest) ProtoMessage() {} func (x *ListUserGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[71] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5238,7 +5449,10 @@ func (x *ListUserGroupsRequest) GetCursor() string { // Represents a realtime match. type Match struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the match, can be used to join. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // True if it's an server-managed authoritative match, false otherwise. @@ -5250,16 +5464,16 @@ type Match struct { // Tick Rate TickRate int32 `protobuf:"varint,5,opt,name=tick_rate,json=tickRate,proto3" json:"tick_rate,omitempty"` // Handler name - HandlerName string `protobuf:"bytes,6,opt,name=handler_name,json=handlerName,proto3" json:"handler_name,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + HandlerName string `protobuf:"bytes,6,opt,name=handler_name,json=handlerName,proto3" json:"handler_name,omitempty"` } func (x *Match) Reset() { *x = Match{} - mi := &file_api_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Match) String() string { @@ -5270,7 +5484,7 @@ func (*Match) ProtoMessage() {} func (x *Match) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[72] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5329,18 +5543,21 @@ func (x *Match) GetHandlerName() string { // A list of realtime matches. type MatchList struct { - state protoimpl.MessageState `protogen:"open.v1"` - // A number of matches corresponding to a list operation. - Matches []*Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A number of matches corresponding to a list operation. + Matches []*Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` } func (x *MatchList) Reset() { *x = MatchList{} - mi := &file_api_proto_msgTypes[73] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchList) String() string { @@ -5351,7 +5568,7 @@ func (*MatchList) ProtoMessage() {} func (x *MatchList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[73] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5375,18 +5592,21 @@ func (x *MatchList) GetMatches() []*Match { // Matchmaker ticket completion stats type MatchmakerCompletionStats struct { - state protoimpl.MessageState `protogen:"open.v1"` - CreateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - CompleteTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=complete_time,json=completeTime,proto3" json:"complete_time,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CreateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + CompleteTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=complete_time,json=completeTime,proto3" json:"complete_time,omitempty"` } func (x *MatchmakerCompletionStats) Reset() { *x = MatchmakerCompletionStats{} - mi := &file_api_proto_msgTypes[74] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchmakerCompletionStats) String() string { @@ -5397,7 +5617,7 @@ func (*MatchmakerCompletionStats) ProtoMessage() {} func (x *MatchmakerCompletionStats) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[74] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5428,19 +5648,22 @@ func (x *MatchmakerCompletionStats) GetCompleteTime() *timestamppb.Timestamp { // Matchmaker stats type MatchmakerStats struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + TicketCount int32 `protobuf:"varint,1,opt,name=ticket_count,json=ticketCount,proto3" json:"ticket_count,omitempty"` OldestTicketCreateTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=oldest_ticket_create_time,json=oldestTicketCreateTime,proto3" json:"oldest_ticket_create_time,omitempty"` Completions []*MatchmakerCompletionStats `protobuf:"bytes,3,rep,name=completions,proto3" json:"completions,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *MatchmakerStats) Reset() { *x = MatchmakerStats{} - mi := &file_api_proto_msgTypes[75] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchmakerStats) String() string { @@ -5451,7 +5674,7 @@ func (*MatchmakerStats) ProtoMessage() {} func (x *MatchmakerStats) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[75] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5489,7 +5712,10 @@ func (x *MatchmakerStats) GetCompletions() []*MatchmakerCompletionStats { // A notification in the server. type Notification struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // ID of the Notification. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Subject of the notification. @@ -5503,16 +5729,16 @@ type Notification struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the notification was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // True if this notification was persisted to the database. - Persistent bool `protobuf:"varint,7,opt,name=persistent,proto3" json:"persistent,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Persistent bool `protobuf:"varint,7,opt,name=persistent,proto3" json:"persistent,omitempty"` } func (x *Notification) Reset() { *x = Notification{} - mi := &file_api_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Notification) String() string { @@ -5523,7 +5749,7 @@ func (*Notification) ProtoMessage() {} func (x *Notification) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[76] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5589,20 +5815,23 @@ func (x *Notification) GetPersistent() bool { // A collection of zero or more notifications. type NotificationList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Collection of notifications. Notifications []*Notification `protobuf:"bytes,1,rep,name=notifications,proto3" json:"notifications,omitempty"` // Use this cursor to paginate notifications. Cache this to catch up to new notifications. CacheableCursor string `protobuf:"bytes,2,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *NotificationList) Reset() { *x = NotificationList{} - mi := &file_api_proto_msgTypes[77] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *NotificationList) String() string { @@ -5613,7 +5842,7 @@ func (*NotificationList) ProtoMessage() {} func (x *NotificationList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[77] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5644,20 +5873,23 @@ func (x *NotificationList) GetCacheableCursor() string { // Promote a set of users in a group to the next role up. type PromoteGroupUsersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The group ID to promote in. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to promote. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` } func (x *PromoteGroupUsersRequest) Reset() { *x = PromoteGroupUsersRequest{} - mi := &file_api_proto_msgTypes[78] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PromoteGroupUsersRequest) String() string { @@ -5668,7 +5900,7 @@ func (*PromoteGroupUsersRequest) ProtoMessage() {} func (x *PromoteGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[78] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5699,20 +5931,23 @@ func (x *PromoteGroupUsersRequest) GetUserIds() []string { // Demote a set of users in a group to the next role down. type DemoteGroupUsersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The group ID to demote in. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to demote. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` } func (x *DemoteGroupUsersRequest) Reset() { *x = DemoteGroupUsersRequest{} - mi := &file_api_proto_msgTypes[79] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DemoteGroupUsersRequest) String() string { @@ -5723,7 +5958,7 @@ func (*DemoteGroupUsersRequest) ProtoMessage() {} func (x *DemoteGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[79] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5754,22 +5989,25 @@ func (x *DemoteGroupUsersRequest) GetUserIds() []string { // Storage objects to get. type ReadStorageObjectId struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // The user owner of the object. - UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` } func (x *ReadStorageObjectId) Reset() { *x = ReadStorageObjectId{} - mi := &file_api_proto_msgTypes[80] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ReadStorageObjectId) String() string { @@ -5780,7 +6018,7 @@ func (*ReadStorageObjectId) ProtoMessage() {} func (x *ReadStorageObjectId) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[80] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5818,18 +6056,21 @@ func (x *ReadStorageObjectId) GetUserId() string { // Batch get storage objects. type ReadStorageObjectsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Batch of storage objects. - ObjectIds []*ReadStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Batch of storage objects. + ObjectIds []*ReadStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` } func (x *ReadStorageObjectsRequest) Reset() { *x = ReadStorageObjectsRequest{} - mi := &file_api_proto_msgTypes[81] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ReadStorageObjectsRequest) String() string { @@ -5840,7 +6081,7 @@ func (*ReadStorageObjectsRequest) ProtoMessage() {} func (x *ReadStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[81] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5864,22 +6105,25 @@ func (x *ReadStorageObjectsRequest) GetObjectIds() []*ReadStorageObjectId { // Execute an Lua function on the server. type Rpc struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The identifier of the function. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The payload of the function which must be a JSON object. Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` // The authentication key used when executed as a non-client HTTP request. - HttpKey string `protobuf:"bytes,3,opt,name=http_key,json=httpKey,proto3" json:"http_key,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + HttpKey string `protobuf:"bytes,3,opt,name=http_key,json=httpKey,proto3" json:"http_key,omitempty"` } func (x *Rpc) Reset() { *x = Rpc{} - mi := &file_api_proto_msgTypes[82] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Rpc) String() string { @@ -5890,7 +6134,7 @@ func (*Rpc) ProtoMessage() {} func (x *Rpc) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[82] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5928,22 +6172,25 @@ func (x *Rpc) GetHttpKey() string { // A user's session used to authenticate messages. type Session struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // True if the corresponding account was just created, false otherwise. Created bool `protobuf:"varint,1,opt,name=created,proto3" json:"created,omitempty"` // Authentication credentials. Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` // Refresh token that can be used for session token renewal. - RefreshToken string `protobuf:"bytes,3,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + RefreshToken string `protobuf:"bytes,3,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` } func (x *Session) Reset() { *x = Session{} - mi := &file_api_proto_msgTypes[83] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Session) String() string { @@ -5954,7 +6201,7 @@ func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[83] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5992,7 +6239,10 @@ func (x *Session) GetRefreshToken() string { // An object within the storage engine. type StorageObject struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. @@ -6010,16 +6260,16 @@ type StorageObject struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` } func (x *StorageObject) Reset() { *x = StorageObject{} - mi := &file_api_proto_msgTypes[84] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StorageObject) String() string { @@ -6030,7 +6280,7 @@ func (*StorageObject) ProtoMessage() {} func (x *StorageObject) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[84] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6110,7 +6360,10 @@ func (x *StorageObject) GetUpdateTime() *timestamppb.Timestamp { // A storage acknowledgement. type StorageObjectAck struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. @@ -6122,16 +6375,16 @@ type StorageObjectAck struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` } func (x *StorageObjectAck) Reset() { *x = StorageObjectAck{} - mi := &file_api_proto_msgTypes[85] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[85] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StorageObjectAck) String() string { @@ -6142,7 +6395,7 @@ func (*StorageObjectAck) ProtoMessage() {} func (x *StorageObjectAck) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[85] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6201,18 +6454,21 @@ func (x *StorageObjectAck) GetUpdateTime() *timestamppb.Timestamp { // Batch of acknowledgements for the storage object write. type StorageObjectAcks struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Batch of storage write acknowledgements. - Acks []*StorageObjectAck `protobuf:"bytes,1,rep,name=acks,proto3" json:"acks,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Batch of storage write acknowledgements. + Acks []*StorageObjectAck `protobuf:"bytes,1,rep,name=acks,proto3" json:"acks,omitempty"` } func (x *StorageObjectAcks) Reset() { *x = StorageObjectAcks{} - mi := &file_api_proto_msgTypes[86] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StorageObjectAcks) String() string { @@ -6223,7 +6479,7 @@ func (*StorageObjectAcks) ProtoMessage() {} func (x *StorageObjectAcks) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[86] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6247,18 +6503,21 @@ func (x *StorageObjectAcks) GetAcks() []*StorageObjectAck { // Batch of storage objects. type StorageObjects struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The batch of storage objects. - Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The batch of storage objects. + Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` } func (x *StorageObjects) Reset() { *x = StorageObjects{} - mi := &file_api_proto_msgTypes[87] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StorageObjects) String() string { @@ -6269,7 +6528,7 @@ func (*StorageObjects) ProtoMessage() {} func (x *StorageObjects) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[87] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6293,20 +6552,23 @@ func (x *StorageObjects) GetObjects() []*StorageObject { // List of storage objects. type StorageObjectList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The list of storage objects. Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` // The cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *StorageObjectList) Reset() { *x = StorageObjectList{} - mi := &file_api_proto_msgTypes[88] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StorageObjectList) String() string { @@ -6317,7 +6579,7 @@ func (*StorageObjectList) ProtoMessage() {} func (x *StorageObjectList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[88] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6348,7 +6610,10 @@ func (x *StorageObjectList) GetCursor() string { // A tournament on the server. type Tournament struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the tournament. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The title for the tournament. @@ -6389,15 +6654,15 @@ type Tournament struct { Operator Operator `protobuf:"varint,19,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` // Whether the leaderboard was created authoritatively or not. Authoritative bool `protobuf:"varint,20,opt,name=authoritative,proto3" json:"authoritative,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *Tournament) Reset() { *x = Tournament{} - mi := &file_api_proto_msgTypes[89] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Tournament) String() string { @@ -6408,7 +6673,7 @@ func (*Tournament) ProtoMessage() {} func (x *Tournament) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[89] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6565,20 +6830,23 @@ func (x *Tournament) GetAuthoritative() bool { // A list of tournaments. type TournamentList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The list of tournaments returned. Tournaments []*Tournament `protobuf:"bytes,1,rep,name=tournaments,proto3" json:"tournaments,omitempty"` // A pagination cursor (optional). - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *TournamentList) Reset() { *x = TournamentList{} - mi := &file_api_proto_msgTypes[90] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[90] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *TournamentList) String() string { @@ -6589,7 +6857,7 @@ func (*TournamentList) ProtoMessage() {} func (x *TournamentList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[90] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6620,7 +6888,10 @@ func (x *TournamentList) GetCursor() string { // A set of tournament records which may be part of a tournament records page or a batch of individual records. type TournamentRecordList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // A list of tournament records. Records []*LeaderboardRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` // A batched set of tournament records belonging to specified owners. @@ -6630,16 +6901,16 @@ type TournamentRecordList struct { // The cursor to send when retrieving the previous page (optional). PrevCursor string `protobuf:"bytes,4,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // The total number of ranks available. - RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` } func (x *TournamentRecordList) Reset() { *x = TournamentRecordList{} - mi := &file_api_proto_msgTypes[91] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[91] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *TournamentRecordList) String() string { @@ -6650,7 +6921,7 @@ func (*TournamentRecordList) ProtoMessage() {} func (x *TournamentRecordList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[91] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6702,7 +6973,10 @@ func (x *TournamentRecordList) GetRankCount() int64 { // Update a user's account details. type UpdateAccountRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The username of the user's account. Username *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // The display name of the user. @@ -6714,16 +6988,16 @@ type UpdateAccountRequest struct { // The location set by the user. Location *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=location,proto3" json:"location,omitempty"` // The timezone set by the user. - Timezone *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=timezone,proto3" json:"timezone,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Timezone *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=timezone,proto3" json:"timezone,omitempty"` } func (x *UpdateAccountRequest) Reset() { *x = UpdateAccountRequest{} - mi := &file_api_proto_msgTypes[92] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *UpdateAccountRequest) String() string { @@ -6734,7 +7008,7 @@ func (*UpdateAccountRequest) ProtoMessage() {} func (x *UpdateAccountRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[92] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6793,7 +7067,10 @@ func (x *UpdateAccountRequest) GetTimezone() *wrapperspb.StringValue { // Update fields in a given group. type UpdateGroupRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the group to update. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // Name. @@ -6805,16 +7082,16 @@ type UpdateGroupRequest struct { // Avatar URL. AvatarUrl *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // Open is true if anyone should be allowed to join, or false if joins must be approved by a group admin. - Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` } func (x *UpdateGroupRequest) Reset() { *x = UpdateGroupRequest{} - mi := &file_api_proto_msgTypes[93] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *UpdateGroupRequest) String() string { @@ -6825,7 +7102,7 @@ func (*UpdateGroupRequest) ProtoMessage() {} func (x *UpdateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[93] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6884,7 +7161,10 @@ func (x *UpdateGroupRequest) GetOpen() *wrapperspb.BoolValue { // A user in the server. type User struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The id of the user's account. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The username of the user's account. @@ -6920,16 +7200,16 @@ type User struct { // The Facebook Instant Game ID in the user's account. FacebookInstantGameId string `protobuf:"bytes,17,opt,name=facebook_instant_game_id,json=facebookInstantGameId,proto3" json:"facebook_instant_game_id,omitempty"` // The Apple Sign In ID in the user's account. - AppleId string `protobuf:"bytes,18,opt,name=apple_id,json=appleId,proto3" json:"apple_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + AppleId string `protobuf:"bytes,18,opt,name=apple_id,json=appleId,proto3" json:"apple_id,omitempty"` } func (x *User) Reset() { *x = User{} - mi := &file_api_proto_msgTypes[94] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[94] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *User) String() string { @@ -6940,7 +7220,7 @@ func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[94] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7083,20 +7363,23 @@ func (x *User) GetAppleId() string { // A list of groups belonging to a user, along with the user's role in each group. type UserGroupList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Group-role pairs for a user. UserGroups []*UserGroupList_UserGroup `protobuf:"bytes,1,rep,name=user_groups,json=userGroups,proto3" json:"user_groups,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` } func (x *UserGroupList) Reset() { *x = UserGroupList{} - mi := &file_api_proto_msgTypes[95] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[95] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *UserGroupList) String() string { @@ -7107,7 +7390,7 @@ func (*UserGroupList) ProtoMessage() {} func (x *UserGroupList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[95] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7138,18 +7421,21 @@ func (x *UserGroupList) GetCursor() string { // A collection of zero or more users. type Users struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The User objects. - Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The User objects. + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` } func (x *Users) Reset() { *x = Users{} - mi := &file_api_proto_msgTypes[96] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[96] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Users) String() string { @@ -7160,7 +7446,7 @@ func (*Users) ProtoMessage() {} func (x *Users) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[96] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7184,20 +7470,23 @@ func (x *Users) GetUsers() []*User { // Apple IAP Purchases validation request type ValidatePurchaseAppleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Base64 encoded Apple receipt data payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` } func (x *ValidatePurchaseAppleRequest) Reset() { *x = ValidatePurchaseAppleRequest{} - mi := &file_api_proto_msgTypes[97] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[97] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidatePurchaseAppleRequest) String() string { @@ -7208,7 +7497,7 @@ func (*ValidatePurchaseAppleRequest) ProtoMessage() {} func (x *ValidatePurchaseAppleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[97] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7239,20 +7528,23 @@ func (x *ValidatePurchaseAppleRequest) GetPersist() *wrapperspb.BoolValue { // Apple Subscription validation request type ValidateSubscriptionAppleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Base64 encoded Apple receipt data payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the subscription. - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` } func (x *ValidateSubscriptionAppleRequest) Reset() { *x = ValidateSubscriptionAppleRequest{} - mi := &file_api_proto_msgTypes[98] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidateSubscriptionAppleRequest) String() string { @@ -7263,7 +7555,7 @@ func (*ValidateSubscriptionAppleRequest) ProtoMessage() {} func (x *ValidateSubscriptionAppleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[98] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7294,20 +7586,23 @@ func (x *ValidateSubscriptionAppleRequest) GetPersist() *wrapperspb.BoolValue { // Google IAP Purchase validation request type ValidatePurchaseGoogleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // JSON encoded Google purchase payload. Purchase string `protobuf:"bytes,1,opt,name=purchase,proto3" json:"purchase,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` } func (x *ValidatePurchaseGoogleRequest) Reset() { *x = ValidatePurchaseGoogleRequest{} - mi := &file_api_proto_msgTypes[99] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[99] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidatePurchaseGoogleRequest) String() string { @@ -7318,7 +7613,7 @@ func (*ValidatePurchaseGoogleRequest) ProtoMessage() {} func (x *ValidatePurchaseGoogleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[99] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7349,20 +7644,23 @@ func (x *ValidatePurchaseGoogleRequest) GetPersist() *wrapperspb.BoolValue { // Google Subscription validation request type ValidateSubscriptionGoogleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // JSON encoded Google purchase payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the subscription. - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` } func (x *ValidateSubscriptionGoogleRequest) Reset() { *x = ValidateSubscriptionGoogleRequest{} - mi := &file_api_proto_msgTypes[100] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidateSubscriptionGoogleRequest) String() string { @@ -7373,7 +7671,7 @@ func (*ValidateSubscriptionGoogleRequest) ProtoMessage() {} func (x *ValidateSubscriptionGoogleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[100] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7404,22 +7702,25 @@ func (x *ValidateSubscriptionGoogleRequest) GetPersist() *wrapperspb.BoolValue { // Huawei IAP Purchase validation request type ValidatePurchaseHuaweiRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // JSON encoded Huawei InAppPurchaseData. Purchase string `protobuf:"bytes,1,opt,name=purchase,proto3" json:"purchase,omitempty"` // InAppPurchaseData signature. Signature string `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` } func (x *ValidatePurchaseHuaweiRequest) Reset() { *x = ValidatePurchaseHuaweiRequest{} - mi := &file_api_proto_msgTypes[101] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidatePurchaseHuaweiRequest) String() string { @@ -7430,7 +7731,7 @@ func (*ValidatePurchaseHuaweiRequest) ProtoMessage() {} func (x *ValidatePurchaseHuaweiRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[101] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7468,20 +7769,23 @@ func (x *ValidatePurchaseHuaweiRequest) GetPersist() *wrapperspb.BoolValue { // Facebook Instant IAP Purchase validation request type ValidatePurchaseFacebookInstantRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Base64 encoded Facebook Instant signedRequest receipt data payload. SignedRequest string `protobuf:"bytes,1,opt,name=signed_request,json=signedRequest,proto3" json:"signed_request,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` } func (x *ValidatePurchaseFacebookInstantRequest) Reset() { *x = ValidatePurchaseFacebookInstantRequest{} - mi := &file_api_proto_msgTypes[102] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidatePurchaseFacebookInstantRequest) String() string { @@ -7492,7 +7796,7 @@ func (*ValidatePurchaseFacebookInstantRequest) ProtoMessage() {} func (x *ValidatePurchaseFacebookInstantRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[102] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7521,62 +7825,12 @@ func (x *ValidatePurchaseFacebookInstantRequest) GetPersist() *wrapperspb.BoolVa return nil } -// Xbox Purchase validation request -type ValidatePurchaseXboxRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ProductId string `protobuf:"bytes,1,opt,name=productId,proto3" json:"productId,omitempty"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ValidatePurchaseXboxRequest) Reset() { - *x = ValidatePurchaseXboxRequest{} - mi := &file_api_proto_msgTypes[103] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ValidatePurchaseXboxRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidatePurchaseXboxRequest) ProtoMessage() {} - -func (x *ValidatePurchaseXboxRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[103] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidatePurchaseXboxRequest.ProtoReflect.Descriptor instead. -func (*ValidatePurchaseXboxRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{103} -} - -func (x *ValidatePurchaseXboxRequest) GetProductId() string { - if x != nil { - return x.ProductId - } - return "" -} - -func (x *ValidatePurchaseXboxRequest) GetPersist() *wrapperspb.BoolValue { - if x != nil { - return x.Persist - } - return nil -} - // Validated Purchase stored by Nakama. type ValidatedPurchase struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Purchase User ID. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Purchase Product ID. @@ -7598,16 +7852,16 @@ type ValidatedPurchase struct { // Whether the purchase was done in production or sandbox environment. Environment StoreEnvironment `protobuf:"varint,10,opt,name=environment,proto3,enum=nakama.api.StoreEnvironment" json:"environment,omitempty"` // Whether the purchase had already been validated by Nakama before. - SeenBefore bool `protobuf:"varint,11,opt,name=seen_before,json=seenBefore,proto3" json:"seen_before,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + SeenBefore bool `protobuf:"varint,11,opt,name=seen_before,json=seenBefore,proto3" json:"seen_before,omitempty"` } func (x *ValidatedPurchase) Reset() { *x = ValidatedPurchase{} - mi := &file_api_proto_msgTypes[104] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidatedPurchase) String() string { @@ -7617,8 +7871,8 @@ func (x *ValidatedPurchase) String() string { func (*ValidatedPurchase) ProtoMessage() {} func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[104] - if x != nil { + mi := &file_api_proto_msgTypes[103] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7630,7 +7884,7 @@ func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedPurchase.ProtoReflect.Descriptor instead. func (*ValidatedPurchase) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{104} + return file_api_proto_rawDescGZIP(), []int{103} } func (x *ValidatedPurchase) GetUserId() string { @@ -7712,18 +7966,21 @@ func (x *ValidatedPurchase) GetSeenBefore() bool { // Validate IAP response. type ValidatePurchaseResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Newly seen validated purchases. ValidatedPurchases []*ValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseResponse) Reset() { *x = ValidatePurchaseResponse{} - mi := &file_api_proto_msgTypes[105] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[104] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidatePurchaseResponse) String() string { @@ -7733,8 +7990,8 @@ func (x *ValidatePurchaseResponse) String() string { func (*ValidatePurchaseResponse) ProtoMessage() {} func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[105] - if x != nil { + mi := &file_api_proto_msgTypes[104] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7746,7 +8003,7 @@ func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseResponse.ProtoReflect.Descriptor instead. func (*ValidatePurchaseResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{105} + return file_api_proto_rawDescGZIP(), []int{104} } func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase { @@ -7758,17 +8015,20 @@ func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase // Validate Subscription response. type ValidateSubscriptionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + ValidatedSubscription *ValidatedSubscription `protobuf:"bytes,1,opt,name=validated_subscription,json=validatedSubscription,proto3" json:"validated_subscription,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *ValidateSubscriptionResponse) Reset() { *x = ValidateSubscriptionResponse{} - mi := &file_api_proto_msgTypes[106] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[105] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidateSubscriptionResponse) String() string { @@ -7778,8 +8038,8 @@ func (x *ValidateSubscriptionResponse) String() string { func (*ValidateSubscriptionResponse) ProtoMessage() {} func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[106] - if x != nil { + mi := &file_api_proto_msgTypes[105] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7791,7 +8051,7 @@ func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{106} + return file_api_proto_rawDescGZIP(), []int{105} } func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubscription { @@ -7802,9 +8062,12 @@ func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubs } type ValidatedSubscription struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Subscription User ID. - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Subscription User ID. + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Purchase Product ID. ProductId string `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` // Purchase Original transaction ID (we only keep track of the original subscription, not subsequent renewals). @@ -7828,16 +8091,16 @@ type ValidatedSubscription struct { // Raw provider notification body. ProviderNotification string `protobuf:"bytes,12,opt,name=provider_notification,json=providerNotification,proto3" json:"provider_notification,omitempty"` // Whether the subscription is currently active or not. - Active bool `protobuf:"varint,13,opt,name=active,proto3" json:"active,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Active bool `protobuf:"varint,13,opt,name=active,proto3" json:"active,omitempty"` } func (x *ValidatedSubscription) Reset() { *x = ValidatedSubscription{} - mi := &file_api_proto_msgTypes[107] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ValidatedSubscription) String() string { @@ -7847,8 +8110,8 @@ func (x *ValidatedSubscription) String() string { func (*ValidatedSubscription) ProtoMessage() {} func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[107] - if x != nil { + mi := &file_api_proto_msgTypes[106] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7860,7 +8123,7 @@ func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedSubscription.ProtoReflect.Descriptor instead. func (*ValidatedSubscription) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{107} + return file_api_proto_rawDescGZIP(), []int{106} } func (x *ValidatedSubscription) GetUserId() string { @@ -7956,22 +8219,25 @@ func (x *ValidatedSubscription) GetActive() bool { // A list of validated purchases stored by Nakama. type PurchaseList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Stored validated purchases. ValidatedPurchases []*ValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` // The cursor to send when retrieving the next page, if any. Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` // The cursor to send when retrieving the previous page, if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` } func (x *PurchaseList) Reset() { *x = PurchaseList{} - mi := &file_api_proto_msgTypes[108] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PurchaseList) String() string { @@ -7981,8 +8247,8 @@ func (x *PurchaseList) String() string { func (*PurchaseList) ProtoMessage() {} func (x *PurchaseList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[108] - if x != nil { + mi := &file_api_proto_msgTypes[107] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7994,7 +8260,7 @@ func (x *PurchaseList) ProtoReflect() protoreflect.Message { // Deprecated: Use PurchaseList.ProtoReflect.Descriptor instead. func (*PurchaseList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{108} + return file_api_proto_rawDescGZIP(), []int{107} } func (x *PurchaseList) GetValidatedPurchases() []*ValidatedPurchase { @@ -8020,22 +8286,25 @@ func (x *PurchaseList) GetPrevCursor() string { // A list of validated subscriptions stored by Nakama. type SubscriptionList struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Stored validated subscriptions. ValidatedSubscriptions []*ValidatedSubscription `protobuf:"bytes,1,rep,name=validated_subscriptions,json=validatedSubscriptions,proto3" json:"validated_subscriptions,omitempty"` // The cursor to send when retrieving the next page, if any. Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` // The cursor to send when retrieving the previous page, if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` } func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - mi := &file_api_proto_msgTypes[109] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[108] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SubscriptionList) String() string { @@ -8045,8 +8314,8 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[109] - if x != nil { + mi := &file_api_proto_msgTypes[108] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8058,7 +8327,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{109} + return file_api_proto_rawDescGZIP(), []int{108} } func (x *SubscriptionList) GetValidatedSubscriptions() []*ValidatedSubscription { @@ -8084,20 +8353,23 @@ func (x *SubscriptionList) GetPrevCursor() string { // A request to submit a score to a leaderboard. type WriteLeaderboardRecordRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the leaderboard to write to. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // Record input. - Record *WriteLeaderboardRecordRequest_LeaderboardRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Record *WriteLeaderboardRecordRequest_LeaderboardRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` } func (x *WriteLeaderboardRecordRequest) Reset() { *x = WriteLeaderboardRecordRequest{} - mi := &file_api_proto_msgTypes[110] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[109] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *WriteLeaderboardRecordRequest) String() string { @@ -8107,8 +8379,8 @@ func (x *WriteLeaderboardRecordRequest) String() string { func (*WriteLeaderboardRecordRequest) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[110] - if x != nil { + mi := &file_api_proto_msgTypes[109] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8120,7 +8392,7 @@ func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteLeaderboardRecordRequest.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{110} + return file_api_proto_rawDescGZIP(), []int{109} } func (x *WriteLeaderboardRecordRequest) GetLeaderboardId() string { @@ -8139,7 +8411,10 @@ func (x *WriteLeaderboardRecordRequest) GetRecord() *WriteLeaderboardRecordReque // The object to store. type WriteStorageObject struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The collection to store the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key for the object within the collection. @@ -8152,15 +8427,15 @@ type WriteStorageObject struct { PermissionRead *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=permission_read,json=permissionRead,proto3" json:"permission_read,omitempty"` // The write access permissions for the object. PermissionWrite *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=permission_write,json=permissionWrite,proto3" json:"permission_write,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *WriteStorageObject) Reset() { *x = WriteStorageObject{} - mi := &file_api_proto_msgTypes[111] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *WriteStorageObject) String() string { @@ -8170,8 +8445,8 @@ func (x *WriteStorageObject) String() string { func (*WriteStorageObject) ProtoMessage() {} func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[111] - if x != nil { + mi := &file_api_proto_msgTypes[110] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8183,7 +8458,7 @@ func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObject.ProtoReflect.Descriptor instead. func (*WriteStorageObject) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{111} + return file_api_proto_rawDescGZIP(), []int{110} } func (x *WriteStorageObject) GetCollection() string { @@ -8230,18 +8505,21 @@ func (x *WriteStorageObject) GetPermissionWrite() *wrapperspb.Int32Value { // Write objects to the storage engine. type WriteStorageObjectsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The objects to store on the server. - Objects []*WriteStorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The objects to store on the server. + Objects []*WriteStorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` } func (x *WriteStorageObjectsRequest) Reset() { *x = WriteStorageObjectsRequest{} - mi := &file_api_proto_msgTypes[112] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *WriteStorageObjectsRequest) String() string { @@ -8251,8 +8529,8 @@ func (x *WriteStorageObjectsRequest) String() string { func (*WriteStorageObjectsRequest) ProtoMessage() {} func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[112] - if x != nil { + mi := &file_api_proto_msgTypes[111] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8264,7 +8542,7 @@ func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObjectsRequest.ProtoReflect.Descriptor instead. func (*WriteStorageObjectsRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{112} + return file_api_proto_rawDescGZIP(), []int{111} } func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { @@ -8276,20 +8554,23 @@ func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { // A request to submit a score to a tournament. type WriteTournamentRecordRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The tournament ID to write the record for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // Record input. - Record *WriteTournamentRecordRequest_TournamentRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Record *WriteTournamentRecordRequest_TournamentRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` } func (x *WriteTournamentRecordRequest) Reset() { *x = WriteTournamentRecordRequest{} - mi := &file_api_proto_msgTypes[113] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *WriteTournamentRecordRequest) String() string { @@ -8299,8 +8580,8 @@ func (x *WriteTournamentRecordRequest) String() string { func (*WriteTournamentRecordRequest) ProtoMessage() {} func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[113] - if x != nil { + mi := &file_api_proto_msgTypes[112] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8312,7 +8593,7 @@ func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteTournamentRecordRequest.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{113} + return file_api_proto_rawDescGZIP(), []int{112} } func (x *WriteTournamentRecordRequest) GetTournamentId() string { @@ -8331,20 +8612,23 @@ func (x *WriteTournamentRecordRequest) GetRecord() *WriteTournamentRecordRequest // A friend of a friend. type FriendsOfFriendsList_FriendOfFriend struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The user who referred its friend. Referrer string `protobuf:"bytes,1,opt,name=referrer,proto3" json:"referrer,omitempty"` // User. - User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` } func (x *FriendsOfFriendsList_FriendOfFriend) Reset() { *x = FriendsOfFriendsList_FriendOfFriend{} - mi := &file_api_proto_msgTypes[126] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[125] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *FriendsOfFriendsList_FriendOfFriend) String() string { @@ -8354,8 +8638,8 @@ func (x *FriendsOfFriendsList_FriendOfFriend) String() string { func (*FriendsOfFriendsList_FriendOfFriend) ProtoMessage() {} func (x *FriendsOfFriendsList_FriendOfFriend) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[126] - if x != nil { + mi := &file_api_proto_msgTypes[125] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8386,20 +8670,23 @@ func (x *FriendsOfFriendsList_FriendOfFriend) GetUser() *User { // A single user-role pair. type GroupUserList_GroupUser struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // User. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // Their relationship to the group. - State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` } func (x *GroupUserList_GroupUser) Reset() { *x = GroupUserList_GroupUser{} - mi := &file_api_proto_msgTypes[127] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[126] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GroupUserList_GroupUser) String() string { @@ -8409,8 +8696,8 @@ func (x *GroupUserList_GroupUser) String() string { func (*GroupUserList_GroupUser) ProtoMessage() {} func (x *GroupUserList_GroupUser) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[127] - if x != nil { + mi := &file_api_proto_msgTypes[126] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8441,20 +8728,23 @@ func (x *GroupUserList_GroupUser) GetState() *wrapperspb.Int32Value { // A single group-role pair. type UserGroupList_UserGroup struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Group. Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` // The user's relationship to the group. - State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` } func (x *UserGroupList_UserGroup) Reset() { *x = UserGroupList_UserGroup{} - mi := &file_api_proto_msgTypes[128] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[127] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *UserGroupList_UserGroup) String() string { @@ -8464,8 +8754,8 @@ func (x *UserGroupList_UserGroup) String() string { func (*UserGroupList_UserGroup) ProtoMessage() {} func (x *UserGroupList_UserGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[128] - if x != nil { + mi := &file_api_proto_msgTypes[127] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8496,7 +8786,10 @@ func (x *UserGroupList_UserGroup) GetState() *wrapperspb.Int32Value { // Record values to write. type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The score value to submit. Score int64 `protobuf:"varint,1,opt,name=score,proto3" json:"score,omitempty"` // An optional secondary value. @@ -8504,16 +8797,16 @@ type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { // Optional record metadata. Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` // Operator override. - Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Reset() { *x = WriteLeaderboardRecordRequest_LeaderboardRecordWrite{} - mi := &file_api_proto_msgTypes[129] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[128] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { @@ -8523,8 +8816,8 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[129] - if x != nil { + mi := &file_api_proto_msgTypes[128] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8536,7 +8829,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() pr // Deprecated: Use WriteLeaderboardRecordRequest_LeaderboardRecordWrite.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{110, 0} + return file_api_proto_rawDescGZIP(), []int{109, 0} } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetScore() int64 { @@ -8569,7 +8862,10 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetOperator() Ope // Record values to write. type WriteTournamentRecordRequest_TournamentRecordWrite struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The score value to submit. Score int64 `protobuf:"varint,1,opt,name=score,proto3" json:"score,omitempty"` // An optional secondary value. @@ -8577,16 +8873,16 @@ type WriteTournamentRecordRequest_TournamentRecordWrite struct { // A JSON object of additional properties (optional). Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` // Operator override. - Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) Reset() { *x = WriteTournamentRecordRequest_TournamentRecordWrite{} - mi := &file_api_proto_msgTypes[130] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[129] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { @@ -8596,8 +8892,8 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { func (*WriteTournamentRecordRequest_TournamentRecordWrite) ProtoMessage() {} func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[130] - if x != nil { + mi := &file_api_proto_msgTypes[129] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8609,7 +8905,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() prot // Deprecated: Use WriteTournamentRecordRequest_TournamentRecordWrite.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest_TournamentRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{113, 0} + return file_api_proto_rawDescGZIP(), []int{112, 0} } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetScore() int64 { @@ -8642,741 +8938,1364 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetOperator() Opera var File_api_proto protoreflect.FileDescriptor -const file_api_proto_rawDesc = "" + - "\n" + - "\tapi.proto\x12\n" + - "nakama.api\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xab\x02\n" + - "\aAccount\x12$\n" + - "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x12\x16\n" + - "\x06wallet\x18\x02 \x01(\tR\x06wallet\x12\x14\n" + - "\x05email\x18\x03 \x01(\tR\x05email\x123\n" + - "\adevices\x18\x04 \x03(\v2\x19.nakama.api.AccountDeviceR\adevices\x12\x1b\n" + - "\tcustom_id\x18\x05 \x01(\tR\bcustomId\x12;\n" + - "\vverify_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "verifyTime\x12=\n" + - "\fdisable_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\vdisableTime\"\x99\x01\n" + - "\x0eAccountRefresh\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05token\x128\n" + - "\x04vars\x18\x02 \x03(\v2$.nakama.api.AccountRefresh.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x95\x01\n" + - "\fAccountApple\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05token\x126\n" + - "\x04vars\x18\x02 \x03(\v2\".nakama.api.AccountApple.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x91\x01\n" + - "\rAccountCustom\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x127\n" + - "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountCustom.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x91\x01\n" + - "\rAccountDevice\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x127\n" + - "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountDevice.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb1\x01\n" + - "\fAccountEmail\x12\x14\n" + - "\x05email\x18\x01 \x01(\tR\x05email\x12\x1a\n" + - "\bpassword\x18\x02 \x01(\tR\bpassword\x126\n" + - "\x04vars\x18\x03 \x03(\v2\".nakama.api.AccountEmail.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x9b\x01\n" + - "\x0fAccountFacebook\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05token\x129\n" + - "\x04vars\x18\x02 \x03(\v2%.nakama.api.AccountFacebook.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc9\x01\n" + - "\x1aAccountFacebookInstantGame\x12,\n" + - "\x12signed_player_info\x18\x01 \x01(\tR\x10signedPlayerInfo\x12D\n" + - "\x04vars\x18\x02 \x03(\v20.nakama.api.AccountFacebookInstantGame.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc8\x02\n" + - "\x11AccountGameCenter\x12\x1b\n" + - "\tplayer_id\x18\x01 \x01(\tR\bplayerId\x12\x1b\n" + - "\tbundle_id\x18\x02 \x01(\tR\bbundleId\x12+\n" + - "\x11timestamp_seconds\x18\x03 \x01(\x03R\x10timestampSeconds\x12\x12\n" + - "\x04salt\x18\x04 \x01(\tR\x04salt\x12\x1c\n" + - "\tsignature\x18\x05 \x01(\tR\tsignature\x12$\n" + - "\x0epublic_key_url\x18\x06 \x01(\tR\fpublicKeyUrl\x12;\n" + - "\x04vars\x18\a \x03(\v2'.nakama.api.AccountGameCenter.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x97\x01\n" + - "\rAccountGoogle\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05token\x127\n" + - "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountGoogle.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x95\x01\n" + - "\fAccountSteam\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05token\x126\n" + - "\x04vars\x18\x02 \x03(\v2\".nakama.api.AccountSteam.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"_\n" + - "\x11AddFriendsRequest\x12\x10\n" + - "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + - "\tusernames\x18\x02 \x03(\tR\tusernames\x12\x1a\n" + - "\bmetadata\x18\x03 \x01(\tR\bmetadata\"L\n" + - "\x14AddGroupUsersRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + - "\buser_ids\x18\x02 \x03(\tR\auserIds\"\xa7\x01\n" + - "\x15SessionRefreshRequest\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05token\x12?\n" + - "\x04vars\x18\x02 \x03(\v2+.nakama.api.SessionRefreshRequest.VarsEntryR\x04vars\x1a7\n" + - "\tVarsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"Q\n" + - "\x14SessionLogoutRequest\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05token\x12#\n" + - "\rrefresh_token\x18\x02 \x01(\tR\frefreshToken\"\x9e\x01\n" + - "\x18AuthenticateAppleRequest\x122\n" + - "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountAppleR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + - "\x19AuthenticateCustomRequest\x123\n" + - "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountCustomR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + - "\x19AuthenticateDeviceRequest\x123\n" + - "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountDeviceR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\"\x9e\x01\n" + - "\x18AuthenticateEmailRequest\x122\n" + - "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountEmailR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\"\xd4\x01\n" + - "\x1bAuthenticateFacebookRequest\x125\n" + - "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\x12.\n" + - "\x04sync\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"\xba\x01\n" + - "&AuthenticateFacebookInstantGameRequest\x12@\n" + - "\aaccount\x18\x01 \x01(\v2&.nakama.api.AccountFacebookInstantGameR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\"\xa8\x01\n" + - "\x1dAuthenticateGameCenterRequest\x127\n" + - "\aaccount\x18\x01 \x01(\v2\x1d.nakama.api.AccountGameCenterR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + - "\x19AuthenticateGoogleRequest\x123\n" + - "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountGoogleR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\"\xce\x01\n" + - "\x18AuthenticateSteamRequest\x122\n" + - "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x122\n" + - "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\x12.\n" + - "\x04sync\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"L\n" + - "\x14BanGroupUsersRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + - "\buser_ids\x18\x02 \x03(\tR\auserIds\"E\n" + - "\x13BlockFriendsRequest\x12\x10\n" + - "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + - "\tusernames\x18\x02 \x03(\tR\tusernames\"\x80\x04\n" + - "\x0eChannelMessage\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + - "\n" + - "message_id\x18\x02 \x01(\tR\tmessageId\x12/\n" + - "\x04code\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x04code\x12\x1b\n" + - "\tsender_id\x18\x04 \x01(\tR\bsenderId\x12\x1a\n" + - "\busername\x18\x05 \x01(\tR\busername\x12\x18\n" + - "\acontent\x18\x06 \x01(\tR\acontent\x12;\n" + - "\vcreate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\x12:\n" + - "\n" + - "persistent\x18\t \x01(\v2\x1a.google.protobuf.BoolValueR\n" + - "persistent\x12\x1b\n" + - "\troom_name\x18\n" + - " \x01(\tR\broomName\x12\x19\n" + - "\bgroup_id\x18\v \x01(\tR\agroupId\x12\x1e\n" + - "\vuser_id_one\x18\f \x01(\tR\tuserIdOne\x12\x1e\n" + - "\vuser_id_two\x18\r \x01(\tR\tuserIdTwo\"\xb9\x01\n" + - "\x12ChannelMessageList\x126\n" + - "\bmessages\x18\x01 \x03(\v2\x1a.nakama.api.ChannelMessageR\bmessages\x12\x1f\n" + - "\vnext_cursor\x18\x02 \x01(\tR\n" + - "nextCursor\x12\x1f\n" + - "\vprev_cursor\x18\x03 \x01(\tR\n" + - "prevCursor\x12)\n" + - "\x10cacheable_cursor\x18\x04 \x01(\tR\x0fcacheableCursor\"\xb5\x01\n" + - "\x12CreateGroupRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\x12 \n" + - "\vdescription\x18\x02 \x01(\tR\vdescription\x12\x19\n" + - "\blang_tag\x18\x03 \x01(\tR\alangTag\x12\x1d\n" + - "\n" + - "avatar_url\x18\x04 \x01(\tR\tavatarUrl\x12\x12\n" + - "\x04open\x18\x05 \x01(\bR\x04open\x12\x1b\n" + - "\tmax_count\x18\x06 \x01(\x05R\bmaxCount\"F\n" + - "\x14DeleteFriendsRequest\x12\x10\n" + - "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + - "\tusernames\x18\x02 \x03(\tR\tusernames\"/\n" + - "\x12DeleteGroupRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\"G\n" + - "\x1eDeleteLeaderboardRecordRequest\x12%\n" + - "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\".\n" + - "\x1aDeleteNotificationsRequest\x12\x10\n" + - "\x03ids\x18\x01 \x03(\tR\x03ids\"D\n" + - "\x1dDeleteTournamentRecordRequest\x12#\n" + - "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\"c\n" + - "\x15DeleteStorageObjectId\x12\x1e\n" + - "\n" + - "collection\x18\x01 \x01(\tR\n" + - "collection\x12\x10\n" + - "\x03key\x18\x02 \x01(\tR\x03key\x12\x18\n" + - "\aversion\x18\x03 \x01(\tR\aversion\"_\n" + - "\x1bDeleteStorageObjectsRequest\x12@\n" + - "\n" + - "object_ids\x18\x01 \x03(\v2!.nakama.api.DeleteStorageObjectIdR\tobjectIds\"\xf3\x01\n" + - "\x05Event\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\x12A\n" + - "\n" + - "properties\x18\x02 \x03(\v2!.nakama.api.Event.PropertiesEntryR\n" + - "properties\x128\n" + - "\ttimestamp\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12\x1a\n" + - "\bexternal\x18\x04 \x01(\bR\bexternal\x1a=\n" + - "\x0fPropertiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x82\x02\n" + - "\x06Friend\x12$\n" + - "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x121\n" + - "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12;\n" + - "\vupdate_time\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\x12\x1a\n" + - "\bmetadata\x18\x04 \x01(\tR\bmetadata\"F\n" + - "\x05State\x12\n" + - "\n" + - "\x06FRIEND\x10\x00\x12\x0f\n" + - "\vINVITE_SENT\x10\x01\x12\x13\n" + - "\x0fINVITE_RECEIVED\x10\x02\x12\v\n" + - "\aBLOCKED\x10\x03\"R\n" + - "\n" + - "FriendList\x12,\n" + - "\afriends\x18\x01 \x03(\v2\x12.nakama.api.FriendR\afriends\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xe1\x01\n" + - "\x14FriendsOfFriendsList\x12]\n" + - "\x12friends_of_friends\x18\x01 \x03(\v2/.nakama.api.FriendsOfFriendsList.FriendOfFriendR\x10friendsOfFriends\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1aR\n" + - "\x0eFriendOfFriend\x12\x1a\n" + - "\breferrer\x18\x01 \x01(\tR\breferrer\x12$\n" + - "\x04user\x18\x02 \x01(\v2\x10.nakama.api.UserR\x04user\"d\n" + - "\x0fGetUsersRequest\x12\x10\n" + - "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + - "\tusernames\x18\x02 \x03(\tR\tusernames\x12!\n" + - "\ffacebook_ids\x18\x03 \x03(\tR\vfacebookIds\"7\n" + - "\x16GetSubscriptionRequest\x12\x1d\n" + - "\n" + - "product_id\x18\x01 \x01(\tR\tproductId\"\xa8\x03\n" + - "\x05Group\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + - "\n" + - "creator_id\x18\x02 \x01(\tR\tcreatorId\x12\x12\n" + - "\x04name\x18\x03 \x01(\tR\x04name\x12 \n" + - "\vdescription\x18\x04 \x01(\tR\vdescription\x12\x19\n" + - "\blang_tag\x18\x05 \x01(\tR\alangTag\x12\x1a\n" + - "\bmetadata\x18\x06 \x01(\tR\bmetadata\x12\x1d\n" + - "\n" + - "avatar_url\x18\a \x01(\tR\tavatarUrl\x12.\n" + - "\x04open\x18\b \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\x12\x1d\n" + - "\n" + - "edge_count\x18\t \x01(\x05R\tedgeCount\x12\x1b\n" + - "\tmax_count\x18\n" + - " \x01(\x05R\bmaxCount\x12;\n" + - "\vcreate_time\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\"N\n" + - "\tGroupList\x12)\n" + - "\x06groups\x18\x01 \x03(\v2\x11.nakama.api.GroupR\x06groups\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\x96\x02\n" + - "\rGroupUserList\x12D\n" + - "\vgroup_users\x18\x01 \x03(\v2#.nakama.api.GroupUserList.GroupUserR\n" + - "groupUsers\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1a\xa6\x01\n" + - "\tGroupUser\x12$\n" + - "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x121\n" + - "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\"@\n" + - "\x05State\x12\x0e\n" + - "\n" + - "SUPERADMIN\x10\x00\x12\t\n" + - "\x05ADMIN\x10\x01\x12\n" + - "\n" + - "\x06MEMBER\x10\x02\x12\x10\n" + - "\fJOIN_REQUEST\x10\x03\"\x87\x01\n" + - "\x1cImportFacebookFriendsRequest\x125\n" + - "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x120\n" + - "\x05reset\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x05reset\"\x81\x01\n" + - "\x19ImportSteamFriendsRequest\x122\n" + - "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x120\n" + - "\x05reset\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x05reset\"-\n" + - "\x10JoinGroupRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\"<\n" + - "\x15JoinTournamentRequest\x12#\n" + - "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\"M\n" + - "\x15KickGroupUsersRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + - "\buser_ids\x18\x02 \x03(\tR\auserIds\"\xab\x02\n" + - "\vLeaderboard\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + - "\n" + - "sort_order\x18\x02 \x01(\rR\tsortOrder\x120\n" + - "\boperator\x18\x03 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\x12\x1d\n" + - "\n" + - "prev_reset\x18\x04 \x01(\rR\tprevReset\x12\x1d\n" + - "\n" + - "next_reset\x18\x05 \x01(\rR\tnextReset\x12\x1a\n" + - "\bmetadata\x18\x06 \x01(\tR\bmetadata\x12;\n" + - "\vcreate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12$\n" + - "\rauthoritative\x18\b \x01(\bR\rauthoritative\"f\n" + - "\x0fLeaderboardList\x12;\n" + - "\fleaderboards\x18\x01 \x03(\v2\x17.nakama.api.LeaderboardR\fleaderboards\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xe9\x03\n" + - "\x11LeaderboardRecord\x12%\n" + - "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12\x19\n" + - "\bowner_id\x18\x02 \x01(\tR\aownerId\x128\n" + - "\busername\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\busername\x12\x14\n" + - "\x05score\x18\x04 \x01(\x03R\x05score\x12\x1a\n" + - "\bsubscore\x18\x05 \x01(\x03R\bsubscore\x12\x1b\n" + - "\tnum_score\x18\x06 \x01(\x05R\bnumScore\x12\x1a\n" + - "\bmetadata\x18\a \x01(\tR\bmetadata\x12;\n" + - "\vcreate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\x12;\n" + - "\vexpiry_time\x18\n" + - " \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "expiryTime\x12\x12\n" + - "\x04rank\x18\v \x01(\x03R\x04rank\x12\"\n" + - "\rmax_num_score\x18\f \x01(\rR\vmaxNumScore\"\xf5\x01\n" + - "\x15LeaderboardRecordList\x127\n" + - "\arecords\x18\x01 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\arecords\x12B\n" + - "\rowner_records\x18\x02 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\fownerRecords\x12\x1f\n" + - "\vnext_cursor\x18\x03 \x01(\tR\n" + - "nextCursor\x12\x1f\n" + - "\vprev_cursor\x18\x04 \x01(\tR\n" + - "prevCursor\x12\x1d\n" + - "\n" + - "rank_count\x18\x05 \x01(\x03R\trankCount\".\n" + - "\x11LeaveGroupRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\"|\n" + - "\x13LinkFacebookRequest\x125\n" + - "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x12.\n" + - "\x04sync\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"v\n" + - "\x10LinkSteamRequest\x122\n" + - "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x12.\n" + - "\x04sync\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"\xbc\x01\n" + - "\x1aListChannelMessagesRequest\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\x121\n" + - "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x124\n" + - "\aforward\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\aforward\x12\x16\n" + - "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\x92\x01\n" + - "\x12ListFriendsRequest\x121\n" + - "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + - "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + - "\x06cursor\x18\x03 \x01(\tR\x06cursor\"h\n" + - "\x1bListFriendsOfFriendsRequest\x121\n" + - "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xf4\x01\n" + - "\x11ListGroupsRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\x121\n" + - "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x19\n" + - "\blang_tag\x18\x04 \x01(\tR\alangTag\x125\n" + - "\amembers\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\amembers\x12.\n" + - "\x04open\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\"\xb0\x01\n" + - "\x15ListGroupUsersRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\x121\n" + - "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + - "\x05state\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + - "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\xed\x01\n" + - "(ListLeaderboardRecordsAroundOwnerRequest\x12%\n" + - "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x122\n" + - "\x05limit\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\x05limit\x12\x19\n" + - "\bowner_id\x18\x03 \x01(\tR\aownerId\x123\n" + - "\x06expiry\x18\x04 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\x12\x16\n" + - "\x06cursor\x18\x05 \x01(\tR\x06cursor\"\xe3\x01\n" + - "\x1dListLeaderboardRecordsRequest\x12%\n" + - "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12\x1b\n" + - "\towner_ids\x18\x02 \x03(\tR\bownerIds\x121\n" + - "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + - "\x06cursor\x18\x04 \x01(\tR\x06cursor\x123\n" + - "\x06expiry\x18\x05 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\"\xe1\x02\n" + - "\x12ListMatchesRequest\x121\n" + - "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12@\n" + - "\rauthoritative\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\rauthoritative\x122\n" + - "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x126\n" + - "\bmin_size\x18\x04 \x01(\v2\x1b.google.protobuf.Int32ValueR\aminSize\x126\n" + - "\bmax_size\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\amaxSize\x122\n" + - "\x05query\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\x05query\"x\n" + - "\x18ListNotificationsRequest\x121\n" + - "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12)\n" + - "\x10cacheable_cursor\x18\x02 \x01(\tR\x0fcacheableCursor\"\x9f\x01\n" + - "\x19ListStorageObjectsRequest\x12\x17\n" + - "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1e\n" + - "\n" + - "collection\x18\x02 \x01(\tR\n" + - "collection\x121\n" + - "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + - "\x06cursor\x18\x04 \x01(\tR\x06cursor\"e\n" + - "\x18ListSubscriptionsRequest\x121\n" + - "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xea\x01\n" + - "'ListTournamentRecordsAroundOwnerRequest\x12#\n" + - "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x122\n" + - "\x05limit\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\x05limit\x12\x19\n" + - "\bowner_id\x18\x03 \x01(\tR\aownerId\x123\n" + - "\x06expiry\x18\x04 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\x12\x16\n" + - "\x06cursor\x18\x05 \x01(\tR\x06cursor\"\xe0\x01\n" + - "\x1cListTournamentRecordsRequest\x12#\n" + - "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x12\x1b\n" + - "\towner_ids\x18\x02 \x03(\tR\bownerIds\x121\n" + - "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + - "\x06cursor\x18\x04 \x01(\tR\x06cursor\x123\n" + - "\x06expiry\x18\x05 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\"\xdf\x02\n" + - "\x16ListTournamentsRequest\x12C\n" + - "\x0ecategory_start\x18\x01 \x01(\v2\x1c.google.protobuf.UInt32ValueR\rcategoryStart\x12?\n" + - "\fcategory_end\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\vcategoryEnd\x12;\n" + - "\n" + - "start_time\x18\x03 \x01(\v2\x1c.google.protobuf.UInt32ValueR\tstartTime\x127\n" + - "\bend_time\x18\x04 \x01(\v2\x1c.google.protobuf.UInt32ValueR\aendTime\x121\n" + - "\x05limit\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + - "\x06cursor\x18\b \x01(\tR\x06cursor\"\xae\x01\n" + - "\x15ListUserGroupsRequest\x12\x17\n" + - "\auser_id\x18\x01 \x01(\tR\x06userId\x121\n" + - "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + - "\x05state\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + - "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\xd0\x01\n" + - "\x05Match\x12\x19\n" + - "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12$\n" + - "\rauthoritative\x18\x02 \x01(\bR\rauthoritative\x122\n" + - "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x12\x12\n" + - "\x04size\x18\x04 \x01(\x05R\x04size\x12\x1b\n" + - "\ttick_rate\x18\x05 \x01(\x05R\btickRate\x12!\n" + - "\fhandler_name\x18\x06 \x01(\tR\vhandlerName\"8\n" + - "\tMatchList\x12+\n" + - "\amatches\x18\x01 \x03(\v2\x11.nakama.api.MatchR\amatches\"\x99\x01\n" + - "\x19MatchmakerCompletionStats\x12;\n" + - "\vcreate_time\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12?\n" + - "\rcomplete_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\fcompleteTime\"\xd4\x01\n" + - "\x0fMatchmakerStats\x12!\n" + - "\fticket_count\x18\x01 \x01(\x05R\vticketCount\x12U\n" + - "\x19oldest_ticket_create_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x16oldestTicketCreateTime\x12G\n" + - "\vcompletions\x18\x03 \x03(\v2%.nakama.api.MatchmakerCompletionStatsR\vcompletions\"\xe0\x01\n" + - "\fNotification\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x18\n" + - "\asubject\x18\x02 \x01(\tR\asubject\x12\x18\n" + - "\acontent\x18\x03 \x01(\tR\acontent\x12\x12\n" + - "\x04code\x18\x04 \x01(\x05R\x04code\x12\x1b\n" + - "\tsender_id\x18\x05 \x01(\tR\bsenderId\x12;\n" + - "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12\x1e\n" + - "\n" + - "persistent\x18\a \x01(\bR\n" + - "persistent\"}\n" + - "\x10NotificationList\x12>\n" + - "\rnotifications\x18\x01 \x03(\v2\x18.nakama.api.NotificationR\rnotifications\x12)\n" + - "\x10cacheable_cursor\x18\x02 \x01(\tR\x0fcacheableCursor\"P\n" + - "\x18PromoteGroupUsersRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + - "\buser_ids\x18\x02 \x03(\tR\auserIds\"O\n" + - "\x17DemoteGroupUsersRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + - "\buser_ids\x18\x02 \x03(\tR\auserIds\"`\n" + - "\x13ReadStorageObjectId\x12\x1e\n" + - "\n" + - "collection\x18\x01 \x01(\tR\n" + - "collection\x12\x10\n" + - "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + - "\auser_id\x18\x03 \x01(\tR\x06userId\"[\n" + - "\x19ReadStorageObjectsRequest\x12>\n" + - "\n" + - "object_ids\x18\x01 \x03(\v2\x1f.nakama.api.ReadStorageObjectIdR\tobjectIds\"J\n" + - "\x03Rpc\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x18\n" + - "\apayload\x18\x02 \x01(\tR\apayload\x12\x19\n" + - "\bhttp_key\x18\x03 \x01(\tR\ahttpKey\"^\n" + - "\aSession\x12\x18\n" + - "\acreated\x18\x01 \x01(\bR\acreated\x12\x14\n" + - "\x05token\x18\x02 \x01(\tR\x05token\x12#\n" + - "\rrefresh_token\x18\x03 \x01(\tR\frefreshToken\"\xd8\x02\n" + - "\rStorageObject\x12\x1e\n" + - "\n" + - "collection\x18\x01 \x01(\tR\n" + - "collection\x12\x10\n" + - "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + - "\auser_id\x18\x03 \x01(\tR\x06userId\x12\x14\n" + - "\x05value\x18\x04 \x01(\tR\x05value\x12\x18\n" + - "\aversion\x18\x05 \x01(\tR\aversion\x12'\n" + - "\x0fpermission_read\x18\x06 \x01(\x05R\x0epermissionRead\x12)\n" + - "\x10permission_write\x18\a \x01(\x05R\x0fpermissionWrite\x12;\n" + - "\vcreate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\"\xf1\x01\n" + - "\x10StorageObjectAck\x12\x1e\n" + - "\n" + - "collection\x18\x01 \x01(\tR\n" + - "collection\x12\x10\n" + - "\x03key\x18\x02 \x01(\tR\x03key\x12\x18\n" + - "\aversion\x18\x03 \x01(\tR\aversion\x12\x17\n" + - "\auser_id\x18\x04 \x01(\tR\x06userId\x12;\n" + - "\vcreate_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\"E\n" + - "\x11StorageObjectAcks\x120\n" + - "\x04acks\x18\x01 \x03(\v2\x1c.nakama.api.StorageObjectAckR\x04acks\"E\n" + - "\x0eStorageObjects\x123\n" + - "\aobjects\x18\x01 \x03(\v2\x19.nakama.api.StorageObjectR\aobjects\"`\n" + - "\x11StorageObjectList\x123\n" + - "\aobjects\x18\x01 \x03(\v2\x19.nakama.api.StorageObjectR\aobjects\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xbe\x05\n" + - "\n" + - "Tournament\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + - "\x05title\x18\x02 \x01(\tR\x05title\x12 \n" + - "\vdescription\x18\x03 \x01(\tR\vdescription\x12\x1a\n" + - "\bcategory\x18\x04 \x01(\rR\bcategory\x12\x1d\n" + - "\n" + - "sort_order\x18\x05 \x01(\rR\tsortOrder\x12\x12\n" + - "\x04size\x18\x06 \x01(\rR\x04size\x12\x19\n" + - "\bmax_size\x18\a \x01(\rR\amaxSize\x12\"\n" + - "\rmax_num_score\x18\b \x01(\rR\vmaxNumScore\x12\x1b\n" + - "\tcan_enter\x18\t \x01(\bR\bcanEnter\x12\x1d\n" + - "\n" + - "end_active\x18\n" + - " \x01(\rR\tendActive\x12\x1d\n" + - "\n" + - "next_reset\x18\v \x01(\rR\tnextReset\x12\x1a\n" + - "\bmetadata\x18\f \x01(\tR\bmetadata\x12;\n" + - "\vcreate_time\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x129\n" + - "\n" + - "start_time\x18\x0e \x01(\v2\x1a.google.protobuf.TimestampR\tstartTime\x125\n" + - "\bend_time\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\aendTime\x12\x1a\n" + - "\bduration\x18\x10 \x01(\rR\bduration\x12!\n" + - "\fstart_active\x18\x11 \x01(\rR\vstartActive\x12\x1d\n" + - "\n" + - "prev_reset\x18\x12 \x01(\rR\tprevReset\x120\n" + - "\boperator\x18\x13 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\x12$\n" + - "\rauthoritative\x18\x14 \x01(\bR\rauthoritative\"b\n" + - "\x0eTournamentList\x128\n" + - "\vtournaments\x18\x01 \x03(\v2\x16.nakama.api.TournamentR\vtournaments\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xf4\x01\n" + - "\x14TournamentRecordList\x127\n" + - "\arecords\x18\x01 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\arecords\x12B\n" + - "\rowner_records\x18\x02 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\fownerRecords\x12\x1f\n" + - "\vnext_cursor\x18\x03 \x01(\tR\n" + - "nextCursor\x12\x1f\n" + - "\vprev_cursor\x18\x04 \x01(\tR\n" + - "prevCursor\x12\x1d\n" + - "\n" + - "rank_count\x18\x05 \x01(\x03R\trankCount\"\xfb\x02\n" + - "\x14UpdateAccountRequest\x128\n" + - "\busername\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\busername\x12?\n" + - "\fdisplay_name\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\vdisplayName\x12;\n" + - "\n" + - "avatar_url\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x127\n" + - "\blang_tag\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x128\n" + - "\blocation\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\blocation\x128\n" + - "\btimezone\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\btimezone\"\xc7\x02\n" + - "\x12UpdateGroupRequest\x12\x19\n" + - "\bgroup_id\x18\x01 \x01(\tR\agroupId\x120\n" + - "\x04name\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12>\n" + - "\vdescription\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\vdescription\x127\n" + - "\blang_tag\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x12;\n" + - "\n" + - "avatar_url\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x12.\n" + - "\x04open\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\"\xe6\x04\n" + - "\x04User\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x1a\n" + - "\busername\x18\x02 \x01(\tR\busername\x12!\n" + - "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x1d\n" + - "\n" + - "avatar_url\x18\x04 \x01(\tR\tavatarUrl\x12\x19\n" + - "\blang_tag\x18\x05 \x01(\tR\alangTag\x12\x1a\n" + - "\blocation\x18\x06 \x01(\tR\blocation\x12\x1a\n" + - "\btimezone\x18\a \x01(\tR\btimezone\x12\x1a\n" + - "\bmetadata\x18\b \x01(\tR\bmetadata\x12\x1f\n" + - "\vfacebook_id\x18\t \x01(\tR\n" + - "facebookId\x12\x1b\n" + - "\tgoogle_id\x18\n" + - " \x01(\tR\bgoogleId\x12#\n" + - "\rgamecenter_id\x18\v \x01(\tR\fgamecenterId\x12\x19\n" + - "\bsteam_id\x18\f \x01(\tR\asteamId\x12\x16\n" + - "\x06online\x18\r \x01(\bR\x06online\x12\x1d\n" + - "\n" + - "edge_count\x18\x0e \x01(\x05R\tedgeCount\x12;\n" + - "\vcreate_time\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\x10 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\x127\n" + - "\x18facebook_instant_game_id\x18\x11 \x01(\tR\x15facebookInstantGameId\x12\x19\n" + - "\bapple_id\x18\x12 \x01(\tR\aappleId\"\x99\x02\n" + - "\rUserGroupList\x12D\n" + - "\vuser_groups\x18\x01 \x03(\v2#.nakama.api.UserGroupList.UserGroupR\n" + - "userGroups\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1a\xa9\x01\n" + - "\tUserGroup\x12'\n" + - "\x05group\x18\x01 \x01(\v2\x11.nakama.api.GroupR\x05group\x121\n" + - "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\"@\n" + - "\x05State\x12\x0e\n" + - "\n" + - "SUPERADMIN\x10\x00\x12\t\n" + - "\x05ADMIN\x10\x01\x12\n" + - "\n" + - "\x06MEMBER\x10\x02\x12\x10\n" + - "\fJOIN_REQUEST\x10\x03\"/\n" + - "\x05Users\x12&\n" + - "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\"n\n" + - "\x1cValidatePurchaseAppleRequest\x12\x18\n" + - "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"r\n" + - " ValidateSubscriptionAppleRequest\x12\x18\n" + - "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"q\n" + - "\x1dValidatePurchaseGoogleRequest\x12\x1a\n" + - "\bpurchase\x18\x01 \x01(\tR\bpurchase\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"s\n" + - "!ValidateSubscriptionGoogleRequest\x12\x18\n" + - "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x8f\x01\n" + - "\x1dValidatePurchaseHuaweiRequest\x12\x1a\n" + - "\bpurchase\x18\x01 \x01(\tR\bpurchase\x12\x1c\n" + - "\tsignature\x18\x02 \x01(\tR\tsignature\x124\n" + - "\apersist\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x85\x01\n" + - "&ValidatePurchaseFacebookInstantRequest\x12%\n" + - "\x0esigned_request\x18\x01 \x01(\tR\rsignedRequest\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"q\n" + - "\x1bValidatePurchaseXboxRequest\x12\x1c\n" + - "\tproductId\x18\x01 \x01(\tR\tproductId\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\xa9\x04\n" + - "\x11ValidatedPurchase\x12\x17\n" + - "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + - "\n" + - "product_id\x18\x02 \x01(\tR\tproductId\x12%\n" + - "\x0etransaction_id\x18\x03 \x01(\tR\rtransactionId\x12/\n" + - "\x05store\x18\x04 \x01(\x0e2\x19.nakama.api.StoreProviderR\x05store\x12?\n" + - "\rpurchase_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\fpurchaseTime\x12;\n" + - "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\x12;\n" + - "\vrefund_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "refundTime\x12+\n" + - "\x11provider_response\x18\t \x01(\tR\x10providerResponse\x12>\n" + - "\venvironment\x18\n" + - " \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\x12\x1f\n" + - "\vseen_before\x18\v \x01(\bR\n" + - "seenBefore\"j\n" + - "\x18ValidatePurchaseResponse\x12N\n" + - "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\"x\n" + - "\x1cValidateSubscriptionResponse\x12X\n" + - "\x16validated_subscription\x18\x01 \x01(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\xa7\x05\n" + - "\x15ValidatedSubscription\x12\x17\n" + - "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + - "\n" + - "product_id\x18\x02 \x01(\tR\tproductId\x126\n" + - "\x17original_transaction_id\x18\x03 \x01(\tR\x15originalTransactionId\x12/\n" + - "\x05store\x18\x04 \x01(\x0e2\x19.nakama.api.StoreProviderR\x05store\x12?\n" + - "\rpurchase_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\fpurchaseTime\x12;\n" + - "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\x12>\n" + - "\venvironment\x18\b \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\x12;\n" + - "\vexpiry_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "expiryTime\x12;\n" + - "\vrefund_time\x18\n" + - " \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "refundTime\x12+\n" + - "\x11provider_response\x18\v \x01(\tR\x10providerResponse\x123\n" + - "\x15provider_notification\x18\f \x01(\tR\x14providerNotification\x12\x16\n" + - "\x06active\x18\r \x01(\bR\x06active\"\x97\x01\n" + - "\fPurchaseList\x12N\n" + - "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\x12\x1f\n" + - "\vprev_cursor\x18\x03 \x01(\tR\n" + - "prevCursor\"\xa7\x01\n" + - "\x10SubscriptionList\x12Z\n" + - "\x17validated_subscriptions\x18\x01 \x03(\v2!.nakama.api.ValidatedSubscriptionR\x16validatedSubscriptions\x12\x16\n" + - "\x06cursor\x18\x02 \x01(\tR\x06cursor\x12\x1f\n" + - "\vprev_cursor\x18\x03 \x01(\tR\n" + - "prevCursor\"\xbb\x02\n" + - "\x1dWriteLeaderboardRecordRequest\x12%\n" + - "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12X\n" + - "\x06record\x18\x02 \x01(\v2@.nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWriteR\x06record\x1a\x98\x01\n" + - "\x16LeaderboardRecordWrite\x12\x14\n" + - "\x05score\x18\x01 \x01(\x03R\x05score\x12\x1a\n" + - "\bsubscore\x18\x02 \x01(\x03R\bsubscore\x12\x1a\n" + - "\bmetadata\x18\x03 \x01(\tR\bmetadata\x120\n" + - "\boperator\x18\x04 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\"\x84\x02\n" + - "\x12WriteStorageObject\x12\x1e\n" + - "\n" + - "collection\x18\x01 \x01(\tR\n" + - "collection\x12\x10\n" + - "\x03key\x18\x02 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x03 \x01(\tR\x05value\x12\x18\n" + - "\aversion\x18\x04 \x01(\tR\aversion\x12D\n" + - "\x0fpermission_read\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\x0epermissionRead\x12F\n" + - "\x10permission_write\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\x0fpermissionWrite\"V\n" + - "\x1aWriteStorageObjectsRequest\x128\n" + - "\aobjects\x18\x01 \x03(\v2\x1e.nakama.api.WriteStorageObjectR\aobjects\"\xb5\x02\n" + - "\x1cWriteTournamentRecordRequest\x12#\n" + - "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x12V\n" + - "\x06record\x18\x02 \x01(\v2>.nakama.api.WriteTournamentRecordRequest.TournamentRecordWriteR\x06record\x1a\x97\x01\n" + - "\x15TournamentRecordWrite\x12\x14\n" + - "\x05score\x18\x01 \x01(\x03R\x05score\x12\x1a\n" + - "\bsubscore\x18\x02 \x01(\x03R\bsubscore\x12\x1a\n" + - "\bmetadata\x18\x03 \x01(\tR\bmetadata\x120\n" + - "\boperator\x18\x04 \x01(\x0e2\x14.nakama.api.OperatorR\boperator*\x7f\n" + - "\rStoreProvider\x12\x13\n" + - "\x0fAPPLE_APP_STORE\x10\x00\x12\x15\n" + - "\x11GOOGLE_PLAY_STORE\x10\x01\x12\x16\n" + - "\x12HUAWEI_APP_GALLERY\x10\x02\x12\x1a\n" + - "\x16FACEBOOK_INSTANT_STORE\x10\x03\x12\x0e\n" + - "\n" + - "XBOX_STORE\x10\x04*<\n" + - "\x10StoreEnvironment\x12\v\n" + - "\aUNKNOWN\x10\x00\x12\v\n" + - "\aSANDBOX\x10\x01\x12\x0e\n" + - "\n" + - "PRODUCTION\x10\x02*L\n" + - "\bOperator\x12\x0f\n" + - "\vNO_OVERRIDE\x10\x00\x12\b\n" + - "\x04BEST\x10\x01\x12\a\n" + - "\x03SET\x10\x02\x12\r\n" + - "\tINCREMENT\x10\x03\x12\r\n" + - "\tDECREMENT\x10\x04Bc\n" + - "\x19com.heroiclabs.nakama.apiB\tNakamaApiP\x01Z'github.com/heroiclabs/nakama-common/api\xaa\x02\x0fNakama.Protobufb\x06proto3" +var file_api_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, + 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x02, 0x0a, 0x07, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x99, 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, + 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x91, 0x01, 0x0a, 0x0d, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x37, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x91, + 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x37, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xb1, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x39, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x1a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, + 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x44, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xc8, 0x02, 0x0a, 0x11, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, + 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, + 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x61, 0x6c, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x24, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x3b, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x97, 0x01, 0x0a, 0x0d, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, + 0x74, 0x65, 0x61, 0x6d, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5f, 0x0a, + 0x11, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4c, + 0x0a, 0x14, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xa7, 0x01, 0x0a, + 0x15, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x14, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, + 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, + 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa0, 0x01, + 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, + 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x1b, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xba, 0x01, 0x0a, 0x26, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x1d, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, + 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, + 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0xce, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, + 0x73, 0x79, 0x6e, 0x63, 0x22, 0x4c, 0x0a, 0x14, 0x42, 0x61, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x73, 0x22, 0x45, 0x0a, 0x13, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x80, 0x04, 0x0a, 0x0e, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3b, + 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, + 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0b, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, 0xb9, 0x01, 0x0a, + 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, + 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x29, 0x0a, + 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xb5, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, + 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, + 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, + 0x70, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x46, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x1e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, + 0x64, 0x73, 0x22, 0x44, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, + 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x64, 0x52, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x73, 0x22, 0xf3, + 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x82, 0x02, 0x0a, 0x06, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, + 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x46, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x52, + 0x49, 0x45, 0x4e, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x56, 0x49, 0x54, 0x45, + 0x5f, 0x53, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x56, 0x49, 0x54, + 0x45, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x03, 0x22, 0x52, 0x0a, 0x0a, 0x46, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x07, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe1, 0x01, + 0x0a, 0x14, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x12, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x46, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x52, 0x10, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x1a, 0x52, 0x0a, + 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x22, 0x64, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x63, 0x65, + 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x37, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, + 0x22, 0xa8, 0x03, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x64, 0x67, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x09, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x96, 0x02, 0x0a, 0x0d, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, + 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x1a, 0xa6, 0x01, 0x0a, 0x09, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x22, 0x40, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, + 0x55, 0x50, 0x45, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, + 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, + 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, + 0x53, 0x54, 0x10, 0x03, 0x22, 0x87, 0x01, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, + 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, + 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, + 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x81, + 0x01, 0x0a, 0x19, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x46, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x22, 0x2d, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, + 0x64, 0x22, 0x3c, 0x0a, 0x15, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, + 0x4d, 0x0a, 0x15, 0x4b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xab, + 0x02, 0x0a, 0x0b, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, + 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x66, 0x0a, 0x0f, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x3b, 0x0a, 0x0c, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x0c, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe9, 0x03, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x22, 0x0a, 0x0d, + 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x22, 0xf5, 0x01, 0x0a, 0x15, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x72, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, + 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, + 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, + 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, + 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, + 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2e, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x6e, 0x6b, + 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0x76, 0x0a, 0x10, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, + 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, + 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xbc, + 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x34, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x66, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x92, 0x01, + 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x22, 0x68, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xf4, 0x01, 0x0a, + 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x31, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x35, 0x0a, 0x07, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6f, + 0x70, 0x65, 0x6e, 0x22, 0xb0, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x73, 0x41, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, + 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe3, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x31, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x22, 0xe1, 0x02, 0x0a, + 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x08, + 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x69, 0x6e, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x32, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x78, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x29, 0x0a, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x65, 0x0a, 0x18, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x22, 0xea, 0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x41, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x22, 0xe0, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x33, + 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x79, 0x22, 0xdf, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, + 0x0a, 0x0e, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x3f, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, + 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x45, 0x6e, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x37, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xae, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xd0, 0x01, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, + 0x6b, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, + 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, + 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, + 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, + 0xd4, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x69, 0x63, 0x6b, 0x65, + 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x19, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, + 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x16, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x54, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, + 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x0c, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x10, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, + 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, + 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x50, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x4f, 0x0a, 0x17, 0x44, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, + 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x60, 0x0a, 0x13, 0x52, + 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x5b, 0x0a, + 0x19, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x61, 0x64, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x52, + 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x73, 0x22, 0x4a, 0x0a, 0x03, 0x52, 0x70, + 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, + 0x74, 0x74, 0x70, 0x4b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x12, 0x29, 0x0a, 0x10, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0xf1, 0x01, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x61, 0x63, + 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x52, 0x04, 0x61, 0x63, 0x6b, 0x73, 0x22, 0x45, 0x0a, 0x0e, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x33, + 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbe, 0x05, 0x0a, 0x0a, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, + 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6f, + 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, + 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6d, + 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, + 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, + 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, + 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, + 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x6e, 0x64, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x30, + 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x62, 0x0a, 0x0e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x74, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xf4, 0x01, 0x0a, 0x14, 0x54, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x42, 0x0a, 0x0d, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x52, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0xfb, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, + 0x72, 0x6c, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x38, 0x0a, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x22, + 0xc7, 0x02, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, + 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x3b, 0x0a, 0x0a, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, + 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, + 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, + 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6f, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x64, 0x67, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x37, + 0x0a, 0x18, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6c, 0x65, + 0x49, 0x64, 0x22, 0x99, 0x02, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x1a, 0xa9, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x12, 0x27, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x40, 0x0a, 0x05, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x50, 0x45, 0x52, 0x41, 0x44, + 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x03, 0x22, 0x2f, + 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, + 0x6e, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, + 0x61, 0x73, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, + 0x72, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, + 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, + 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x73, 0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x1d, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, + 0x48, 0x75, 0x61, 0x77, 0x65, 0x69, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x85, 0x01, + 0x0a, 0x26, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, + 0x73, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0xa9, 0x04, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, + 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x22, 0x6a, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, + 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, + 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x72, 0x63, 0x68, + 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x22, 0x78, 0x0a, + 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, + 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x05, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, + 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, + 0x66, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, + 0x75, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x22, 0x97, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, + 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, + 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xa7, 0x01, 0x0a, 0x10, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x5a, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbb, 0x02, 0x0a, 0x1d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x58, + 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x98, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x22, 0x84, 0x02, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0f, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x61, 0x64, 0x12, 0x46, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x56, 0x0a, 0x1a, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x1c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x56, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x1a, 0x97, 0x01, 0x0a, 0x15, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2a, 0x6f, 0x0a, 0x0d, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x13, 0x0a, 0x0f, 0x41, + 0x50, 0x50, 0x4c, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x5f, + 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x55, 0x41, 0x57, 0x45, + 0x49, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x47, 0x41, 0x4c, 0x4c, 0x45, 0x52, 0x59, 0x10, 0x02, 0x12, + 0x1a, 0x0a, 0x16, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x41, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x3c, 0x0a, 0x10, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x52, 0x4f, + 0x44, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x2a, 0x4c, 0x0a, 0x08, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x4f, 0x56, 0x45, 0x52, + 0x52, 0x49, 0x44, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x45, 0x53, 0x54, 0x10, 0x01, + 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x43, + 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x43, 0x52, + 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x42, 0x63, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x68, + 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x42, 0x09, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x41, 0x70, 0x69, 0x50, + 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, + 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0f, 0x4e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} var ( file_api_proto_rawDescOnce sync.Once - file_api_proto_rawDescData []byte + file_api_proto_rawDescData = file_api_proto_rawDesc ) func file_api_proto_rawDescGZIP() []byte { file_api_proto_rawDescOnce.Do(func() { - file_api_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc))) + file_api_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_proto_rawDescData) }) return file_api_proto_rawDescData } var file_api_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 131) -var file_api_proto_goTypes = []any{ +var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 130) +var file_api_proto_goTypes = []interface{}{ (StoreProvider)(0), // 0: nakama.api.StoreProvider (StoreEnvironment)(0), // 1: nakama.api.StoreEnvironment (Operator)(0), // 2: nakama.api.Operator @@ -9486,225 +10405,223 @@ var file_api_proto_goTypes = []any{ (*ValidateSubscriptionGoogleRequest)(nil), // 106: nakama.api.ValidateSubscriptionGoogleRequest (*ValidatePurchaseHuaweiRequest)(nil), // 107: nakama.api.ValidatePurchaseHuaweiRequest (*ValidatePurchaseFacebookInstantRequest)(nil), // 108: nakama.api.ValidatePurchaseFacebookInstantRequest - (*ValidatePurchaseXboxRequest)(nil), // 109: nakama.api.ValidatePurchaseXboxRequest - (*ValidatedPurchase)(nil), // 110: nakama.api.ValidatedPurchase - (*ValidatePurchaseResponse)(nil), // 111: nakama.api.ValidatePurchaseResponse - (*ValidateSubscriptionResponse)(nil), // 112: nakama.api.ValidateSubscriptionResponse - (*ValidatedSubscription)(nil), // 113: nakama.api.ValidatedSubscription - (*PurchaseList)(nil), // 114: nakama.api.PurchaseList - (*SubscriptionList)(nil), // 115: nakama.api.SubscriptionList - (*WriteLeaderboardRecordRequest)(nil), // 116: nakama.api.WriteLeaderboardRecordRequest - (*WriteStorageObject)(nil), // 117: nakama.api.WriteStorageObject - (*WriteStorageObjectsRequest)(nil), // 118: nakama.api.WriteStorageObjectsRequest - (*WriteTournamentRecordRequest)(nil), // 119: nakama.api.WriteTournamentRecordRequest - nil, // 120: nakama.api.AccountRefresh.VarsEntry - nil, // 121: nakama.api.AccountApple.VarsEntry - nil, // 122: nakama.api.AccountCustom.VarsEntry - nil, // 123: nakama.api.AccountDevice.VarsEntry - nil, // 124: nakama.api.AccountEmail.VarsEntry - nil, // 125: nakama.api.AccountFacebook.VarsEntry - nil, // 126: nakama.api.AccountFacebookInstantGame.VarsEntry - nil, // 127: nakama.api.AccountGameCenter.VarsEntry - nil, // 128: nakama.api.AccountGoogle.VarsEntry - nil, // 129: nakama.api.AccountSteam.VarsEntry - nil, // 130: nakama.api.SessionRefreshRequest.VarsEntry - nil, // 131: nakama.api.Event.PropertiesEntry - (*FriendsOfFriendsList_FriendOfFriend)(nil), // 132: nakama.api.FriendsOfFriendsList.FriendOfFriend - (*GroupUserList_GroupUser)(nil), // 133: nakama.api.GroupUserList.GroupUser - (*UserGroupList_UserGroup)(nil), // 134: nakama.api.UserGroupList.UserGroup - (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 135: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 136: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - (*timestamppb.Timestamp)(nil), // 137: google.protobuf.Timestamp - (*wrapperspb.BoolValue)(nil), // 138: google.protobuf.BoolValue - (*wrapperspb.Int32Value)(nil), // 139: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 140: google.protobuf.StringValue - (*wrapperspb.UInt32Value)(nil), // 141: google.protobuf.UInt32Value - (*wrapperspb.Int64Value)(nil), // 142: google.protobuf.Int64Value + (*ValidatedPurchase)(nil), // 109: nakama.api.ValidatedPurchase + (*ValidatePurchaseResponse)(nil), // 110: nakama.api.ValidatePurchaseResponse + (*ValidateSubscriptionResponse)(nil), // 111: nakama.api.ValidateSubscriptionResponse + (*ValidatedSubscription)(nil), // 112: nakama.api.ValidatedSubscription + (*PurchaseList)(nil), // 113: nakama.api.PurchaseList + (*SubscriptionList)(nil), // 114: nakama.api.SubscriptionList + (*WriteLeaderboardRecordRequest)(nil), // 115: nakama.api.WriteLeaderboardRecordRequest + (*WriteStorageObject)(nil), // 116: nakama.api.WriteStorageObject + (*WriteStorageObjectsRequest)(nil), // 117: nakama.api.WriteStorageObjectsRequest + (*WriteTournamentRecordRequest)(nil), // 118: nakama.api.WriteTournamentRecordRequest + nil, // 119: nakama.api.AccountRefresh.VarsEntry + nil, // 120: nakama.api.AccountApple.VarsEntry + nil, // 121: nakama.api.AccountCustom.VarsEntry + nil, // 122: nakama.api.AccountDevice.VarsEntry + nil, // 123: nakama.api.AccountEmail.VarsEntry + nil, // 124: nakama.api.AccountFacebook.VarsEntry + nil, // 125: nakama.api.AccountFacebookInstantGame.VarsEntry + nil, // 126: nakama.api.AccountGameCenter.VarsEntry + nil, // 127: nakama.api.AccountGoogle.VarsEntry + nil, // 128: nakama.api.AccountSteam.VarsEntry + nil, // 129: nakama.api.SessionRefreshRequest.VarsEntry + nil, // 130: nakama.api.Event.PropertiesEntry + (*FriendsOfFriendsList_FriendOfFriend)(nil), // 131: nakama.api.FriendsOfFriendsList.FriendOfFriend + (*GroupUserList_GroupUser)(nil), // 132: nakama.api.GroupUserList.GroupUser + (*UserGroupList_UserGroup)(nil), // 133: nakama.api.UserGroupList.UserGroup + (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 134: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 135: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + (*timestamppb.Timestamp)(nil), // 136: google.protobuf.Timestamp + (*wrapperspb.BoolValue)(nil), // 137: google.protobuf.BoolValue + (*wrapperspb.Int32Value)(nil), // 138: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 139: google.protobuf.StringValue + (*wrapperspb.UInt32Value)(nil), // 140: google.protobuf.UInt32Value + (*wrapperspb.Int64Value)(nil), // 141: google.protobuf.Int64Value } var file_api_proto_depIdxs = []int32{ 100, // 0: nakama.api.Account.user:type_name -> nakama.api.User 10, // 1: nakama.api.Account.devices:type_name -> nakama.api.AccountDevice - 137, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp - 137, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp - 120, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry - 121, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry - 122, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry - 123, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry - 124, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry - 125, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry - 126, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry - 127, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry - 128, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry - 129, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry - 130, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry + 136, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp + 136, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp + 119, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry + 120, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry + 121, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry + 122, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry + 123, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry + 124, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry + 125, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry + 126, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry + 127, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry + 128, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry + 129, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry 8, // 15: nakama.api.AuthenticateAppleRequest.account:type_name -> nakama.api.AccountApple - 138, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue + 137, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue 9, // 17: nakama.api.AuthenticateCustomRequest.account:type_name -> nakama.api.AccountCustom - 138, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue + 137, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue 10, // 19: nakama.api.AuthenticateDeviceRequest.account:type_name -> nakama.api.AccountDevice - 138, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue + 137, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue 11, // 21: nakama.api.AuthenticateEmailRequest.account:type_name -> nakama.api.AccountEmail - 138, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue + 137, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue 12, // 23: nakama.api.AuthenticateFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 138, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue - 138, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 137, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue + 137, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue 13, // 26: nakama.api.AuthenticateFacebookInstantGameRequest.account:type_name -> nakama.api.AccountFacebookInstantGame - 138, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue + 137, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue 14, // 28: nakama.api.AuthenticateGameCenterRequest.account:type_name -> nakama.api.AccountGameCenter - 138, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue + 137, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue 15, // 30: nakama.api.AuthenticateGoogleRequest.account:type_name -> nakama.api.AccountGoogle - 138, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue + 137, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue 16, // 32: nakama.api.AuthenticateSteamRequest.account:type_name -> nakama.api.AccountSteam - 138, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue - 138, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue - 139, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value - 137, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp - 137, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp - 138, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue + 137, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue + 137, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue + 138, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value + 136, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp + 136, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp + 137, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue 32, // 39: nakama.api.ChannelMessageList.messages:type_name -> nakama.api.ChannelMessage 40, // 40: nakama.api.DeleteStorageObjectsRequest.object_ids:type_name -> nakama.api.DeleteStorageObjectId - 131, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry - 137, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp + 130, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry + 136, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp 100, // 43: nakama.api.Friend.user:type_name -> nakama.api.User - 139, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value - 137, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp + 138, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value + 136, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp 43, // 46: nakama.api.FriendList.friends:type_name -> nakama.api.Friend - 132, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend - 138, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue - 137, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp - 137, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp + 131, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend + 137, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue + 136, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp + 136, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp 48, // 51: nakama.api.GroupList.groups:type_name -> nakama.api.Group - 133, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser + 132, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser 12, // 53: nakama.api.ImportFacebookFriendsRequest.account:type_name -> nakama.api.AccountFacebook - 138, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 137, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue 16, // 55: nakama.api.ImportSteamFriendsRequest.account:type_name -> nakama.api.AccountSteam - 138, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 137, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue 2, // 57: nakama.api.Leaderboard.operator:type_name -> nakama.api.Operator - 137, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp + 136, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp 56, // 59: nakama.api.LeaderboardList.leaderboards:type_name -> nakama.api.Leaderboard - 140, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue - 137, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp - 137, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp - 137, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp + 139, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue + 136, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp + 136, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp + 136, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp 58, // 64: nakama.api.LeaderboardRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 65: nakama.api.LeaderboardRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord 12, // 66: nakama.api.LinkFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 138, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 137, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue 16, // 68: nakama.api.LinkSteamRequest.account:type_name -> nakama.api.AccountSteam - 138, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue - 139, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue - 139, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value - 139, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value - 138, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue - 139, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value - 141, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 142, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 139, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 142, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 139, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue - 140, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue - 139, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value - 139, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value - 140, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue - 139, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value - 141, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 142, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 139, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 142, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 141, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value - 141, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value - 141, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value - 141, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value - 139, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value - 140, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue + 137, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue + 138, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value + 137, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue + 138, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value + 138, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value + 137, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue + 138, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value + 140, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 141, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 138, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 141, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 138, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value + 137, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue + 139, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue + 138, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value + 138, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value + 139, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue + 138, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value + 140, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 141, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 138, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 141, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 140, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value + 140, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value + 140, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value + 140, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value + 138, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value + 139, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue 78, // 105: nakama.api.MatchList.matches:type_name -> nakama.api.Match - 137, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp - 137, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp - 137, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp + 136, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp + 136, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp + 136, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp 80, // 109: nakama.api.MatchmakerStats.completions:type_name -> nakama.api.MatchmakerCompletionStats - 137, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp + 136, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp 82, // 111: nakama.api.NotificationList.notifications:type_name -> nakama.api.Notification 86, // 112: nakama.api.ReadStorageObjectsRequest.object_ids:type_name -> nakama.api.ReadStorageObjectId - 137, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp - 137, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp - 137, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp - 137, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp + 136, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp + 136, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp + 136, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp + 136, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp 91, // 117: nakama.api.StorageObjectAcks.acks:type_name -> nakama.api.StorageObjectAck 90, // 118: nakama.api.StorageObjects.objects:type_name -> nakama.api.StorageObject 90, // 119: nakama.api.StorageObjectList.objects:type_name -> nakama.api.StorageObject - 137, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp - 137, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp - 137, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp + 136, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp + 136, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp + 136, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp 2, // 123: nakama.api.Tournament.operator:type_name -> nakama.api.Operator 95, // 124: nakama.api.TournamentList.tournaments:type_name -> nakama.api.Tournament 58, // 125: nakama.api.TournamentRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 126: nakama.api.TournamentRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord - 140, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue - 140, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue - 140, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue - 140, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue - 140, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue - 140, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue - 140, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue - 140, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue - 140, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue - 140, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue - 138, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue - 137, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp - 137, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp - 134, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup + 139, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue + 139, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue + 139, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue + 139, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue + 139, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue + 139, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue + 139, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue + 139, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue + 139, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue + 139, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue + 137, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue + 136, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp + 136, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp + 133, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup 100, // 141: nakama.api.Users.users:type_name -> nakama.api.User - 138, // 142: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 143: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 144: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 145: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 146: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 147: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 148: nakama.api.ValidatePurchaseXboxRequest.persist:type_name -> google.protobuf.BoolValue - 0, // 149: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider - 137, // 150: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp - 137, // 151: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp - 137, // 152: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp - 137, // 153: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp - 1, // 154: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment - 110, // 155: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 113, // 156: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription - 0, // 157: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider - 137, // 158: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp - 137, // 159: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp - 137, // 160: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp - 1, // 161: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment - 137, // 162: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp - 137, // 163: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp - 110, // 164: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 113, // 165: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription - 135, // 166: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - 139, // 167: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value - 139, // 168: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value - 117, // 169: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject - 136, // 170: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - 100, // 171: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User - 100, // 172: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User - 139, // 173: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value - 48, // 174: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group - 139, // 175: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value - 2, // 176: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator - 2, // 177: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator - 178, // [178:178] is the sub-list for method output_type - 178, // [178:178] is the sub-list for method input_type - 178, // [178:178] is the sub-list for extension type_name - 178, // [178:178] is the sub-list for extension extendee - 0, // [0:178] is the sub-list for field type_name + 137, // 142: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue + 137, // 143: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue + 137, // 144: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 137, // 145: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 137, // 146: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue + 137, // 147: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue + 0, // 148: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider + 136, // 149: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp + 136, // 150: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp + 136, // 151: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp + 136, // 152: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp + 1, // 153: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment + 109, // 154: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 112, // 155: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription + 0, // 156: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider + 136, // 157: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp + 136, // 158: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp + 136, // 159: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp + 1, // 160: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment + 136, // 161: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp + 136, // 162: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp + 109, // 163: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 112, // 164: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription + 134, // 165: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + 138, // 166: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value + 138, // 167: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value + 116, // 168: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject + 135, // 169: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + 100, // 170: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User + 100, // 171: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User + 138, // 172: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value + 48, // 173: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group + 138, // 174: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value + 2, // 175: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator + 2, // 176: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator + 177, // [177:177] is the sub-list for method output_type + 177, // [177:177] is the sub-list for method input_type + 177, // [177:177] is the sub-list for extension type_name + 177, // [177:177] is the sub-list for extension extendee + 0, // [0:177] is the sub-list for field type_name } func init() { file_api_proto_init() } @@ -9712,13 +10629,1431 @@ func file_api_proto_init() { if File_api_proto != nil { return } + if !protoimpl.UnsafeEnabled { + file_api_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Account); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountRefresh); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountApple); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountCustom); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountDevice); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountEmail); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountFacebook); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountFacebookInstantGame); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountGameCenter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountGoogle); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountSteam); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddFriendsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddGroupUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SessionRefreshRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SessionLogoutRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateAppleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateCustomRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateDeviceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateEmailRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateFacebookRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateFacebookInstantGameRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateGameCenterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateGoogleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthenticateSteamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BanGroupUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockFriendsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelMessageList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteFriendsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteLeaderboardRecordRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNotificationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteTournamentRecordRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageObjectId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageObjectsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Friend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendsOfFriendsList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSubscriptionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Group); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupUserList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImportFacebookFriendsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImportSteamFriendsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JoinGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JoinTournamentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KickGroupUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Leaderboard); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LeaderboardList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LeaderboardRecord); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LeaderboardRecordList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LeaveGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinkFacebookRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinkSteamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListChannelMessagesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListFriendsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListFriendsOfFriendsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListGroupUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListLeaderboardRecordsAroundOwnerRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListLeaderboardRecordsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListMatchesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNotificationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStorageObjectsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSubscriptionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListTournamentRecordsAroundOwnerRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListTournamentRecordsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListTournamentsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListUserGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Match); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchmakerCompletionStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchmakerStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Notification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NotificationList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PromoteGroupUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DemoteGroupUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReadStorageObjectId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReadStorageObjectsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Rpc); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Session); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageObject); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageObjectAck); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageObjectAcks); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageObjects); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageObjectList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tournament); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TournamentList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TournamentRecordList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserGroupList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Users); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatePurchaseAppleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateSubscriptionAppleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatePurchaseGoogleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateSubscriptionGoogleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatePurchaseHuaweiRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatePurchaseFacebookInstantRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatedPurchase); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatePurchaseResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateSubscriptionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatedSubscription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PurchaseList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscriptionList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteLeaderboardRecordRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteStorageObject); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteStorageObjectsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteTournamentRecordRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendsOfFriendsList_FriendOfFriend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupUserList_GroupUser); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserGroupList_UserGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteLeaderboardRecordRequest_LeaderboardRecordWrite); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteTournamentRecordRequest_TournamentRecordWrite); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc)), + RawDescriptor: file_api_proto_rawDesc, NumEnums: 6, - NumMessages: 131, + NumMessages: 130, NumExtensions: 0, NumServices: 0, }, @@ -9728,6 +12063,7 @@ func file_api_proto_init() { MessageInfos: file_api_proto_msgTypes, }.Build() File_api_proto = out.File + file_api_proto_rawDesc = nil file_api_proto_goTypes = nil file_api_proto_depIdxs = nil } diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index 88704a4dc0..f6962a457f 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1237,12 +1237,6 @@ message ValidatePurchaseFacebookInstantRequest { google.protobuf.BoolValue persist = 2; } -// Xbox Purchase validation request -message ValidatePurchaseXboxRequest { - string productId = 1; - google.protobuf.BoolValue persist = 2; -} - // Validated Purchase stored by Nakama. message ValidatedPurchase { // Purchase User ID. @@ -1290,8 +1284,6 @@ enum StoreProvider { HUAWEI_APP_GALLERY = 2; // Facebook Instant Store FACEBOOK_INSTANT_STORE = 3; - // Xbox Store - XBOX_STORE = 4; } // Environment where a purchase/subscription took place, diff --git a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go index 78425e8ac3..974f671730 100644 --- a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 -// protoc v4.24.3 +// protoc-gen-go v1.31.0 +// protoc v5.29.3 // source: realtime.proto package rtapi @@ -31,7 +31,6 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" - unsafe "unsafe" ) const ( @@ -173,9 +172,12 @@ func (Error_Code) EnumDescriptor() ([]byte, []int) { // An envelope for a realtime message. type Envelope struct { - state protoimpl.MessageState `protogen:"open.v1"` - Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` - // Types that are valid to be assigned to Message: + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` + // Types that are assignable to Message: // // *Envelope_Channel // *Envelope_ChannelJoin @@ -226,16 +228,16 @@ type Envelope struct { // *Envelope_PartyData // *Envelope_PartyDataSend // *Envelope_PartyPresenceEvent - Message isEnvelope_Message `protobuf_oneof:"message"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Message isEnvelope_Message `protobuf_oneof:"message"` } func (x *Envelope) Reset() { *x = Envelope{} - mi := &file_realtime_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Envelope) String() string { @@ -246,7 +248,7 @@ func (*Envelope) ProtoMessage() {} func (x *Envelope) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[0] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -268,450 +270,352 @@ func (x *Envelope) GetCid() string { return "" } -func (x *Envelope) GetMessage() isEnvelope_Message { - if x != nil { - return x.Message +func (m *Envelope) GetMessage() isEnvelope_Message { + if m != nil { + return m.Message } return nil } func (x *Envelope) GetChannel() *Channel { - if x != nil { - if x, ok := x.Message.(*Envelope_Channel); ok { - return x.Channel - } + if x, ok := x.GetMessage().(*Envelope_Channel); ok { + return x.Channel } return nil } func (x *Envelope) GetChannelJoin() *ChannelJoin { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelJoin); ok { - return x.ChannelJoin - } + if x, ok := x.GetMessage().(*Envelope_ChannelJoin); ok { + return x.ChannelJoin } return nil } func (x *Envelope) GetChannelLeave() *ChannelLeave { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelLeave); ok { - return x.ChannelLeave - } + if x, ok := x.GetMessage().(*Envelope_ChannelLeave); ok { + return x.ChannelLeave } return nil } func (x *Envelope) GetChannelMessage() *api.ChannelMessage { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelMessage); ok { - return x.ChannelMessage - } + if x, ok := x.GetMessage().(*Envelope_ChannelMessage); ok { + return x.ChannelMessage } return nil } func (x *Envelope) GetChannelMessageAck() *ChannelMessageAck { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelMessageAck); ok { - return x.ChannelMessageAck - } + if x, ok := x.GetMessage().(*Envelope_ChannelMessageAck); ok { + return x.ChannelMessageAck } return nil } func (x *Envelope) GetChannelMessageSend() *ChannelMessageSend { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelMessageSend); ok { - return x.ChannelMessageSend - } + if x, ok := x.GetMessage().(*Envelope_ChannelMessageSend); ok { + return x.ChannelMessageSend } return nil } func (x *Envelope) GetChannelMessageUpdate() *ChannelMessageUpdate { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelMessageUpdate); ok { - return x.ChannelMessageUpdate - } + if x, ok := x.GetMessage().(*Envelope_ChannelMessageUpdate); ok { + return x.ChannelMessageUpdate } return nil } func (x *Envelope) GetChannelMessageRemove() *ChannelMessageRemove { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelMessageRemove); ok { - return x.ChannelMessageRemove - } + if x, ok := x.GetMessage().(*Envelope_ChannelMessageRemove); ok { + return x.ChannelMessageRemove } return nil } func (x *Envelope) GetChannelPresenceEvent() *ChannelPresenceEvent { - if x != nil { - if x, ok := x.Message.(*Envelope_ChannelPresenceEvent); ok { - return x.ChannelPresenceEvent - } + if x, ok := x.GetMessage().(*Envelope_ChannelPresenceEvent); ok { + return x.ChannelPresenceEvent } return nil } func (x *Envelope) GetError() *Error { - if x != nil { - if x, ok := x.Message.(*Envelope_Error); ok { - return x.Error - } + if x, ok := x.GetMessage().(*Envelope_Error); ok { + return x.Error } return nil } func (x *Envelope) GetMatch() *Match { - if x != nil { - if x, ok := x.Message.(*Envelope_Match); ok { - return x.Match - } + if x, ok := x.GetMessage().(*Envelope_Match); ok { + return x.Match } return nil } func (x *Envelope) GetMatchCreate() *MatchCreate { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchCreate); ok { - return x.MatchCreate - } + if x, ok := x.GetMessage().(*Envelope_MatchCreate); ok { + return x.MatchCreate } return nil } func (x *Envelope) GetMatchData() *MatchData { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchData); ok { - return x.MatchData - } + if x, ok := x.GetMessage().(*Envelope_MatchData); ok { + return x.MatchData } return nil } func (x *Envelope) GetMatchDataSend() *MatchDataSend { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchDataSend); ok { - return x.MatchDataSend - } + if x, ok := x.GetMessage().(*Envelope_MatchDataSend); ok { + return x.MatchDataSend } return nil } func (x *Envelope) GetMatchJoin() *MatchJoin { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchJoin); ok { - return x.MatchJoin - } + if x, ok := x.GetMessage().(*Envelope_MatchJoin); ok { + return x.MatchJoin } return nil } func (x *Envelope) GetMatchLeave() *MatchLeave { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchLeave); ok { - return x.MatchLeave - } + if x, ok := x.GetMessage().(*Envelope_MatchLeave); ok { + return x.MatchLeave } return nil } func (x *Envelope) GetMatchPresenceEvent() *MatchPresenceEvent { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchPresenceEvent); ok { - return x.MatchPresenceEvent - } + if x, ok := x.GetMessage().(*Envelope_MatchPresenceEvent); ok { + return x.MatchPresenceEvent } return nil } func (x *Envelope) GetMatchmakerAdd() *MatchmakerAdd { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchmakerAdd); ok { - return x.MatchmakerAdd - } + if x, ok := x.GetMessage().(*Envelope_MatchmakerAdd); ok { + return x.MatchmakerAdd } return nil } func (x *Envelope) GetMatchmakerMatched() *MatchmakerMatched { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchmakerMatched); ok { - return x.MatchmakerMatched - } + if x, ok := x.GetMessage().(*Envelope_MatchmakerMatched); ok { + return x.MatchmakerMatched } return nil } func (x *Envelope) GetMatchmakerRemove() *MatchmakerRemove { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchmakerRemove); ok { - return x.MatchmakerRemove - } + if x, ok := x.GetMessage().(*Envelope_MatchmakerRemove); ok { + return x.MatchmakerRemove } return nil } func (x *Envelope) GetMatchmakerTicket() *MatchmakerTicket { - if x != nil { - if x, ok := x.Message.(*Envelope_MatchmakerTicket); ok { - return x.MatchmakerTicket - } + if x, ok := x.GetMessage().(*Envelope_MatchmakerTicket); ok { + return x.MatchmakerTicket } return nil } func (x *Envelope) GetNotifications() *Notifications { - if x != nil { - if x, ok := x.Message.(*Envelope_Notifications); ok { - return x.Notifications - } + if x, ok := x.GetMessage().(*Envelope_Notifications); ok { + return x.Notifications } return nil } func (x *Envelope) GetRpc() *api.Rpc { - if x != nil { - if x, ok := x.Message.(*Envelope_Rpc); ok { - return x.Rpc - } + if x, ok := x.GetMessage().(*Envelope_Rpc); ok { + return x.Rpc } return nil } func (x *Envelope) GetStatus() *Status { - if x != nil { - if x, ok := x.Message.(*Envelope_Status); ok { - return x.Status - } + if x, ok := x.GetMessage().(*Envelope_Status); ok { + return x.Status } return nil } func (x *Envelope) GetStatusFollow() *StatusFollow { - if x != nil { - if x, ok := x.Message.(*Envelope_StatusFollow); ok { - return x.StatusFollow - } + if x, ok := x.GetMessage().(*Envelope_StatusFollow); ok { + return x.StatusFollow } return nil } func (x *Envelope) GetStatusPresenceEvent() *StatusPresenceEvent { - if x != nil { - if x, ok := x.Message.(*Envelope_StatusPresenceEvent); ok { - return x.StatusPresenceEvent - } + if x, ok := x.GetMessage().(*Envelope_StatusPresenceEvent); ok { + return x.StatusPresenceEvent } return nil } func (x *Envelope) GetStatusUnfollow() *StatusUnfollow { - if x != nil { - if x, ok := x.Message.(*Envelope_StatusUnfollow); ok { - return x.StatusUnfollow - } + if x, ok := x.GetMessage().(*Envelope_StatusUnfollow); ok { + return x.StatusUnfollow } return nil } func (x *Envelope) GetStatusUpdate() *StatusUpdate { - if x != nil { - if x, ok := x.Message.(*Envelope_StatusUpdate); ok { - return x.StatusUpdate - } + if x, ok := x.GetMessage().(*Envelope_StatusUpdate); ok { + return x.StatusUpdate } return nil } func (x *Envelope) GetStreamData() *StreamData { - if x != nil { - if x, ok := x.Message.(*Envelope_StreamData); ok { - return x.StreamData - } + if x, ok := x.GetMessage().(*Envelope_StreamData); ok { + return x.StreamData } return nil } func (x *Envelope) GetStreamPresenceEvent() *StreamPresenceEvent { - if x != nil { - if x, ok := x.Message.(*Envelope_StreamPresenceEvent); ok { - return x.StreamPresenceEvent - } + if x, ok := x.GetMessage().(*Envelope_StreamPresenceEvent); ok { + return x.StreamPresenceEvent } return nil } func (x *Envelope) GetPing() *Ping { - if x != nil { - if x, ok := x.Message.(*Envelope_Ping); ok { - return x.Ping - } + if x, ok := x.GetMessage().(*Envelope_Ping); ok { + return x.Ping } return nil } func (x *Envelope) GetPong() *Pong { - if x != nil { - if x, ok := x.Message.(*Envelope_Pong); ok { - return x.Pong - } + if x, ok := x.GetMessage().(*Envelope_Pong); ok { + return x.Pong } return nil } func (x *Envelope) GetParty() *Party { - if x != nil { - if x, ok := x.Message.(*Envelope_Party); ok { - return x.Party - } + if x, ok := x.GetMessage().(*Envelope_Party); ok { + return x.Party } return nil } func (x *Envelope) GetPartyCreate() *PartyCreate { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyCreate); ok { - return x.PartyCreate - } + if x, ok := x.GetMessage().(*Envelope_PartyCreate); ok { + return x.PartyCreate } return nil } func (x *Envelope) GetPartyJoin() *PartyJoin { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyJoin); ok { - return x.PartyJoin - } + if x, ok := x.GetMessage().(*Envelope_PartyJoin); ok { + return x.PartyJoin } return nil } func (x *Envelope) GetPartyLeave() *PartyLeave { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyLeave); ok { - return x.PartyLeave - } + if x, ok := x.GetMessage().(*Envelope_PartyLeave); ok { + return x.PartyLeave } return nil } func (x *Envelope) GetPartyPromote() *PartyPromote { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyPromote); ok { - return x.PartyPromote - } + if x, ok := x.GetMessage().(*Envelope_PartyPromote); ok { + return x.PartyPromote } return nil } func (x *Envelope) GetPartyLeader() *PartyLeader { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyLeader); ok { - return x.PartyLeader - } + if x, ok := x.GetMessage().(*Envelope_PartyLeader); ok { + return x.PartyLeader } return nil } func (x *Envelope) GetPartyAccept() *PartyAccept { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyAccept); ok { - return x.PartyAccept - } + if x, ok := x.GetMessage().(*Envelope_PartyAccept); ok { + return x.PartyAccept } return nil } func (x *Envelope) GetPartyRemove() *PartyRemove { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyRemove); ok { - return x.PartyRemove - } + if x, ok := x.GetMessage().(*Envelope_PartyRemove); ok { + return x.PartyRemove } return nil } func (x *Envelope) GetPartyClose() *PartyClose { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyClose); ok { - return x.PartyClose - } + if x, ok := x.GetMessage().(*Envelope_PartyClose); ok { + return x.PartyClose } return nil } func (x *Envelope) GetPartyJoinRequestList() *PartyJoinRequestList { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyJoinRequestList); ok { - return x.PartyJoinRequestList - } + if x, ok := x.GetMessage().(*Envelope_PartyJoinRequestList); ok { + return x.PartyJoinRequestList } return nil } func (x *Envelope) GetPartyJoinRequest() *PartyJoinRequest { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyJoinRequest); ok { - return x.PartyJoinRequest - } + if x, ok := x.GetMessage().(*Envelope_PartyJoinRequest); ok { + return x.PartyJoinRequest } return nil } func (x *Envelope) GetPartyMatchmakerAdd() *PartyMatchmakerAdd { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyMatchmakerAdd); ok { - return x.PartyMatchmakerAdd - } + if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerAdd); ok { + return x.PartyMatchmakerAdd } return nil } func (x *Envelope) GetPartyMatchmakerRemove() *PartyMatchmakerRemove { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyMatchmakerRemove); ok { - return x.PartyMatchmakerRemove - } + if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerRemove); ok { + return x.PartyMatchmakerRemove } return nil } func (x *Envelope) GetPartyMatchmakerTicket() *PartyMatchmakerTicket { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyMatchmakerTicket); ok { - return x.PartyMatchmakerTicket - } + if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerTicket); ok { + return x.PartyMatchmakerTicket } return nil } func (x *Envelope) GetPartyData() *PartyData { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyData); ok { - return x.PartyData - } + if x, ok := x.GetMessage().(*Envelope_PartyData); ok { + return x.PartyData } return nil } func (x *Envelope) GetPartyDataSend() *PartyDataSend { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyDataSend); ok { - return x.PartyDataSend - } + if x, ok := x.GetMessage().(*Envelope_PartyDataSend); ok { + return x.PartyDataSend } return nil } func (x *Envelope) GetPartyPresenceEvent() *PartyPresenceEvent { - if x != nil { - if x, ok := x.Message.(*Envelope_PartyPresenceEvent); ok { - return x.PartyPresenceEvent - } + if x, ok := x.GetMessage().(*Envelope_PartyPresenceEvent); ok { + return x.PartyPresenceEvent } return nil } @@ -1065,7 +969,10 @@ func (*Envelope_PartyPresenceEvent) isEnvelope_Message() {} // A realtime chat channel. type Channel struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The ID of the channel. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The users currently in the channel. @@ -1079,16 +986,16 @@ type Channel struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,6,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` } func (x *Channel) Reset() { *x = Channel{} - mi := &file_realtime_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Channel) String() string { @@ -1099,7 +1006,7 @@ func (*Channel) ProtoMessage() {} func (x *Channel) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[1] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1165,7 +1072,10 @@ func (x *Channel) GetUserIdTwo() string { // Join operation for a realtime chat channel. type ChannelJoin struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The user ID to DM with, group ID to chat with, or room channel name to join. Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` // The type of the chat channel. @@ -1173,16 +1083,16 @@ type ChannelJoin struct { // Whether messages sent on this channel should be persistent. Persistence *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persistence,proto3" json:"persistence,omitempty"` // Whether the user should appear in the channel's presence list and events. - Hidden *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=hidden,proto3" json:"hidden,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Hidden *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=hidden,proto3" json:"hidden,omitempty"` } func (x *ChannelJoin) Reset() { *x = ChannelJoin{} - mi := &file_realtime_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelJoin) String() string { @@ -1193,7 +1103,7 @@ func (*ChannelJoin) ProtoMessage() {} func (x *ChannelJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[2] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1238,18 +1148,21 @@ func (x *ChannelJoin) GetHidden() *wrapperspb.BoolValue { // Leave a realtime channel. type ChannelLeave struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The ID of the channel to leave. - ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ID of the channel to leave. + ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` } func (x *ChannelLeave) Reset() { *x = ChannelLeave{} - mi := &file_realtime_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelLeave) String() string { @@ -1260,7 +1173,7 @@ func (*ChannelLeave) ProtoMessage() {} func (x *ChannelLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[3] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1284,7 +1197,10 @@ func (x *ChannelLeave) GetChannelId() string { // A receipt reply from a channel message send operation. type ChannelMessageAck struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The unique ID assigned to the message. @@ -1306,16 +1222,16 @@ type ChannelMessageAck struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,10,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,11,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIdTwo string `protobuf:"bytes,11,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` } func (x *ChannelMessageAck) Reset() { *x = ChannelMessageAck{} - mi := &file_realtime_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelMessageAck) String() string { @@ -1326,7 +1242,7 @@ func (*ChannelMessageAck) ProtoMessage() {} func (x *ChannelMessageAck) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[4] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1420,20 +1336,23 @@ func (x *ChannelMessageAck) GetUserIdTwo() string { // Send a message to a realtime channel. type ChannelMessageSend struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The channel to sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Message content. - Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` } func (x *ChannelMessageSend) Reset() { *x = ChannelMessageSend{} - mi := &file_realtime_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelMessageSend) String() string { @@ -1444,7 +1363,7 @@ func (*ChannelMessageSend) ProtoMessage() {} func (x *ChannelMessageSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[5] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1475,22 +1394,25 @@ func (x *ChannelMessageSend) GetContent() string { // Update a message previously sent to a realtime channel. type ChannelMessageUpdate struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The ID assigned to the message to update. MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` // New message content. - Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` } func (x *ChannelMessageUpdate) Reset() { *x = ChannelMessageUpdate{} - mi := &file_realtime_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelMessageUpdate) String() string { @@ -1501,7 +1423,7 @@ func (*ChannelMessageUpdate) ProtoMessage() {} func (x *ChannelMessageUpdate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[6] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1539,20 +1461,23 @@ func (x *ChannelMessageUpdate) GetContent() string { // Remove a message previously sent to a realtime channel. type ChannelMessageRemove struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The ID assigned to the message to update. - MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` } func (x *ChannelMessageRemove) Reset() { *x = ChannelMessageRemove{} - mi := &file_realtime_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelMessageRemove) String() string { @@ -1563,7 +1488,7 @@ func (*ChannelMessageRemove) ProtoMessage() {} func (x *ChannelMessageRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[7] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1594,7 +1519,10 @@ func (x *ChannelMessageRemove) GetMessageId() string { // A set of joins and leaves on a particular channel. type ChannelPresenceEvent struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The channel identifier this event is for. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Presences joining the channel as part of this event, if any. @@ -1608,16 +1536,16 @@ type ChannelPresenceEvent struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,6,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` } func (x *ChannelPresenceEvent) Reset() { *x = ChannelPresenceEvent{} - mi := &file_realtime_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ChannelPresenceEvent) String() string { @@ -1628,7 +1556,7 @@ func (*ChannelPresenceEvent) ProtoMessage() {} func (x *ChannelPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[8] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1694,22 +1622,25 @@ func (x *ChannelPresenceEvent) GetUserIdTwo() string { // A logical error which may occur on the server. type Error struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The error code which should be one of "Error.Code" enums. Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // A message in English to help developers debug the response. Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` // Additional error details which may be different for each response. - Context map[string]string `protobuf:"bytes,3,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Context map[string]string `protobuf:"bytes,3,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Error) Reset() { *x = Error{} - mi := &file_realtime_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Error) String() string { @@ -1720,7 +1651,7 @@ func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[9] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1758,7 +1689,10 @@ func (x *Error) GetContext() map[string]string { // A realtime match. type Match struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // True if it's an server-managed authoritative match, false otherwise. @@ -1770,16 +1704,16 @@ type Match struct { // The users currently in the match. Presences []*UserPresence `protobuf:"bytes,5,rep,name=presences,proto3" json:"presences,omitempty"` // A reference to the current user's presence in the match. - Self *UserPresence `protobuf:"bytes,6,opt,name=self,proto3" json:"self,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Self *UserPresence `protobuf:"bytes,6,opt,name=self,proto3" json:"self,omitempty"` } func (x *Match) Reset() { *x = Match{} - mi := &file_realtime_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Match) String() string { @@ -1790,7 +1724,7 @@ func (*Match) ProtoMessage() {} func (x *Match) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[10] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1849,18 +1783,21 @@ func (x *Match) GetSelf() *UserPresence { // Create a new realtime match. type MatchCreate struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Optional name to use when creating the match. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Optional name to use when creating the match. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *MatchCreate) Reset() { *x = MatchCreate{} - mi := &file_realtime_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchCreate) String() string { @@ -1871,7 +1808,7 @@ func (*MatchCreate) ProtoMessage() {} func (x *MatchCreate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[11] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1895,7 +1832,10 @@ func (x *MatchCreate) GetName() string { // Realtime match data received from the server. type MatchData struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // A reference to the user presence that sent this data, if any. @@ -1905,16 +1845,16 @@ type MatchData struct { // Data payload, if any. Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` // True if this data was delivered reliably, false otherwise. - Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` } func (x *MatchData) Reset() { *x = MatchData{} - mi := &file_realtime_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchData) String() string { @@ -1925,7 +1865,7 @@ func (*MatchData) ProtoMessage() {} func (x *MatchData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[12] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1977,7 +1917,10 @@ func (x *MatchData) GetReliable() bool { // Send realtime match data to the server. type MatchDataSend struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // Op code value. @@ -1987,16 +1930,16 @@ type MatchDataSend struct { // List of presences in the match to deliver to, if filtering is required. Otherwise deliver to everyone in the match. Presences []*UserPresence `protobuf:"bytes,4,rep,name=presences,proto3" json:"presences,omitempty"` // True if the data should be sent reliably, false otherwise. - Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` } func (x *MatchDataSend) Reset() { *x = MatchDataSend{} - mi := &file_realtime_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchDataSend) String() string { @@ -2007,7 +1950,7 @@ func (*MatchDataSend) ProtoMessage() {} func (x *MatchDataSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[13] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2059,23 +2002,26 @@ func (x *MatchDataSend) GetReliable() bool { // Join an existing realtime match. type MatchJoin struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Id: + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Id: // // *MatchJoin_MatchId // *MatchJoin_Token Id isMatchJoin_Id `protobuf_oneof:"id"` // An optional set of key-value metadata pairs to be passed to the match handler, if any. - Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *MatchJoin) Reset() { *x = MatchJoin{} - mi := &file_realtime_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchJoin) String() string { @@ -2086,7 +2032,7 @@ func (*MatchJoin) ProtoMessage() {} func (x *MatchJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[14] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2101,27 +2047,23 @@ func (*MatchJoin) Descriptor() ([]byte, []int) { return file_realtime_proto_rawDescGZIP(), []int{14} } -func (x *MatchJoin) GetId() isMatchJoin_Id { - if x != nil { - return x.Id +func (m *MatchJoin) GetId() isMatchJoin_Id { + if m != nil { + return m.Id } return nil } func (x *MatchJoin) GetMatchId() string { - if x != nil { - if x, ok := x.Id.(*MatchJoin_MatchId); ok { - return x.MatchId - } + if x, ok := x.GetId().(*MatchJoin_MatchId); ok { + return x.MatchId } return "" } func (x *MatchJoin) GetToken() string { - if x != nil { - if x, ok := x.Id.(*MatchJoin_Token); ok { - return x.Token - } + if x, ok := x.GetId().(*MatchJoin_Token); ok { + return x.Token } return "" } @@ -2153,18 +2095,21 @@ func (*MatchJoin_Token) isMatchJoin_Id() {} // Leave a realtime match. type MatchLeave struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The match unique ID. - MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The match unique ID. + MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` } func (x *MatchLeave) Reset() { *x = MatchLeave{} - mi := &file_realtime_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchLeave) String() string { @@ -2175,7 +2120,7 @@ func (*MatchLeave) ProtoMessage() {} func (x *MatchLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[15] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2199,22 +2144,25 @@ func (x *MatchLeave) GetMatchId() string { // A set of joins and leaves on a particular realtime match. type MatchPresenceEvent struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // User presences that have just joined the match. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // User presences that have just left the match. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` } func (x *MatchPresenceEvent) Reset() { *x = MatchPresenceEvent{} - mi := &file_realtime_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchPresenceEvent) String() string { @@ -2225,7 +2173,7 @@ func (*MatchPresenceEvent) ProtoMessage() {} func (x *MatchPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[16] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2263,7 +2211,10 @@ func (x *MatchPresenceEvent) GetLeaves() []*UserPresence { // Start a new matchmaking process. type MatchmakerAdd struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Minimum total user count to match together. MinCount int32 `protobuf:"varint,1,opt,name=min_count,json=minCount,proto3" json:"min_count,omitempty"` // Maximum total user count to match together. @@ -2271,20 +2222,20 @@ type MatchmakerAdd struct { // Filter query used to identify suitable users. Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,4,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + StringProperties map[string]string `protobuf:"bytes,4,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,5,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + NumericProperties map[string]float64 `protobuf:"bytes,5,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` // Optional multiple of the count that must be satisfied. CountMultiple *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=count_multiple,json=countMultiple,proto3" json:"count_multiple,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *MatchmakerAdd) Reset() { *x = MatchmakerAdd{} - mi := &file_realtime_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchmakerAdd) String() string { @@ -2295,7 +2246,7 @@ func (*MatchmakerAdd) ProtoMessage() {} func (x *MatchmakerAdd) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[17] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2354,12 +2305,15 @@ func (x *MatchmakerAdd) GetCountMultiple() *wrapperspb.Int32Value { // A successful matchmaking result. type MatchmakerMatched struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The matchmaking ticket that has completed. Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` // The match token or match ID to join. // - // Types that are valid to be assigned to Id: + // Types that are assignable to Id: // // *MatchmakerMatched_MatchId // *MatchmakerMatched_Token @@ -2367,16 +2321,16 @@ type MatchmakerMatched struct { // The users that have been matched together, and information about their matchmaking data. Users []*MatchmakerMatched_MatchmakerUser `protobuf:"bytes,4,rep,name=users,proto3" json:"users,omitempty"` // A reference to the current user and their properties. - Self *MatchmakerMatched_MatchmakerUser `protobuf:"bytes,5,opt,name=self,proto3" json:"self,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Self *MatchmakerMatched_MatchmakerUser `protobuf:"bytes,5,opt,name=self,proto3" json:"self,omitempty"` } func (x *MatchmakerMatched) Reset() { *x = MatchmakerMatched{} - mi := &file_realtime_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchmakerMatched) String() string { @@ -2387,7 +2341,7 @@ func (*MatchmakerMatched) ProtoMessage() {} func (x *MatchmakerMatched) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[18] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2409,27 +2363,23 @@ func (x *MatchmakerMatched) GetTicket() string { return "" } -func (x *MatchmakerMatched) GetId() isMatchmakerMatched_Id { - if x != nil { - return x.Id +func (m *MatchmakerMatched) GetId() isMatchmakerMatched_Id { + if m != nil { + return m.Id } return nil } func (x *MatchmakerMatched) GetMatchId() string { - if x != nil { - if x, ok := x.Id.(*MatchmakerMatched_MatchId); ok { - return x.MatchId - } + if x, ok := x.GetId().(*MatchmakerMatched_MatchId); ok { + return x.MatchId } return "" } func (x *MatchmakerMatched) GetToken() string { - if x != nil { - if x, ok := x.Id.(*MatchmakerMatched_Token); ok { - return x.Token - } + if x, ok := x.GetId().(*MatchmakerMatched_Token); ok { + return x.Token } return "" } @@ -2468,18 +2418,21 @@ func (*MatchmakerMatched_Token) isMatchmakerMatched_Id() {} // Cancel an existing ongoing matchmaking process. type MatchmakerRemove struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The ticket to cancel. - Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ticket to cancel. + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` } func (x *MatchmakerRemove) Reset() { *x = MatchmakerRemove{} - mi := &file_realtime_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchmakerRemove) String() string { @@ -2490,7 +2443,7 @@ func (*MatchmakerRemove) ProtoMessage() {} func (x *MatchmakerRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[19] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2514,18 +2467,21 @@ func (x *MatchmakerRemove) GetTicket() string { // A ticket representing a new matchmaking process. type MatchmakerTicket struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The ticket that can be used to cancel matchmaking. - Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ticket that can be used to cancel matchmaking. + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` } func (x *MatchmakerTicket) Reset() { *x = MatchmakerTicket{} - mi := &file_realtime_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchmakerTicket) String() string { @@ -2536,7 +2492,7 @@ func (*MatchmakerTicket) ProtoMessage() {} func (x *MatchmakerTicket) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[20] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2560,18 +2516,21 @@ func (x *MatchmakerTicket) GetTicket() string { // A collection of zero or more notifications. type Notifications struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Collection of notifications. Notifications []*api.Notification `protobuf:"bytes,1,rep,name=notifications,proto3" json:"notifications,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *Notifications) Reset() { *x = Notifications{} - mi := &file_realtime_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Notifications) String() string { @@ -2582,7 +2541,7 @@ func (*Notifications) ProtoMessage() {} func (x *Notifications) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[21] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2606,7 +2565,10 @@ func (x *Notifications) GetNotifications() []*api.Notification { // Incoming information about a party. type Party struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Unique party identifier. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Open flag. @@ -2618,16 +2580,16 @@ type Party struct { // Leader. Leader *UserPresence `protobuf:"bytes,5,opt,name=leader,proto3" json:"leader,omitempty"` // All current party members. - Presences []*UserPresence `protobuf:"bytes,6,rep,name=presences,proto3" json:"presences,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Presences []*UserPresence `protobuf:"bytes,6,rep,name=presences,proto3" json:"presences,omitempty"` } func (x *Party) Reset() { *x = Party{} - mi := &file_realtime_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Party) String() string { @@ -2638,7 +2600,7 @@ func (*Party) ProtoMessage() {} func (x *Party) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[22] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2697,20 +2659,23 @@ func (x *Party) GetPresences() []*UserPresence { // Create a party. type PartyCreate struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Whether or not the party will require join requests to be approved by the party leader. Open bool `protobuf:"varint,1,opt,name=open,proto3" json:"open,omitempty"` // Maximum number of party members. - MaxSize int32 `protobuf:"varint,2,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + MaxSize int32 `protobuf:"varint,2,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` } func (x *PartyCreate) Reset() { *x = PartyCreate{} - mi := &file_realtime_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyCreate) String() string { @@ -2721,7 +2686,7 @@ func (*PartyCreate) ProtoMessage() {} func (x *PartyCreate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[23] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2752,18 +2717,21 @@ func (x *PartyCreate) GetMaxSize() int32 { // Join a party, or request to join if the party is not open. type PartyJoin struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Party ID to join. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Party ID to join. + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` } func (x *PartyJoin) Reset() { *x = PartyJoin{} - mi := &file_realtime_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyJoin) String() string { @@ -2774,7 +2742,7 @@ func (*PartyJoin) ProtoMessage() {} func (x *PartyJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[24] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2798,18 +2766,21 @@ func (x *PartyJoin) GetPartyId() string { // Leave a party. type PartyLeave struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Party ID to leave. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Party ID to leave. + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` } func (x *PartyLeave) Reset() { *x = PartyLeave{} - mi := &file_realtime_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyLeave) String() string { @@ -2820,7 +2791,7 @@ func (*PartyLeave) ProtoMessage() {} func (x *PartyLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[25] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2844,20 +2815,23 @@ func (x *PartyLeave) GetPartyId() string { // Promote a new party leader. type PartyPromote struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID to promote a new leader for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence of an existing party member to promote as the new leader. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` } func (x *PartyPromote) Reset() { *x = PartyPromote{} - mi := &file_realtime_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyPromote) String() string { @@ -2868,7 +2842,7 @@ func (*PartyPromote) ProtoMessage() {} func (x *PartyPromote) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[26] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2899,20 +2873,23 @@ func (x *PartyPromote) GetPresence() *UserPresence { // Announcement of a new party leader. type PartyLeader struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID to announce the new leader for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence of the new party leader. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` } func (x *PartyLeader) Reset() { *x = PartyLeader{} - mi := &file_realtime_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyLeader) String() string { @@ -2923,7 +2900,7 @@ func (*PartyLeader) ProtoMessage() {} func (x *PartyLeader) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[27] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2954,20 +2931,23 @@ func (x *PartyLeader) GetPresence() *UserPresence { // Accept a request to join. type PartyAccept struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID to accept a join request for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence to accept as a party member. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` } func (x *PartyAccept) Reset() { *x = PartyAccept{} - mi := &file_realtime_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyAccept) String() string { @@ -2978,7 +2958,7 @@ func (*PartyAccept) ProtoMessage() {} func (x *PartyAccept) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[28] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3009,20 +2989,23 @@ func (x *PartyAccept) GetPresence() *UserPresence { // Kick a party member, or decline a request to join. type PartyRemove struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID to remove/reject from. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence to remove or reject. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` } func (x *PartyRemove) Reset() { *x = PartyRemove{} - mi := &file_realtime_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyRemove) String() string { @@ -3033,7 +3016,7 @@ func (*PartyRemove) ProtoMessage() {} func (x *PartyRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[29] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3064,18 +3047,21 @@ func (x *PartyRemove) GetPresence() *UserPresence { // End a party, kicking all party members and closing it. type PartyClose struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Party ID to close. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Party ID to close. + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` } func (x *PartyClose) Reset() { *x = PartyClose{} - mi := &file_realtime_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyClose) String() string { @@ -3086,7 +3072,7 @@ func (*PartyClose) ProtoMessage() {} func (x *PartyClose) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[30] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3110,18 +3096,21 @@ func (x *PartyClose) GetPartyId() string { // Request a list of pending join requests for a party. type PartyJoinRequestList struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Party ID to get a list of join requests for. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Party ID to get a list of join requests for. + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` } func (x *PartyJoinRequestList) Reset() { *x = PartyJoinRequestList{} - mi := &file_realtime_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyJoinRequestList) String() string { @@ -3132,7 +3121,7 @@ func (*PartyJoinRequestList) ProtoMessage() {} func (x *PartyJoinRequestList) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[31] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3156,20 +3145,23 @@ func (x *PartyJoinRequestList) GetPartyId() string { // Incoming notification for one or more new presences attempting to join the party. type PartyJoinRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID these presences are attempting to join. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Presences attempting to join. - Presences []*UserPresence `protobuf:"bytes,2,rep,name=presences,proto3" json:"presences,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Presences []*UserPresence `protobuf:"bytes,2,rep,name=presences,proto3" json:"presences,omitempty"` } func (x *PartyJoinRequest) Reset() { *x = PartyJoinRequest{} - mi := &file_realtime_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyJoinRequest) String() string { @@ -3180,7 +3172,7 @@ func (*PartyJoinRequest) ProtoMessage() {} func (x *PartyJoinRequest) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[32] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3211,7 +3203,10 @@ func (x *PartyJoinRequest) GetPresences() []*UserPresence { // Begin matchmaking as a party. type PartyMatchmakerAdd struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Minimum total user count to match together. @@ -3221,20 +3216,20 @@ type PartyMatchmakerAdd struct { // Filter query used to identify suitable users. Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` // Optional multiple of the count that must be satisfied. CountMultiple *wrapperspb.Int32Value `protobuf:"bytes,7,opt,name=count_multiple,json=countMultiple,proto3" json:"count_multiple,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache } func (x *PartyMatchmakerAdd) Reset() { *x = PartyMatchmakerAdd{} - mi := &file_realtime_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyMatchmakerAdd) String() string { @@ -3245,7 +3240,7 @@ func (*PartyMatchmakerAdd) ProtoMessage() {} func (x *PartyMatchmakerAdd) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[33] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3311,20 +3306,23 @@ func (x *PartyMatchmakerAdd) GetCountMultiple() *wrapperspb.Int32Value { // Cancel a party matchmaking process using a ticket. type PartyMatchmakerRemove struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The ticket to cancel. - Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` } func (x *PartyMatchmakerRemove) Reset() { *x = PartyMatchmakerRemove{} - mi := &file_realtime_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyMatchmakerRemove) String() string { @@ -3335,7 +3333,7 @@ func (*PartyMatchmakerRemove) ProtoMessage() {} func (x *PartyMatchmakerRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[34] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3366,20 +3364,23 @@ func (x *PartyMatchmakerRemove) GetTicket() string { // A response from starting a new party matchmaking process. type PartyMatchmakerTicket struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The ticket that can be used to cancel matchmaking. - Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` } func (x *PartyMatchmakerTicket) Reset() { *x = PartyMatchmakerTicket{} - mi := &file_realtime_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyMatchmakerTicket) String() string { @@ -3390,7 +3391,7 @@ func (*PartyMatchmakerTicket) ProtoMessage() {} func (x *PartyMatchmakerTicket) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[35] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3421,7 +3422,10 @@ func (x *PartyMatchmakerTicket) GetTicket() string { // Incoming party data delivered from the server. type PartyData struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // A reference to the user presence that sent this data, if any. @@ -3429,16 +3433,16 @@ type PartyData struct { // Op code value. OpCode int64 `protobuf:"varint,3,opt,name=op_code,json=opCode,proto3" json:"op_code,omitempty"` // Data payload, if any. - Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` } func (x *PartyData) Reset() { *x = PartyData{} - mi := &file_realtime_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyData) String() string { @@ -3449,7 +3453,7 @@ func (*PartyData) ProtoMessage() {} func (x *PartyData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[36] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3494,22 +3498,25 @@ func (x *PartyData) GetData() []byte { // Send data to a party. type PartyDataSend struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Party ID to send to. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Op code value. OpCode int64 `protobuf:"varint,2,opt,name=op_code,json=opCode,proto3" json:"op_code,omitempty"` // Data payload, if any. - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` } func (x *PartyDataSend) Reset() { *x = PartyDataSend{} - mi := &file_realtime_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyDataSend) String() string { @@ -3520,7 +3527,7 @@ func (*PartyDataSend) ProtoMessage() {} func (x *PartyDataSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[37] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3558,22 +3565,25 @@ func (x *PartyDataSend) GetData() []byte { // Presence update for a particular party. type PartyPresenceEvent struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // User presences that have just joined the party. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // User presences that have just left the party. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` } func (x *PartyPresenceEvent) Reset() { *x = PartyPresenceEvent{} - mi := &file_realtime_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *PartyPresenceEvent) String() string { @@ -3584,7 +3594,7 @@ func (*PartyPresenceEvent) ProtoMessage() {} func (x *PartyPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[38] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3622,16 +3632,18 @@ func (x *PartyPresenceEvent) GetLeaves() []*UserPresence { // Application-level heartbeat and connection check. type Ping struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } func (x *Ping) Reset() { *x = Ping{} - mi := &file_realtime_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Ping) String() string { @@ -3642,7 +3654,7 @@ func (*Ping) ProtoMessage() {} func (x *Ping) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[39] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3659,16 +3671,18 @@ func (*Ping) Descriptor() ([]byte, []int) { // Application-level heartbeat and connection check response. type Pong struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } func (x *Pong) Reset() { *x = Pong{} - mi := &file_realtime_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Pong) String() string { @@ -3679,7 +3693,7 @@ func (*Pong) ProtoMessage() {} func (x *Pong) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[40] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3696,18 +3710,21 @@ func (*Pong) Descriptor() ([]byte, []int) { // A snapshot of statuses for some set of users. type Status struct { - state protoimpl.MessageState `protogen:"open.v1"` - // User statuses. - Presences []*UserPresence `protobuf:"bytes,1,rep,name=presences,proto3" json:"presences,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // User statuses. + Presences []*UserPresence `protobuf:"bytes,1,rep,name=presences,proto3" json:"presences,omitempty"` } func (x *Status) Reset() { *x = Status{} - mi := &file_realtime_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Status) String() string { @@ -3718,7 +3735,7 @@ func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[41] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3742,20 +3759,23 @@ func (x *Status) GetPresences() []*UserPresence { // Start receiving status updates for some set of users. type StatusFollow struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // User IDs to follow. UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` // Usernames to follow. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` } func (x *StatusFollow) Reset() { *x = StatusFollow{} - mi := &file_realtime_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StatusFollow) String() string { @@ -3766,7 +3786,7 @@ func (*StatusFollow) ProtoMessage() {} func (x *StatusFollow) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[42] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3797,20 +3817,23 @@ func (x *StatusFollow) GetUsernames() []string { // A batch of status updates for a given user. type StatusPresenceEvent struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // New statuses for the user. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // Previous statuses for the user. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` } func (x *StatusPresenceEvent) Reset() { *x = StatusPresenceEvent{} - mi := &file_realtime_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StatusPresenceEvent) String() string { @@ -3821,7 +3844,7 @@ func (*StatusPresenceEvent) ProtoMessage() {} func (x *StatusPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[43] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3852,18 +3875,21 @@ func (x *StatusPresenceEvent) GetLeaves() []*UserPresence { // Stop receiving status updates for some set of users. type StatusUnfollow struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Users to unfollow. - UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Users to unfollow. + UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` } func (x *StatusUnfollow) Reset() { *x = StatusUnfollow{} - mi := &file_realtime_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StatusUnfollow) String() string { @@ -3874,7 +3900,7 @@ func (*StatusUnfollow) ProtoMessage() {} func (x *StatusUnfollow) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[44] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3898,18 +3924,21 @@ func (x *StatusUnfollow) GetUserIds() []string { // Set the user's own status. type StatusUpdate struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Status string to set, if not present the user will appear offline. - Status *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Status string to set, if not present the user will appear offline. + Status *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` } func (x *StatusUpdate) Reset() { *x = StatusUpdate{} - mi := &file_realtime_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StatusUpdate) String() string { @@ -3920,7 +3949,7 @@ func (*StatusUpdate) ProtoMessage() {} func (x *StatusUpdate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[45] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3944,7 +3973,10 @@ func (x *StatusUpdate) GetStatus() *wrapperspb.StringValue { // Represents identifying information for a stream. type Stream struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Mode identifies the type of stream. Mode int32 `protobuf:"varint,1,opt,name=mode,proto3" json:"mode,omitempty"` // Subject is the primary identifier, if any. @@ -3952,16 +3984,16 @@ type Stream struct { // Subcontext is a secondary identifier, if any. Subcontext string `protobuf:"bytes,3,opt,name=subcontext,proto3" json:"subcontext,omitempty"` // The label is an arbitrary identifying string, if the stream has one. - Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"` } func (x *Stream) Reset() { *x = Stream{} - mi := &file_realtime_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Stream) String() string { @@ -3972,7 +4004,7 @@ func (*Stream) ProtoMessage() {} func (x *Stream) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[46] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4017,7 +4049,10 @@ func (x *Stream) GetLabel() string { // A data message delivered over a stream. type StreamData struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The stream this data message relates to. Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` // The sender, if any. @@ -4025,16 +4060,16 @@ type StreamData struct { // Arbitrary contents of the data message. Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // True if this data was delivered reliably, false otherwise. - Reliable bool `protobuf:"varint,4,opt,name=reliable,proto3" json:"reliable,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Reliable bool `protobuf:"varint,4,opt,name=reliable,proto3" json:"reliable,omitempty"` } func (x *StreamData) Reset() { *x = StreamData{} - mi := &file_realtime_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StreamData) String() string { @@ -4045,7 +4080,7 @@ func (*StreamData) ProtoMessage() {} func (x *StreamData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[47] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4090,22 +4125,25 @@ func (x *StreamData) GetReliable() bool { // A set of joins and leaves on a particular stream. type StreamPresenceEvent struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The stream this event relates to. Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` // Presences joining the stream as part of this event, if any. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // Presences leaving the stream as part of this event, if any. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` } func (x *StreamPresenceEvent) Reset() { *x = StreamPresenceEvent{} - mi := &file_realtime_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StreamPresenceEvent) String() string { @@ -4116,7 +4154,7 @@ func (*StreamPresenceEvent) ProtoMessage() {} func (x *StreamPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[48] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4154,7 +4192,10 @@ func (x *StreamPresenceEvent) GetLeaves() []*UserPresence { // A user session associated to a stream, usually through a list operation or a join/leave event. type UserPresence struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The user this presence belongs to. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // A unique session ID identifying the particular connection, because the user may have many. @@ -4164,16 +4205,16 @@ type UserPresence struct { // Whether this presence generates persistent data/messages, if applicable for the stream type. Persistence bool `protobuf:"varint,4,opt,name=persistence,proto3" json:"persistence,omitempty"` // A user-set status message for this stream, if applicable. - Status *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Status *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` } func (x *UserPresence) Reset() { *x = UserPresence{} - mi := &file_realtime_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *UserPresence) String() string { @@ -4184,7 +4225,7 @@ func (*UserPresence) ProtoMessage() {} func (x *UserPresence) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[49] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4235,24 +4276,27 @@ func (x *UserPresence) GetStatus() *wrapperspb.StringValue { } type MatchmakerMatched_MatchmakerUser struct { - state protoimpl.MessageState `protogen:"open.v1"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // User info. Presence *UserPresence `protobuf:"bytes,1,opt,name=presence,proto3" json:"presence,omitempty"` // Party identifier, if this user was matched as a party member. PartyId string `protobuf:"bytes,2,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` } func (x *MatchmakerMatched_MatchmakerUser) Reset() { *x = MatchmakerMatched_MatchmakerUser{} - mi := &file_realtime_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_realtime_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *MatchmakerMatched_MatchmakerUser) String() string { @@ -4263,7 +4307,7 @@ func (*MatchmakerMatched_MatchmakerUser) ProtoMessage() {} func (x *MatchmakerMatched_MatchmakerUser) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[54] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4308,346 +4352,735 @@ func (x *MatchmakerMatched_MatchmakerUser) GetNumericProperties() map[string]flo var File_realtime_proto protoreflect.FileDescriptor -const file_realtime_proto_rawDesc = "" + - "\n" + - "\x0erealtime.proto\x12\x0fnakama.realtime\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\rapi/api.proto\"\xf4\x1b\n" + - "\bEnvelope\x12\x10\n" + - "\x03cid\x18\x01 \x01(\tR\x03cid\x124\n" + - "\achannel\x18\x02 \x01(\v2\x18.nakama.realtime.ChannelH\x00R\achannel\x12A\n" + - "\fchannel_join\x18\x03 \x01(\v2\x1c.nakama.realtime.ChannelJoinH\x00R\vchannelJoin\x12D\n" + - "\rchannel_leave\x18\x04 \x01(\v2\x1d.nakama.realtime.ChannelLeaveH\x00R\fchannelLeave\x12E\n" + - "\x0fchannel_message\x18\x05 \x01(\v2\x1a.nakama.api.ChannelMessageH\x00R\x0echannelMessage\x12T\n" + - "\x13channel_message_ack\x18\x06 \x01(\v2\".nakama.realtime.ChannelMessageAckH\x00R\x11channelMessageAck\x12W\n" + - "\x14channel_message_send\x18\a \x01(\v2#.nakama.realtime.ChannelMessageSendH\x00R\x12channelMessageSend\x12]\n" + - "\x16channel_message_update\x18\b \x01(\v2%.nakama.realtime.ChannelMessageUpdateH\x00R\x14channelMessageUpdate\x12]\n" + - "\x16channel_message_remove\x18\t \x01(\v2%.nakama.realtime.ChannelMessageRemoveH\x00R\x14channelMessageRemove\x12]\n" + - "\x16channel_presence_event\x18\n" + - " \x01(\v2%.nakama.realtime.ChannelPresenceEventH\x00R\x14channelPresenceEvent\x12.\n" + - "\x05error\x18\v \x01(\v2\x16.nakama.realtime.ErrorH\x00R\x05error\x12.\n" + - "\x05match\x18\f \x01(\v2\x16.nakama.realtime.MatchH\x00R\x05match\x12A\n" + - "\fmatch_create\x18\r \x01(\v2\x1c.nakama.realtime.MatchCreateH\x00R\vmatchCreate\x12;\n" + - "\n" + - "match_data\x18\x0e \x01(\v2\x1a.nakama.realtime.MatchDataH\x00R\tmatchData\x12H\n" + - "\x0fmatch_data_send\x18\x0f \x01(\v2\x1e.nakama.realtime.MatchDataSendH\x00R\rmatchDataSend\x12;\n" + - "\n" + - "match_join\x18\x10 \x01(\v2\x1a.nakama.realtime.MatchJoinH\x00R\tmatchJoin\x12>\n" + - "\vmatch_leave\x18\x11 \x01(\v2\x1b.nakama.realtime.MatchLeaveH\x00R\n" + - "matchLeave\x12W\n" + - "\x14match_presence_event\x18\x12 \x01(\v2#.nakama.realtime.MatchPresenceEventH\x00R\x12matchPresenceEvent\x12G\n" + - "\x0ematchmaker_add\x18\x13 \x01(\v2\x1e.nakama.realtime.MatchmakerAddH\x00R\rmatchmakerAdd\x12S\n" + - "\x12matchmaker_matched\x18\x14 \x01(\v2\".nakama.realtime.MatchmakerMatchedH\x00R\x11matchmakerMatched\x12P\n" + - "\x11matchmaker_remove\x18\x15 \x01(\v2!.nakama.realtime.MatchmakerRemoveH\x00R\x10matchmakerRemove\x12P\n" + - "\x11matchmaker_ticket\x18\x16 \x01(\v2!.nakama.realtime.MatchmakerTicketH\x00R\x10matchmakerTicket\x12F\n" + - "\rnotifications\x18\x17 \x01(\v2\x1e.nakama.realtime.NotificationsH\x00R\rnotifications\x12#\n" + - "\x03rpc\x18\x18 \x01(\v2\x0f.nakama.api.RpcH\x00R\x03rpc\x121\n" + - "\x06status\x18\x19 \x01(\v2\x17.nakama.realtime.StatusH\x00R\x06status\x12D\n" + - "\rstatus_follow\x18\x1a \x01(\v2\x1d.nakama.realtime.StatusFollowH\x00R\fstatusFollow\x12Z\n" + - "\x15status_presence_event\x18\x1b \x01(\v2$.nakama.realtime.StatusPresenceEventH\x00R\x13statusPresenceEvent\x12J\n" + - "\x0fstatus_unfollow\x18\x1c \x01(\v2\x1f.nakama.realtime.StatusUnfollowH\x00R\x0estatusUnfollow\x12D\n" + - "\rstatus_update\x18\x1d \x01(\v2\x1d.nakama.realtime.StatusUpdateH\x00R\fstatusUpdate\x12>\n" + - "\vstream_data\x18\x1e \x01(\v2\x1b.nakama.realtime.StreamDataH\x00R\n" + - "streamData\x12Z\n" + - "\x15stream_presence_event\x18\x1f \x01(\v2$.nakama.realtime.StreamPresenceEventH\x00R\x13streamPresenceEvent\x12+\n" + - "\x04ping\x18 \x01(\v2\x15.nakama.realtime.PingH\x00R\x04ping\x12+\n" + - "\x04pong\x18! \x01(\v2\x15.nakama.realtime.PongH\x00R\x04pong\x12.\n" + - "\x05party\x18\" \x01(\v2\x16.nakama.realtime.PartyH\x00R\x05party\x12A\n" + - "\fparty_create\x18# \x01(\v2\x1c.nakama.realtime.PartyCreateH\x00R\vpartyCreate\x12;\n" + - "\n" + - "party_join\x18$ \x01(\v2\x1a.nakama.realtime.PartyJoinH\x00R\tpartyJoin\x12>\n" + - "\vparty_leave\x18% \x01(\v2\x1b.nakama.realtime.PartyLeaveH\x00R\n" + - "partyLeave\x12D\n" + - "\rparty_promote\x18& \x01(\v2\x1d.nakama.realtime.PartyPromoteH\x00R\fpartyPromote\x12A\n" + - "\fparty_leader\x18' \x01(\v2\x1c.nakama.realtime.PartyLeaderH\x00R\vpartyLeader\x12A\n" + - "\fparty_accept\x18( \x01(\v2\x1c.nakama.realtime.PartyAcceptH\x00R\vpartyAccept\x12A\n" + - "\fparty_remove\x18) \x01(\v2\x1c.nakama.realtime.PartyRemoveH\x00R\vpartyRemove\x12>\n" + - "\vparty_close\x18* \x01(\v2\x1b.nakama.realtime.PartyCloseH\x00R\n" + - "partyClose\x12^\n" + - "\x17party_join_request_list\x18+ \x01(\v2%.nakama.realtime.PartyJoinRequestListH\x00R\x14partyJoinRequestList\x12Q\n" + - "\x12party_join_request\x18, \x01(\v2!.nakama.realtime.PartyJoinRequestH\x00R\x10partyJoinRequest\x12W\n" + - "\x14party_matchmaker_add\x18- \x01(\v2#.nakama.realtime.PartyMatchmakerAddH\x00R\x12partyMatchmakerAdd\x12`\n" + - "\x17party_matchmaker_remove\x18. \x01(\v2&.nakama.realtime.PartyMatchmakerRemoveH\x00R\x15partyMatchmakerRemove\x12`\n" + - "\x17party_matchmaker_ticket\x18/ \x01(\v2&.nakama.realtime.PartyMatchmakerTicketH\x00R\x15partyMatchmakerTicket\x12;\n" + - "\n" + - "party_data\x180 \x01(\v2\x1a.nakama.realtime.PartyDataH\x00R\tpartyData\x12H\n" + - "\x0fparty_data_send\x181 \x01(\v2\x1e.nakama.realtime.PartyDataSendH\x00R\rpartyDataSend\x12W\n" + - "\x14party_presence_event\x182 \x01(\v2#.nakama.realtime.PartyPresenceEventH\x00R\x12partyPresenceEventB\t\n" + - "\amessage\"\x81\x02\n" + - "\aChannel\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12;\n" + - "\tpresences\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x121\n" + - "\x04self\x18\x03 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\x12\x1b\n" + - "\troom_name\x18\x04 \x01(\tR\broomName\x12\x19\n" + - "\bgroup_id\x18\x05 \x01(\tR\agroupId\x12\x1e\n" + - "\vuser_id_one\x18\x06 \x01(\tR\tuserIdOne\x12\x1e\n" + - "\vuser_id_two\x18\a \x01(\tR\tuserIdTwo\"\xf2\x01\n" + - "\vChannelJoin\x12\x16\n" + - "\x06target\x18\x01 \x01(\tR\x06target\x12\x12\n" + - "\x04type\x18\x02 \x01(\x05R\x04type\x12<\n" + - "\vpersistence\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\vpersistence\x122\n" + - "\x06hidden\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x06hidden\"E\n" + - "\x04Type\x12\x14\n" + - "\x10TYPE_UNSPECIFIED\x10\x00\x12\b\n" + - "\x04ROOM\x10\x01\x12\x12\n" + - "\x0eDIRECT_MESSAGE\x10\x02\x12\t\n" + - "\x05GROUP\x10\x03\"-\n" + - "\fChannelLeave\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\"\xcc\x03\n" + - "\x11ChannelMessageAck\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + - "\n" + - "message_id\x18\x02 \x01(\tR\tmessageId\x12/\n" + - "\x04code\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x04code\x12\x1a\n" + - "\busername\x18\x04 \x01(\tR\busername\x12;\n" + - "\vcreate_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "createTime\x12;\n" + - "\vupdate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "updateTime\x12:\n" + - "\n" + - "persistent\x18\a \x01(\v2\x1a.google.protobuf.BoolValueR\n" + - "persistent\x12\x1b\n" + - "\troom_name\x18\b \x01(\tR\broomName\x12\x19\n" + - "\bgroup_id\x18\t \x01(\tR\agroupId\x12\x1e\n" + - "\vuser_id_one\x18\n" + - " \x01(\tR\tuserIdOne\x12\x1e\n" + - "\vuser_id_two\x18\v \x01(\tR\tuserIdTwo\"M\n" + - "\x12ChannelMessageSend\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x18\n" + - "\acontent\x18\x02 \x01(\tR\acontent\"n\n" + - "\x14ChannelMessageUpdate\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + - "\n" + - "message_id\x18\x02 \x01(\tR\tmessageId\x12\x18\n" + - "\acontent\x18\x03 \x01(\tR\acontent\"T\n" + - "\x14ChannelMessageRemove\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + - "\n" + - "message_id\x18\x02 \x01(\tR\tmessageId\"\x99\x02\n" + - "\x14ChannelPresenceEvent\x12\x1d\n" + - "\n" + - "channel_id\x18\x01 \x01(\tR\tchannelId\x123\n" + - "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + - "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\x12\x1b\n" + - "\troom_name\x18\x04 \x01(\tR\broomName\x12\x19\n" + - "\bgroup_id\x18\x05 \x01(\tR\agroupId\x12\x1e\n" + - "\vuser_id_one\x18\x06 \x01(\tR\tuserIdOne\x12\x1e\n" + - "\vuser_id_two\x18\a \x01(\tR\tuserIdTwo\"\xfc\x02\n" + - "\x05Error\x12\x12\n" + - "\x04code\x18\x01 \x01(\x05R\x04code\x12\x18\n" + - "\amessage\x18\x02 \x01(\tR\amessage\x12=\n" + - "\acontext\x18\x03 \x03(\v2#.nakama.realtime.Error.ContextEntryR\acontext\x1a:\n" + - "\fContextEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc9\x01\n" + - "\x04Code\x12\x15\n" + - "\x11RUNTIME_EXCEPTION\x10\x00\x12\x18\n" + - "\x14UNRECOGNIZED_PAYLOAD\x10\x01\x12\x13\n" + - "\x0fMISSING_PAYLOAD\x10\x02\x12\r\n" + - "\tBAD_INPUT\x10\x03\x12\x13\n" + - "\x0fMATCH_NOT_FOUND\x10\x04\x12\x17\n" + - "\x13MATCH_JOIN_REJECTED\x10\x05\x12\x1e\n" + - "\x1aRUNTIME_FUNCTION_NOT_FOUND\x10\x06\x12\x1e\n" + - "\x1aRUNTIME_FUNCTION_EXCEPTION\x10\a\"\x80\x02\n" + - "\x05Match\x12\x19\n" + - "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12$\n" + - "\rauthoritative\x18\x02 \x01(\bR\rauthoritative\x122\n" + - "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x12\x12\n" + - "\x04size\x18\x04 \x01(\x05R\x04size\x12;\n" + - "\tpresences\x18\x05 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x121\n" + - "\x04self\x18\x06 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\"!\n" + - "\vMatchCreate\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\"\xaa\x01\n" + - "\tMatchData\x12\x19\n" + - "\bmatch_id\x18\x01 \x01(\tR\amatchId\x129\n" + - "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x17\n" + - "\aop_code\x18\x03 \x01(\x03R\x06opCode\x12\x12\n" + - "\x04data\x18\x04 \x01(\fR\x04data\x12\x1a\n" + - "\breliable\x18\x05 \x01(\bR\breliable\"\xb0\x01\n" + - "\rMatchDataSend\x12\x19\n" + - "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12\x17\n" + - "\aop_code\x18\x02 \x01(\x03R\x06opCode\x12\x12\n" + - "\x04data\x18\x03 \x01(\fR\x04data\x12;\n" + - "\tpresences\x18\x04 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x12\x1a\n" + - "\breliable\x18\x05 \x01(\bR\breliable\"\xc9\x01\n" + - "\tMatchJoin\x12\x1b\n" + - "\bmatch_id\x18\x01 \x01(\tH\x00R\amatchId\x12\x16\n" + - "\x05token\x18\x02 \x01(\tH\x00R\x05token\x12D\n" + - "\bmetadata\x18\x03 \x03(\v2(.nakama.realtime.MatchJoin.MetadataEntryR\bmetadata\x1a;\n" + - "\rMetadataEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x04\n" + - "\x02id\"'\n" + - "\n" + - "MatchLeave\x12\x19\n" + - "\bmatch_id\x18\x01 \x01(\tR\amatchId\"\x9b\x01\n" + - "\x12MatchPresenceEvent\x12\x19\n" + - "\bmatch_id\x18\x01 \x01(\tR\amatchId\x123\n" + - "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + - "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\xf7\x03\n" + - "\rMatchmakerAdd\x12\x1b\n" + - "\tmin_count\x18\x01 \x01(\x05R\bminCount\x12\x1b\n" + - "\tmax_count\x18\x02 \x01(\x05R\bmaxCount\x12\x14\n" + - "\x05query\x18\x03 \x01(\tR\x05query\x12a\n" + - "\x11string_properties\x18\x04 \x03(\v24.nakama.realtime.MatchmakerAdd.StringPropertiesEntryR\x10stringProperties\x12d\n" + - "\x12numeric_properties\x18\x05 \x03(\v25.nakama.realtime.MatchmakerAdd.NumericPropertiesEntryR\x11numericProperties\x12B\n" + - "\x0ecount_multiple\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\rcountMultiple\x1aC\n" + - "\x15StringPropertiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + - "\x16NumericPropertiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01\"\xd9\x05\n" + - "\x11MatchmakerMatched\x12\x16\n" + - "\x06ticket\x18\x01 \x01(\tR\x06ticket\x12\x1b\n" + - "\bmatch_id\x18\x02 \x01(\tH\x00R\amatchId\x12\x16\n" + - "\x05token\x18\x03 \x01(\tH\x00R\x05token\x12G\n" + - "\x05users\x18\x04 \x03(\v21.nakama.realtime.MatchmakerMatched.MatchmakerUserR\x05users\x12E\n" + - "\x04self\x18\x05 \x01(\v21.nakama.realtime.MatchmakerMatched.MatchmakerUserR\x04self\x1a\xe0\x03\n" + - "\x0eMatchmakerUser\x129\n" + - "\bpresence\x18\x01 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x19\n" + - "\bparty_id\x18\x02 \x01(\tR\apartyId\x12t\n" + - "\x11string_properties\x18\x05 \x03(\v2G.nakama.realtime.MatchmakerMatched.MatchmakerUser.StringPropertiesEntryR\x10stringProperties\x12w\n" + - "\x12numeric_properties\x18\x06 \x03(\v2H.nakama.realtime.MatchmakerMatched.MatchmakerUser.NumericPropertiesEntryR\x11numericProperties\x1aC\n" + - "\x15StringPropertiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + - "\x16NumericPropertiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01B\x04\n" + - "\x02id\"*\n" + - "\x10MatchmakerRemove\x12\x16\n" + - "\x06ticket\x18\x01 \x01(\tR\x06ticket\"*\n" + - "\x10MatchmakerTicket\x12\x16\n" + - "\x06ticket\x18\x01 \x01(\tR\x06ticket\"O\n" + - "\rNotifications\x12>\n" + - "\rnotifications\x18\x01 \x03(\v2\x18.nakama.api.NotificationR\rnotifications\"\xf8\x01\n" + - "\x05Party\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x12\n" + - "\x04open\x18\x02 \x01(\bR\x04open\x12\x19\n" + - "\bmax_size\x18\x03 \x01(\x05R\amaxSize\x121\n" + - "\x04self\x18\x04 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\x125\n" + - "\x06leader\x18\x05 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x06leader\x12;\n" + - "\tpresences\x18\x06 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"<\n" + - "\vPartyCreate\x12\x12\n" + - "\x04open\x18\x01 \x01(\bR\x04open\x12\x19\n" + - "\bmax_size\x18\x02 \x01(\x05R\amaxSize\"&\n" + - "\tPartyJoin\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\"'\n" + - "\n" + - "PartyLeave\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\"d\n" + - "\fPartyPromote\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + - "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + - "\vPartyLeader\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + - "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + - "\vPartyAccept\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + - "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + - "\vPartyRemove\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + - "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"'\n" + - "\n" + - "PartyClose\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\"1\n" + - "\x14PartyJoinRequestList\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\"j\n" + - "\x10PartyJoinRequest\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x12;\n" + - "\tpresences\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"\xa1\x04\n" + - "\x12PartyMatchmakerAdd\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x1b\n" + - "\tmin_count\x18\x02 \x01(\x05R\bminCount\x12\x1b\n" + - "\tmax_count\x18\x03 \x01(\x05R\bmaxCount\x12\x14\n" + - "\x05query\x18\x04 \x01(\tR\x05query\x12f\n" + - "\x11string_properties\x18\x05 \x03(\v29.nakama.realtime.PartyMatchmakerAdd.StringPropertiesEntryR\x10stringProperties\x12i\n" + - "\x12numeric_properties\x18\x06 \x03(\v2:.nakama.realtime.PartyMatchmakerAdd.NumericPropertiesEntryR\x11numericProperties\x12B\n" + - "\x0ecount_multiple\x18\a \x01(\v2\x1b.google.protobuf.Int32ValueR\rcountMultiple\x1aC\n" + - "\x15StringPropertiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + - "\x16NumericPropertiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01\"J\n" + - "\x15PartyMatchmakerRemove\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x16\n" + - "\x06ticket\x18\x02 \x01(\tR\x06ticket\"J\n" + - "\x15PartyMatchmakerTicket\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x16\n" + - "\x06ticket\x18\x02 \x01(\tR\x06ticket\"\x8e\x01\n" + - "\tPartyData\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + - "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x17\n" + - "\aop_code\x18\x03 \x01(\x03R\x06opCode\x12\x12\n" + - "\x04data\x18\x04 \x01(\fR\x04data\"W\n" + - "\rPartyDataSend\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x17\n" + - "\aop_code\x18\x02 \x01(\x03R\x06opCode\x12\x12\n" + - "\x04data\x18\x03 \x01(\fR\x04data\"\x9b\x01\n" + - "\x12PartyPresenceEvent\x12\x19\n" + - "\bparty_id\x18\x01 \x01(\tR\apartyId\x123\n" + - "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + - "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\x06\n" + - "\x04Ping\"\x06\n" + - "\x04Pong\"E\n" + - "\x06Status\x12;\n" + - "\tpresences\x18\x01 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"G\n" + - "\fStatusFollow\x12\x19\n" + - "\buser_ids\x18\x01 \x03(\tR\auserIds\x12\x1c\n" + - "\tusernames\x18\x02 \x03(\tR\tusernames\"\x81\x01\n" + - "\x13StatusPresenceEvent\x123\n" + - "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + - "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"+\n" + - "\x0eStatusUnfollow\x12\x19\n" + - "\buser_ids\x18\x01 \x03(\tR\auserIds\"D\n" + - "\fStatusUpdate\x124\n" + - "\x06status\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x06status\"l\n" + - "\x06Stream\x12\x12\n" + - "\x04mode\x18\x01 \x01(\x05R\x04mode\x12\x18\n" + - "\asubject\x18\x02 \x01(\tR\asubject\x12\x1e\n" + - "\n" + - "subcontext\x18\x03 \x01(\tR\n" + - "subcontext\x12\x14\n" + - "\x05label\x18\x04 \x01(\tR\x05label\"\xa4\x01\n" + - "\n" + - "StreamData\x12/\n" + - "\x06stream\x18\x01 \x01(\v2\x17.nakama.realtime.StreamR\x06stream\x125\n" + - "\x06sender\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x06sender\x12\x12\n" + - "\x04data\x18\x03 \x01(\tR\x04data\x12\x1a\n" + - "\breliable\x18\x04 \x01(\bR\breliable\"\xb2\x01\n" + - "\x13StreamPresenceEvent\x12/\n" + - "\x06stream\x18\x01 \x01(\v2\x17.nakama.realtime.StreamR\x06stream\x123\n" + - "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + - "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\xba\x01\n" + - "\fUserPresence\x12\x17\n" + - "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + - "\n" + - "session_id\x18\x02 \x01(\tR\tsessionId\x12\x1a\n" + - "\busername\x18\x03 \x01(\tR\busername\x12 \n" + - "\vpersistence\x18\x04 \x01(\bR\vpersistence\x124\n" + - "\x06status\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\x06statusBl\n" + - "\x1bcom.heroiclabs.nakama.rtapiB\x0eNakamaRealtimeP\x01Z)github.com/heroiclabs/nakama-common/rtapi\xaa\x02\x0fNakama.Protobufb\x06proto3" +var file_realtime_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x0f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x0d, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xf4, 0x1b, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x69, 0x64, + 0x12, 0x34, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x41, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, + 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, + 0x45, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x57, 0x0a, 0x14, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x48, + 0x00, 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x14, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, 0x52, 0x14, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x3b, 0x0a, 0x0a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x09, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x3e, 0x0a, 0x0b, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x12, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, + 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, + 0x12, 0x50, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, + 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, + 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, + 0x48, 0x00, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x03, + 0x72, 0x70, 0x63, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x70, 0x63, 0x48, 0x00, 0x52, 0x03, 0x72, 0x70, + 0x63, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x66, + 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x5a, 0x0a, 0x15, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x13, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x5f, 0x75, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x48, 0x00, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x5a, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x20, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, + 0x67, 0x12, 0x2b, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x2e, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x41, + 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x23, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, + 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, + 0x6e, 0x48, 0x00, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x3e, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x25, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, + 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x44, + 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, + 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, + 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x3e, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x2a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, + 0x00, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x5e, 0x0a, + 0x17, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x51, 0x0a, + 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x57, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, + 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x60, 0x0a, 0x17, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x48, 0x00, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x60, 0x0a, 0x17, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, + 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, + 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, + 0x63, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, + 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x30, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, + 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0f, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x31, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x65, 0x6e, 0x64, 0x12, 0x57, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x32, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x07, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, + 0x73, 0x65, 0x6c, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0b, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, 0xf2, 0x01, 0x0a, + 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x45, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4f, 0x4d, + 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x45, 0x53, + 0x53, 0x41, 0x47, 0x45, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, + 0x03, 0x22, 0x2d, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, + 0x22, 0xcc, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x70, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, + 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, + 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, + 0x4d, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x6e, + 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x54, + 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x49, 0x64, 0x22, 0x99, 0x02, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, + 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, + 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, + 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, + 0x22, 0xfc, 0x02, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x11, + 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x4e, 0x52, 0x45, 0x43, 0x4f, 0x47, 0x4e, 0x49, + 0x5a, 0x45, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, + 0x0f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x41, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, + 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, + 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, + 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, + 0x1e, 0x0a, 0x1a, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x06, 0x12, + 0x1e, 0x0a, 0x1a, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x22, + 0x80, 0x02, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x31, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x73, 0x65, + 0x6c, 0x66, 0x22, 0x21, 0x0a, 0x0b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x39, + 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x65, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x09, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4a, + 0x6f, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x44, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, + 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x04, 0x0a, 0x02, 0x69, + 0x64, 0x22, 0x27, 0x0a, 0x0a, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, + 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, + 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0xf7, 0x03, 0x0a, 0x0d, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, + 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, + 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x61, 0x0a, 0x11, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x64, 0x0a, + 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, + 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xd9, 0x05, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, + 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, + 0x12, 0x1b, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x47, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, + 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, + 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x45, + 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6e, + 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, + 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x04, 0x73, 0x65, 0x6c, 0x66, 0x1a, 0xe0, 0x03, 0x0a, 0x0e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, + 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x74, + 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x48, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, + 0x73, 0x65, 0x72, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x43, 0x0a, + 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x04, 0x0a, 0x02, 0x69, 0x64, 0x22, 0x2a, + 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x2a, 0x0a, 0x10, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x4f, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf8, 0x01, 0x0a, 0x05, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x73, + 0x65, 0x6c, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x12, 0x35, + 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0x26, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x19, 0x0a, + 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0x27, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, + 0x64, 0x22, 0x64, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, + 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0b, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x27, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, + 0x31, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x49, 0x64, 0x22, 0x6a, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, + 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xa1, + 0x04, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x66, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, + 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x4a, + 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, + 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, + 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x57, 0x0a, 0x0d, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, + 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, + 0x65, 0x73, 0x22, 0x06, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x22, 0x06, 0x0a, 0x04, 0x50, 0x6f, + 0x6e, 0x67, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x09, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x0c, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, + 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, + 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, + 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x06, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa4, 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, + 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xb2, + 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, + 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, + 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x06, + 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, + 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, 0x65, 0x61, + 0x76, 0x65, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x42, 0x6c, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, + 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x74, 0x61, 0x70, 0x69, 0x42, + 0x0e, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x50, + 0x01, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, + 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x72, 0x74, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0f, 0x4e, + 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} var ( file_realtime_proto_rawDescOnce sync.Once - file_realtime_proto_rawDescData []byte + file_realtime_proto_rawDescData = file_realtime_proto_rawDesc ) func file_realtime_proto_rawDescGZIP() []byte { file_realtime_proto_rawDescOnce.Do(func() { - file_realtime_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_realtime_proto_rawDesc), len(file_realtime_proto_rawDesc))) + file_realtime_proto_rawDescData = protoimpl.X.CompressGZIP(file_realtime_proto_rawDescData) }) return file_realtime_proto_rawDescData } var file_realtime_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_realtime_proto_msgTypes = make([]protoimpl.MessageInfo, 59) -var file_realtime_proto_goTypes = []any{ +var file_realtime_proto_goTypes = []interface{}{ (ChannelJoin_Type)(0), // 0: nakama.realtime.ChannelJoin.Type (Error_Code)(0), // 1: nakama.realtime.Error.Code (*Envelope)(nil), // 2: nakama.realtime.Envelope @@ -4831,7 +5264,621 @@ func file_realtime_proto_init() { if File_realtime_proto != nil { return } - file_realtime_proto_msgTypes[0].OneofWrappers = []any{ + if !protoimpl.UnsafeEnabled { + file_realtime_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Envelope); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Channel); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelJoin); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelLeave); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelMessageAck); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelMessageSend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelMessageUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelMessageRemove); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelPresenceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Error); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Match); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchCreate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchDataSend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchJoin); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchLeave); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchPresenceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchmakerAdd); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchmakerMatched); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchmakerRemove); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchmakerTicket); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Notifications); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Party); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyCreate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyJoin); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyLeave); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyPromote); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyLeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyAccept); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyRemove); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyClose); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyJoinRequestList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyJoinRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyMatchmakerAdd); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyMatchmakerRemove); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyMatchmakerTicket); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyDataSend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartyPresenceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ping); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Pong); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Status); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusFollow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusPresenceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusUnfollow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Stream); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamPresenceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserPresence); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_realtime_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MatchmakerMatched_MatchmakerUser); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_realtime_proto_msgTypes[0].OneofWrappers = []interface{}{ (*Envelope_Channel)(nil), (*Envelope_ChannelJoin)(nil), (*Envelope_ChannelLeave)(nil), @@ -4882,11 +5929,11 @@ func file_realtime_proto_init() { (*Envelope_PartyDataSend)(nil), (*Envelope_PartyPresenceEvent)(nil), } - file_realtime_proto_msgTypes[14].OneofWrappers = []any{ + file_realtime_proto_msgTypes[14].OneofWrappers = []interface{}{ (*MatchJoin_MatchId)(nil), (*MatchJoin_Token)(nil), } - file_realtime_proto_msgTypes[18].OneofWrappers = []any{ + file_realtime_proto_msgTypes[18].OneofWrappers = []interface{}{ (*MatchmakerMatched_MatchId)(nil), (*MatchmakerMatched_Token)(nil), } @@ -4894,7 +5941,7 @@ func file_realtime_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_realtime_proto_rawDesc), len(file_realtime_proto_rawDesc)), + RawDescriptor: file_realtime_proto_rawDesc, NumEnums: 2, NumMessages: 59, NumExtensions: 0, @@ -4906,6 +5953,7 @@ func file_realtime_proto_init() { MessageInfos: file_realtime_proto_msgTypes, }.Build() File_realtime_proto = out.File + file_realtime_proto_rawDesc = nil file_realtime_proto_goTypes = nil file_realtime_proto_depIdxs = nil } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go index 076913bc9f..6784eaffab 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go @@ -93,7 +93,6 @@ type IAPConfig interface { GetGoogle() IAPGoogleConfig GetHuawei() IAPHuaweiConfig GetFacebookInstant() IAPFacebookInstantConfig - GetXbox() IAPXboxConfig } type IAPAppleConfig interface { @@ -126,10 +125,6 @@ type IAPFacebookInstantConfig interface { GetAppSecret() string } -type IAPXboxConfig interface { - GetToken() string -} - type GoogleAuthConfig interface { GetCredentialsJSON() string } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index be1eae86e9..6e8342b304 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -90,14 +90,12 @@ import ( "database/sql" "errors" "fmt" - "github.com/gofrs/uuid/v5" "net/http" "os" "time" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama-common/rtapi" - "go.uber.org/zap" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -378,9 +376,6 @@ type Initializer interface { // RegisterSubscriptionNotificationGoogle RegisterSubscriptionNotificationGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, subscription *api.ValidatedSubscription, providerPayload string) error) error - // RegisterPurchaseNotificationXbox - RegisterPurchaseNotificationXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error) error - // RegisterBeforeGetAccount is used to register a function invoked when the server receives the relevant request. RegisterBeforeGetAccount(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule) error) error @@ -773,12 +768,6 @@ type Initializer interface { // RegisterAfterValidatePurchaseGoogle can be used to perform additional logic after validating a Google Play Store IAP receipt. RegisterAfterValidatePurchaseGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseGoogleRequest) error) error - // RegisterBeforeValidatePurchaseXbox can be used to perform additional logic before validating a Xbox Store receipt - RegisterBeforeValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error)) error - - // RegisterAfterValidatePurchaseXbox can be used to perform additional logic after validating a Xbox Store receipt - RegisterAfterValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error) error - // RegisterBeforeValidateSubscriptionGoogle can be used to perform additional logic before validation an Google Store Subscription receipt. RegisterBeforeValidateSubscriptionGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidateSubscriptionGoogleRequest) (*api.ValidateSubscriptionGoogleRequest, error)) error @@ -887,9 +876,6 @@ type Initializer interface { // RegisterFleetManager can be used to register a FleetManager implementation that can be retrieved from the runtime using GetFleetManager(). RegisterFleetManager(fleetManagerInit FleetManagerInitializer) error - // RegisterIAPManager sets the relevant iapManger in the runtime object - RegisterIAPManager(platform string, iapManager interface{}) error - // RegisterShutdown can be used to register a function that is executed once the server receives a termination signal. // This function only fires if shutdown_grace_sec > 0 and will be terminated early if its execution takes longer than the configured grace seconds. RegisterShutdown(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule)) error @@ -1343,14 +1329,6 @@ type FleetManagerInitializer interface { Delete(ctx context.Context, id string) error } -type xboxRefundHookFn = func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error - -type IAPManager interface { - Init(fn xboxRefundHookFn) - PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, password, productId string, userID uuid.UUID, persist bool) (*api.ValidatePurchaseResponse, error) - HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) error -} - /* Satori runtime integration definitions. */ diff --git a/vendor/modules.txt b/vendor/modules.txt index 76c0d65a35..f774becfe2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -139,7 +139,7 @@ github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/internal/genopena github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options github.com/grpc-ecosystem/grpc-gateway/v2/runtime github.com/grpc-ecosystem/grpc-gateway/v2/utilities -# github.com/heroiclabs/nakama-common v1.37.0 => ../../nakama-modular-entiitlements/nakama-common-master/nakama-common +# github.com/heroiclabs/nakama-common v1.37.0 ## explicit; go 1.24.3 github.com/heroiclabs/nakama-common/api github.com/heroiclabs/nakama-common/rtapi @@ -434,4 +434,3 @@ gopkg.in/natefinch/lumberjack.v2 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 -# github.com/heroiclabs/nakama-common => ../../nakama-modular-entiitlements/nakama-common-master/nakama-common From 0d446000990b7086146a5aba14feaff8552b5652 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Thu, 3 Jul 2025 14:20:59 +0100 Subject: [PATCH 05/28] playstation validate and before and after hooks added --- apigrpc/apigrpc.swagger.json | 5 +-- console/console.swagger.json | 5 +-- iap/iap.go | 11 +++--- server/api_purchase.go | 61 ++++++++++++++++++++++++++++++++- server/config.go | 10 ++++++ server/runtime.go | 41 +++++++++++++++++++++-- server/runtime_go.go | 65 +++++++++++++++++++++++++++--------- server/runtime_go_nakama.go | 47 +++++++++++++------------- 8 files changed, 194 insertions(+), 51 deletions(-) diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index e4de935d80..527b0f8346 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -4838,10 +4838,11 @@ "GOOGLE_PLAY_STORE", "HUAWEI_APP_GALLERY", "FACEBOOK_INSTANT_STORE", - "XBOX_STORE" + "XBOX_STORE", + "PLAYSTATION_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store\n - PLAYSTATION_STORE: Playstation Store", "title": "Validation Provider," }, "apiSubscriptionList": { diff --git a/console/console.swagger.json b/console/console.swagger.json index 8c2c4b14a5..2c7a167588 100644 --- a/console/console.swagger.json +++ b/console/console.swagger.json @@ -3288,10 +3288,11 @@ "GOOGLE_PLAY_STORE", "HUAWEI_APP_GALLERY", "FACEBOOK_INSTANT_STORE", - "XBOX_STORE" + "XBOX_STORE", + "PLAYSTATION_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store\n - PLAYSTATION_STORE: Playstation Store", "title": "Validation Provider," }, "apiSubscriptionList": { diff --git a/iap/iap.go b/iap/iap.go index c84f344f5c..2583006660 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -80,11 +80,12 @@ func (enum Platform) String() string { func FromString(s string) Platform { return map[string]Platform{ - "apple": Apple, - "google": Google, - "facebook": Facebook, - "huawei": Huawei, - "xbox": Xbox, + "apple": Apple, + "google": Google, + "facebook": Facebook, + "huawei": Huawei, + "xbox": Xbox, + "playstation": Playstation, }[s] } diff --git a/server/api_purchase.go b/server/api_purchase.go index ac5a12b33a..3e2fa5ca09 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -296,7 +296,7 @@ func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePu persist = in.Persist.GetValue() } - validation, err := s.runtime.iapXboxManager.PurchaseValidate(ctx, s.logger, s.db, s.config.GetIAP().Xbox.Token, in.ProductId, userID, persist) + validation, err := s.runtime.iapXboxManager.PurchaseValidate(ctx, s.logger, s.db, s.config.GetIAP().Xbox.Token, "", in.ProductId, "", userID, persist) if err != nil { return nil, err } @@ -313,3 +313,62 @@ func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePu return validation, err } + +func (s *ApiServer) ValidatePurchasePlaystation(ctx context.Context, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchaseResponse, error) { + userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + + // Before hook. + if fn := s.runtime.BeforeValidatePurchasePlaystation(); fn != nil { + beforeFn := func(clientIP, clientPort string) error { + result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + if err != nil { + return status.Error(code, err.Error()) + } + if result == nil { + // If result is nil, requested resource is disabled. + s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) + return status.Error(codes.NotFound, "Requested resource was not found.") + } + in = result + return nil + } + + // Execute the before function lambda wrapped in a trace for stats measurement. + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + if err != nil { + return nil, err + } + } + + if s.config.GetIAP().Xbox.Token == "" { + return nil, status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") + } + + if len(in.EntitlementLabel) < 1 { + return nil, status.Error(codes.InvalidArgument, "EntitlementLabel required.") + } + + persist := true + if in.Persist != nil { + persist = in.Persist.GetValue() + } + + playstationConfig := s.config.GetIAP().Playstation + // change xbox token to ps token + validation, err := s.runtime.iapPlaystationManager.PurchaseValidate(ctx, s.logger, s.db, playstationConfig.Token, playstationConfig.Environment, "", in.EntitlementLabel, userID, persist) + if err != nil { + return nil, err + } + + // After hook. + if fn := s.runtime.AfterValidatePurchasePlaystation(); fn != nil { + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) + } + + // Execute the after function lambda wrapped in a trace for stats measurement. + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + } + + return validation, err +} diff --git a/server/config.go b/server/config.go index dba3b94ea9..b04f904054 100644 --- a/server/config.go +++ b/server/config.go @@ -1339,6 +1339,7 @@ type IAPConfig struct { Huawei *IAPHuaweiConfig `yaml:"huawei" json:"huawei" usage:"Huawei purchase validation configuration."` FacebookInstant *IAPFacebookInstantConfig `yaml:"facebook_instant" json:"facebook_instant" usage:"Facebook Instant purchase validation configuration."` Xbox *IAPXboxConfig `yaml:"xbox" json:"xbox" usage:"Xbox Configuration."` + Playstation *IAPPlaystationConfig `yaml:"playstation" json:"playstation" usage:"Playstation Configuration."` } func (cfg *IAPConfig) GetApple() runtime.IAPAppleConfig { @@ -1359,6 +1360,8 @@ func (cfg *IAPConfig) GetFacebookInstant() runtime.IAPFacebookInstantConfig { func (cfg *IAPConfig) GetXbox() runtime.IAPXboxConfig { return cfg.Xbox } +func (cfg *IAPConfig) GetPlaystation() runtime.IAPPlaystationConfig { return cfg.Playstation } + func (cfg *IAPConfig) Clone() *IAPConfig { if cfg == nil { return nil @@ -1544,6 +1547,13 @@ type IAPXboxConfig struct { func (i IAPXboxConfig) GetToken() string { return i.Token } +type IAPPlaystationConfig struct { + Token string `yaml:"token" json:"token" usage:"Playstation credentials token"` + Environment string `yaml:"environment" json:"environment" usage:"IAP Playstation environment"` +} + +func (i IAPPlaystationConfig) GetToken() string { return i.Token } + var _ runtime.GoogleAuthConfig = &GoogleAuthConfig{} type GoogleAuthConfig struct { diff --git a/server/runtime.go b/server/runtime.go index 7990d4033a..b9821f115b 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -211,6 +211,8 @@ type ( RuntimeAfterValidatePurchaseFacebookInstantFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error RuntimeBeforeValidatePurchaseXboxFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error, codes.Code) RuntimeAfterValidatePurchaseXboxFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error + RuntimeBeforeValidatePurchasePlaystationFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error, codes.Code) + RuntimeAfterValidatePurchasePlaystationFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error RuntimeBeforeListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListSubscriptionsRequest) (*api.ListSubscriptionsRequest, error, codes.Code) RuntimeAfterListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.SubscriptionList, in *api.ListSubscriptionsRequest) error RuntimeBeforeGetSubscriptionFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.GetSubscriptionRequest) (*api.GetSubscriptionRequest, error, codes.Code) @@ -437,6 +439,7 @@ type RuntimeBeforeReqFunctions struct { beforeValidatePurchaseHuaweiFunction RuntimeBeforeValidatePurchaseHuaweiFunction beforeValidatePurchaseFacebookInstantFunction RuntimeBeforeValidatePurchaseFacebookInstantFunction beforeValidatePurchaseXboxFunction RuntimeBeforeValidatePurchaseXboxFunction + beforeValidatePurchasePlaystationFunction RuntimeBeforeValidatePurchasePlaystationFunction beforeListSubscriptionsFunction RuntimeBeforeListSubscriptionsFunction beforeGetSubscriptionFunction RuntimeBeforeGetSubscriptionFunction beforeGetMatchmakerStatsFunction RuntimeBeforeGetMatchmakerStatsFunction @@ -522,6 +525,7 @@ type RuntimeAfterReqFunctions struct { afterValidatePurchaseHuaweiFunction RuntimeAfterValidatePurchaseHuaweiFunction afterValidatePurchaseFacebookInstantFunction RuntimeAfterValidatePurchaseFacebookInstantFunction afterValidatePurchaseXboxFunction RuntimeAfterValidatePurchaseXboxFunction + afterValidatePurchasePlaystationFunction RuntimeAfterValidatePurchasePlaystationFunction afterListSubscriptionsFunction RuntimeAfterListSubscriptionsFunction afterGetSubscriptionFunction RuntimeAfterGetSubscriptionFunction afterGetMatchmakerStatsFunction RuntimeAfterGetMatchmakerStatsFunction @@ -561,7 +565,8 @@ type Runtime struct { fleetManager runtime.FleetManager - iapXboxManager runtime.IAPManager + iapXboxManager runtime.IAPManager + iapPlaystationManager runtime.IAPManager } type MatchNamesListFunction func() []string @@ -688,7 +693,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. config.GetSatori().CacheEnabled, ) - goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goPurchaseNotificationXboxFn, goIndexFilterFns, fleetManager, iapXboxManager, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) + goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goPurchaseNotificationXboxFn, goIndexFilterFns, fleetManager, iapXboxManager, iapPlaystationManager, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) if err != nil { startupLogger.Error("Error initialising Go runtime provider", zap.Error(err)) return nil, nil, err @@ -1006,6 +1011,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allBeforeReqFunctions.beforeValidatePurchaseXboxFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasexbox")) } + if allBeforeReqFunctions.beforeValidatePurchasePlaystationFunction != nil { + startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchaseplaystation")) + } if allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -1327,6 +1335,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseXboxFunction = luaBeforeReqFns.beforeValidatePurchaseXboxFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasexbox")) } + if luaBeforeReqFns.beforeValidatePurchasePlaystationFunction != nil { + allBeforeReqFunctions.beforeValidatePurchasePlaystationFunction = luaBeforeReqFns.beforeValidatePurchasePlaystationFunction + startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchaseplaystation")) + } if luaBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = luaBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1653,6 +1665,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseXboxFunction = goBeforeReqFns.beforeValidatePurchaseXboxFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasexbox")) } + if goBeforeReqFns.beforeValidatePurchasePlaystationFunction != nil { + allBeforeReqFunctions.beforeValidatePurchasePlaystationFunction = goBeforeReqFns.beforeValidatePurchasePlaystationFunction + startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchaseplaystation")) + } if goBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = goBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1904,6 +1920,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allAfterReqFunctions.afterValidatePurchaseXboxFunction != nil { startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasexbox")) } + if allAfterReqFunctions.afterValidatePurchasePlaystationFunction != nil { + startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchaseplaystation")) + } if allAfterReqFunctions.afterValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -2221,6 +2240,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseXboxFunction = luaAfterReqFns.afterValidatePurchaseXboxFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasexbox")) } + if luaAfterReqFns.afterValidatePurchasePlaystationFunction != nil { + allAfterReqFunctions.afterValidatePurchasePlaystationFunction = luaAfterReqFns.afterValidatePurchasePlaystationFunction + startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchaseplaystation")) + } if luaAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = luaAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2547,6 +2570,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseXboxFunction = goAfterReqFns.afterValidatePurchaseXboxFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasexbox")) } + if goAfterReqFns.afterValidatePurchasePlaystationFunction != nil { + allAfterReqFunctions.afterValidatePurchasePlaystationFunction = goAfterReqFns.afterValidatePurchasePlaystationFunction + startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchaseplaystation")) + } if goAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = goAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2758,7 +2785,8 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. fleetManager: fleetManager, - iapXboxManager: iapXboxManager, + iapXboxManager: iapXboxManager, + iapPlaystationManager: iapPlaystationManager, eventFunctions: allEventFns, }, rInfo, nil @@ -3494,6 +3522,13 @@ func (r *Runtime) AfterValidatePurchaseXbox() RuntimeAfterValidatePurchaseXboxFu return r.afterReqFunctions.afterValidatePurchaseXboxFunction } +func (r *Runtime) BeforeValidatePurchasePlaystation() RuntimeBeforeValidatePurchasePlaystationFunction { + return r.beforeReqFunctions.beforeValidatePurchasePlaystationFunction +} + +func (r *Runtime) AfterValidatePurchasePlaystation() RuntimeAfterValidatePurchasePlaystationFunction { + return r.afterReqFunctions.afterValidatePurchasePlaystationFunction +} func (r *Runtime) BeforeEvent() RuntimeBeforeEventFunction { return r.beforeReqFunctions.beforeEventFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index a158739cf5..2f473b3fb9 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -82,8 +82,9 @@ type RuntimeGoInitializer struct { fmCallbackHandler runtime.FmCallbackHandler - iapXboxManager runtime.IAPManager - registeredIAPs []string + iapXboxManager runtime.IAPManager + iapPlaystationManager runtime.IAPManager + registeredIAPs []string } func (ri *RuntimeGoInitializer) GetConfig() (runtime.Config, error) { @@ -2386,7 +2387,6 @@ func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseApple(fn func(ctx c } func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchaseXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error)) error { - ri.logger.Info("registerbeforevalidatepurchasexbox hit in the nakama core") ri.beforeReq.beforeValidatePurchaseXboxFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") loggerFields := map[string]interface{}{"api_id": "validatepurchasexbox", "mode": RuntimeExecutionModeBefore.String()} @@ -2405,7 +2405,6 @@ func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchaseXbox(fn func(ctx c } return result, nil, codes.OK } - ri.logger.Info("registerbeforevalidatepurchasexbox hit in the nakama core 2") return nil } @@ -2419,6 +2418,38 @@ func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseXbox(fn func(ctx co return nil } +func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchasePlaystation(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error)) error { + ri.beforeReq.beforeValidatePurchasePlaystationFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error, codes.Code) { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchaseplaystation", "mode": RuntimeExecutionModeBefore.String()} + result, fnErr := fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, in) + if fnErr != nil { + var runtimeErr *runtime.Error + if errors.As(fnErr, &runtimeErr) { + if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { + // If error is present but code is invalid then default to 13 (Internal) as the error code. + return result, runtimeErr, codes.Internal + } + return result, runtimeErr, codes.Code(runtimeErr.Code) + } + // Not a runtime error that contains a code. + return result, fnErr, codes.Internal + } + return result, nil, codes.OK + } + + return nil +} + +func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchasePlaystation(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error) error { + ri.afterReq.afterValidatePurchasePlaystationFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchaseplaystation", "mode": RuntimeExecutionModeAfter.String()} + return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) + } + return nil +} + func (ri *RuntimeGoInitializer) RegisterBeforeValidateSubscriptionApple(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error)) error { ri.beforeReq.beforeValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") @@ -2843,7 +2874,7 @@ func (ri *RuntimeGoInitializer) RegisterFleetManager(fleetManager runtime.FleetM return nil } -func (ri *RuntimeGoInitializer) RegisterIAPManager(platform string, iapManager interface{}) error { +func (ri *RuntimeGoInitializer) RegisterIAPManager(platform string, iapManager runtime.IAPManager) error { if slices.Contains(ri.registeredIAPs, platform) { return errors.New("platform already registered") } @@ -2852,12 +2883,16 @@ func (ri *RuntimeGoInitializer) RegisterIAPManager(platform string, iapManager i switch p { case iap.Xbox: - if iapMan, ok := iapManager.(runtime.IAPManager); ok { - if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - ri.iapXboxManager = iapMan - nk.IAPXboxManager = iapMan - ri.registeredIAPs = append(ri.registeredIAPs, platform) - } + if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { + ri.iapXboxManager = iapManager + nk.IAPXboxManager = iapManager + ri.registeredIAPs = append(ri.registeredIAPs, platform) + } + case iap.Playstation: + if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { + ri.iapPlaystationManager = iapManager + nk.IAPPlaystationManager = iapManager + ri.registeredIAPs = append(ri.registeredIAPs, platform) } default: return errors.New("platform not valid") @@ -2892,7 +2927,7 @@ func (ri *RuntimeGoInitializer) RegisterMatch(name string, fn func(ctx context.C return nil } -func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, RuntimePurchaseNotificationXboxFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, runtime.IAPManager, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { +func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, RuntimePurchaseNotificationXboxFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, runtime.IAPManager, runtime.IAPManager, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { runtimeLogger := NewRuntimeGoLogger(logger) node := config.GetName() env := config.GetRuntime().Environment @@ -2981,13 +3016,13 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger relPath, name, fn, err := openGoModule(startupLogger, rootPath, path) if err != nil { // Errors are already logged in the function above. - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err } // Run the initialisation. if err = fn(ctx, runtimeLogger, db, nk, initializer); err != nil { startupLogger.Fatal("Error returned by InitModule function in Go module", zap.String("name", name), zap.Error(err)) - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") } modulePaths = append(modulePaths, relPath) } @@ -3035,7 +3070,7 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger } } - return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.purchaseNotificationXbox, initializer.storageIndexFunctions, initializer.fleetManager, initializer.iapXboxManager, initializer.httpHandlers, events, matchNamesListFn, nil + return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.purchaseNotificationXbox, initializer.storageIndexFunctions, initializer.fleetManager, initializer.iapXboxManager, initializer.iapPlaystationManager, initializer.httpHandlers, events, matchNamesListFn, nil } func CheckRuntimeProviderGo(logger *zap.Logger, rootPath string, paths []string) error { diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index b9ca00452b..1954925537 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -42,29 +42,30 @@ import ( type RuntimeGoNakamaModule struct { sync.RWMutex - logger *zap.Logger - db *sql.DB - protojsonMarshaler *protojson.MarshalOptions - config Config - socialClient *social.Client - leaderboardCache LeaderboardCache - leaderboardRankCache LeaderboardRankCache - leaderboardScheduler LeaderboardScheduler - sessionRegistry SessionRegistry - sessionCache SessionCache - statusRegistry StatusRegistry - matchRegistry MatchRegistry - tracker Tracker - metrics Metrics - streamManager StreamManager - router MessageRouter - eventFn RuntimeEventCustomFunction - node string - matchCreateFn RuntimeMatchCreateFunction - satori runtime.Satori - fleetManager runtime.FleetManager - storageIndex StorageIndex - IAPXboxManager runtime.IAPManager + logger *zap.Logger + db *sql.DB + protojsonMarshaler *protojson.MarshalOptions + config Config + socialClient *social.Client + leaderboardCache LeaderboardCache + leaderboardRankCache LeaderboardRankCache + leaderboardScheduler LeaderboardScheduler + sessionRegistry SessionRegistry + sessionCache SessionCache + statusRegistry StatusRegistry + matchRegistry MatchRegistry + tracker Tracker + metrics Metrics + streamManager StreamManager + router MessageRouter + eventFn RuntimeEventCustomFunction + node string + matchCreateFn RuntimeMatchCreateFunction + satori runtime.Satori + fleetManager runtime.FleetManager + storageIndex StorageIndex + IAPXboxManager runtime.IAPManager + IAPPlaystationManager runtime.IAPManager } func NewRuntimeGoNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori) *RuntimeGoNakamaModule { From 47f18dee4bb76012897bbdc216138b2cb307c740 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 8 Jul 2025 19:58:36 +0100 Subject: [PATCH 06/28] work in progress --- apigrpc/apigrpc.pb.go | 268 +- apigrpc/apigrpc.pb.gw.go | 63 + apigrpc/apigrpc.proto | 8 + apigrpc/apigrpc.swagger.json | 57 +- apigrpc/apigrpc_grpc.pb.go | 40 + console/console.swagger.json | 7 +- go.mod | 2 + go.sum | 2 - iap/apple.go | 579 ++ iap/iap.go | 401 + server/api_purchase.go | 147 +- server/config.go | 9 + server/console.go | 58 +- server/console_purchase.go | 3 +- server/console_subscription.go | 3 +- server/core_purchase.go | 393 +- server/core_subscription.go | 424 +- server/google_refund_scheduler.go | 102 +- server/runtime.go | 40 +- server/runtime_go.go | 117 +- server/runtime_go_nakama.go | 51 +- server/runtime_javascript.go | 6 +- server/runtime_javascript_nakama.go | 3 +- server/runtime_lua.go | 6 +- server/runtime_lua_nakama.go | 3 +- server/xbox_refund_poller.go | 7 +- .../heroiclabs/nakama-common/api/api.pb.go | 6550 ++++++----------- .../heroiclabs/nakama-common/api/api.proto | 43 + .../nakama-common/rtapi/realtime.pb.go | 2978 +++----- .../nakama-common/runtime/config.go | 21 + .../nakama-common/runtime/runtime.go | 63 +- vendor/modules.txt | 2 +- 32 files changed, 5273 insertions(+), 7183 deletions(-) create mode 100644 iap/apple.go diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index 8e614ec816..faf4bc99d5 100644 --- a/apigrpc/apigrpc.pb.go +++ b/apigrpc/apigrpc.pb.go @@ -46,7 +46,7 @@ var File_apigrpc_proto protoreflect.FileDescriptor const file_apigrpc_proto_rawDesc = "" + "\n" + "\rapigrpc.proto\x12\n" + - "nakama.api\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\x1a1github.com/heroiclabs/nakama-common/api/api.proto2\xa9P\n" + + "nakama.api\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\x1a1github.com/heroiclabs/nakama-common/api/api.proto2\xa5Q\n" + "\x06Nakama\x12W\n" + "\n" + "AddFriends\x12\x1d.nakama.api.AddFriendsRequest\x1a\x16.google.protobuf.Empty\"\x12\x82\xd3\xe4\x93\x02\f\"\n" + @@ -156,7 +156,8 @@ const file_apigrpc_proto_rawDesc = "" + "\fUnlinkGoogle\x12\x19.nakama.api.AccountGoogle\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/v2/account/unlink/google\x12d\n" + "\vUnlinkSteam\x12\x18.nakama.api.AccountSteam\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/account/unlink/steam\x12a\n" + "\rUpdateAccount\x12 .nakama.api.UpdateAccountRequest\x1a\x16.google.protobuf.Empty\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\x1a\v/v2/account\x12f\n" + - "\vUpdateGroup\x12\x1e.nakama.api.UpdateGroupRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\x1a\x14/v2/group/{group_id}\x12\x8a\x01\n" + + "\vUpdateGroup\x12\x1e.nakama.api.UpdateGroupRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\x1a\x14/v2/group/{group_id}\x12z\n" + + "\x10ValidatePurchase\x12#.nakama.api.ValidatePurchaseRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\x1a\x10/v2/iap/purchase\x12\x8a\x01\n" + "\x15ValidatePurchaseApple\x12(.nakama.api.ValidatePurchaseAppleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/iap/purchase/apple\x12\x9a\x01\n" + "\x19ValidateSubscriptionApple\x12,.nakama.api.ValidateSubscriptionAppleRequest\x1a(.nakama.api.ValidateSubscriptionResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v2/iap/subscription/apple\x12\x8d\x01\n" + "\x16ValidatePurchaseGoogle\x12).nakama.api.ValidatePurchaseGoogleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/iap/purchase/google\x12\x9d\x01\n" + @@ -245,40 +246,41 @@ var file_apigrpc_proto_goTypes = []any{ (*api.AccountSteam)(nil), // 61: nakama.api.AccountSteam (*api.UpdateAccountRequest)(nil), // 62: nakama.api.UpdateAccountRequest (*api.UpdateGroupRequest)(nil), // 63: nakama.api.UpdateGroupRequest - (*api.ValidatePurchaseAppleRequest)(nil), // 64: nakama.api.ValidatePurchaseAppleRequest - (*api.ValidateSubscriptionAppleRequest)(nil), // 65: nakama.api.ValidateSubscriptionAppleRequest - (*api.ValidatePurchaseGoogleRequest)(nil), // 66: nakama.api.ValidatePurchaseGoogleRequest - (*api.ValidateSubscriptionGoogleRequest)(nil), // 67: nakama.api.ValidateSubscriptionGoogleRequest - (*api.ValidatePurchaseHuaweiRequest)(nil), // 68: nakama.api.ValidatePurchaseHuaweiRequest - (*api.ValidatePurchaseFacebookInstantRequest)(nil), // 69: nakama.api.ValidatePurchaseFacebookInstantRequest - (*api.ValidatePurchaseXboxRequest)(nil), // 70: nakama.api.ValidatePurchaseXboxRequest - (*api.WriteLeaderboardRecordRequest)(nil), // 71: nakama.api.WriteLeaderboardRecordRequest - (*api.WriteStorageObjectsRequest)(nil), // 72: nakama.api.WriteStorageObjectsRequest - (*api.WriteTournamentRecordRequest)(nil), // 73: nakama.api.WriteTournamentRecordRequest - (*api.Session)(nil), // 74: nakama.api.Session - (*api.Group)(nil), // 75: nakama.api.Group - (*api.Account)(nil), // 76: nakama.api.Account - (*api.Users)(nil), // 77: nakama.api.Users - (*api.ValidatedSubscription)(nil), // 78: nakama.api.ValidatedSubscription - (*api.MatchmakerStats)(nil), // 79: nakama.api.MatchmakerStats - (*api.ChannelMessageList)(nil), // 80: nakama.api.ChannelMessageList - (*api.FriendList)(nil), // 81: nakama.api.FriendList - (*api.FriendsOfFriendsList)(nil), // 82: nakama.api.FriendsOfFriendsList - (*api.GroupList)(nil), // 83: nakama.api.GroupList - (*api.GroupUserList)(nil), // 84: nakama.api.GroupUserList - (*api.LeaderboardRecordList)(nil), // 85: nakama.api.LeaderboardRecordList - (*api.MatchList)(nil), // 86: nakama.api.MatchList - (*api.NotificationList)(nil), // 87: nakama.api.NotificationList - (*api.StorageObjectList)(nil), // 88: nakama.api.StorageObjectList - (*api.SubscriptionList)(nil), // 89: nakama.api.SubscriptionList - (*api.TournamentList)(nil), // 90: nakama.api.TournamentList - (*api.TournamentRecordList)(nil), // 91: nakama.api.TournamentRecordList - (*api.UserGroupList)(nil), // 92: nakama.api.UserGroupList - (*api.StorageObjects)(nil), // 93: nakama.api.StorageObjects - (*api.ValidatePurchaseResponse)(nil), // 94: nakama.api.ValidatePurchaseResponse - (*api.ValidateSubscriptionResponse)(nil), // 95: nakama.api.ValidateSubscriptionResponse - (*api.LeaderboardRecord)(nil), // 96: nakama.api.LeaderboardRecord - (*api.StorageObjectAcks)(nil), // 97: nakama.api.StorageObjectAcks + (*api.ValidatePurchaseRequest)(nil), // 64: nakama.api.ValidatePurchaseRequest + (*api.ValidatePurchaseAppleRequest)(nil), // 65: nakama.api.ValidatePurchaseAppleRequest + (*api.ValidateSubscriptionAppleRequest)(nil), // 66: nakama.api.ValidateSubscriptionAppleRequest + (*api.ValidatePurchaseGoogleRequest)(nil), // 67: nakama.api.ValidatePurchaseGoogleRequest + (*api.ValidateSubscriptionGoogleRequest)(nil), // 68: nakama.api.ValidateSubscriptionGoogleRequest + (*api.ValidatePurchaseHuaweiRequest)(nil), // 69: nakama.api.ValidatePurchaseHuaweiRequest + (*api.ValidatePurchaseFacebookInstantRequest)(nil), // 70: nakama.api.ValidatePurchaseFacebookInstantRequest + (*api.ValidatePurchaseXboxRequest)(nil), // 71: nakama.api.ValidatePurchaseXboxRequest + (*api.WriteLeaderboardRecordRequest)(nil), // 72: nakama.api.WriteLeaderboardRecordRequest + (*api.WriteStorageObjectsRequest)(nil), // 73: nakama.api.WriteStorageObjectsRequest + (*api.WriteTournamentRecordRequest)(nil), // 74: nakama.api.WriteTournamentRecordRequest + (*api.Session)(nil), // 75: nakama.api.Session + (*api.Group)(nil), // 76: nakama.api.Group + (*api.Account)(nil), // 77: nakama.api.Account + (*api.Users)(nil), // 78: nakama.api.Users + (*api.ValidatedSubscription)(nil), // 79: nakama.api.ValidatedSubscription + (*api.MatchmakerStats)(nil), // 80: nakama.api.MatchmakerStats + (*api.ChannelMessageList)(nil), // 81: nakama.api.ChannelMessageList + (*api.FriendList)(nil), // 82: nakama.api.FriendList + (*api.FriendsOfFriendsList)(nil), // 83: nakama.api.FriendsOfFriendsList + (*api.GroupList)(nil), // 84: nakama.api.GroupList + (*api.GroupUserList)(nil), // 85: nakama.api.GroupUserList + (*api.LeaderboardRecordList)(nil), // 86: nakama.api.LeaderboardRecordList + (*api.MatchList)(nil), // 87: nakama.api.MatchList + (*api.NotificationList)(nil), // 88: nakama.api.NotificationList + (*api.StorageObjectList)(nil), // 89: nakama.api.StorageObjectList + (*api.SubscriptionList)(nil), // 90: nakama.api.SubscriptionList + (*api.TournamentList)(nil), // 91: nakama.api.TournamentList + (*api.TournamentRecordList)(nil), // 92: nakama.api.TournamentRecordList + (*api.UserGroupList)(nil), // 93: nakama.api.UserGroupList + (*api.StorageObjects)(nil), // 94: nakama.api.StorageObjects + (*api.ValidatePurchaseResponse)(nil), // 95: nakama.api.ValidatePurchaseResponse + (*api.ValidateSubscriptionResponse)(nil), // 96: nakama.api.ValidateSubscriptionResponse + (*api.LeaderboardRecord)(nil), // 97: nakama.api.LeaderboardRecord + (*api.StorageObjectAcks)(nil), // 98: nakama.api.StorageObjectAcks } var file_apigrpc_proto_depIdxs = []int32{ 0, // 0: nakama.api.Nakama.AddFriends:input_type -> nakama.api.AddFriendsRequest @@ -355,102 +357,104 @@ var file_apigrpc_proto_depIdxs = []int32{ 61, // 71: nakama.api.Nakama.UnlinkSteam:input_type -> nakama.api.AccountSteam 62, // 72: nakama.api.Nakama.UpdateAccount:input_type -> nakama.api.UpdateAccountRequest 63, // 73: nakama.api.Nakama.UpdateGroup:input_type -> nakama.api.UpdateGroupRequest - 64, // 74: nakama.api.Nakama.ValidatePurchaseApple:input_type -> nakama.api.ValidatePurchaseAppleRequest - 65, // 75: nakama.api.Nakama.ValidateSubscriptionApple:input_type -> nakama.api.ValidateSubscriptionAppleRequest - 66, // 76: nakama.api.Nakama.ValidatePurchaseGoogle:input_type -> nakama.api.ValidatePurchaseGoogleRequest - 67, // 77: nakama.api.Nakama.ValidateSubscriptionGoogle:input_type -> nakama.api.ValidateSubscriptionGoogleRequest - 68, // 78: nakama.api.Nakama.ValidatePurchaseHuawei:input_type -> nakama.api.ValidatePurchaseHuaweiRequest - 69, // 79: nakama.api.Nakama.ValidatePurchaseFacebookInstant:input_type -> nakama.api.ValidatePurchaseFacebookInstantRequest - 70, // 80: nakama.api.Nakama.ValidatePurchaseXbox:input_type -> nakama.api.ValidatePurchaseXboxRequest - 71, // 81: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest - 72, // 82: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest - 73, // 83: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest - 16, // 84: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty - 16, // 85: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty - 74, // 86: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session - 16, // 87: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty - 74, // 88: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session - 74, // 89: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session - 74, // 90: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session - 74, // 91: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session - 74, // 92: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session - 74, // 93: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session - 74, // 94: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session - 74, // 95: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session - 74, // 96: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session - 16, // 97: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty - 16, // 98: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty - 75, // 99: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group - 16, // 100: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty - 16, // 101: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty - 16, // 102: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty - 16, // 103: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty - 16, // 104: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty - 16, // 105: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty - 16, // 106: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty - 16, // 107: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty - 76, // 108: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account - 77, // 109: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users - 78, // 110: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription - 79, // 111: nakama.api.Nakama.GetMatchmakerStats:output_type -> nakama.api.MatchmakerStats - 16, // 112: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty - 16, // 113: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty - 16, // 114: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty - 16, // 115: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty - 16, // 116: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty - 16, // 117: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty - 16, // 118: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty - 16, // 119: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty - 16, // 120: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty - 16, // 121: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty - 16, // 122: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty - 16, // 123: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty - 16, // 124: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 125: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty - 16, // 126: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty - 16, // 127: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty - 80, // 128: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList - 81, // 129: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList - 82, // 130: nakama.api.Nakama.ListFriendsOfFriends:output_type -> nakama.api.FriendsOfFriendsList - 83, // 131: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList - 84, // 132: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList - 85, // 133: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList - 85, // 134: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList - 86, // 135: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList - 87, // 136: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList - 88, // 137: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList - 89, // 138: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList - 90, // 139: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList - 91, // 140: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList - 91, // 141: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList - 92, // 142: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList - 16, // 143: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty - 16, // 144: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty - 93, // 145: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects - 59, // 146: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc - 16, // 147: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty - 16, // 148: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty - 16, // 149: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty - 16, // 150: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty - 16, // 151: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty - 16, // 152: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 153: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty - 16, // 154: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty - 16, // 155: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty - 16, // 156: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty - 16, // 157: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty - 94, // 158: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 159: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse - 94, // 160: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 161: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse - 94, // 162: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse - 94, // 163: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse - 94, // 164: nakama.api.Nakama.ValidatePurchaseXbox:output_type -> nakama.api.ValidatePurchaseResponse - 96, // 165: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord - 97, // 166: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks - 96, // 167: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord - 84, // [84:168] is the sub-list for method output_type - 0, // [0:84] is the sub-list for method input_type + 64, // 74: nakama.api.Nakama.ValidatePurchase:input_type -> nakama.api.ValidatePurchaseRequest + 65, // 75: nakama.api.Nakama.ValidatePurchaseApple:input_type -> nakama.api.ValidatePurchaseAppleRequest + 66, // 76: nakama.api.Nakama.ValidateSubscriptionApple:input_type -> nakama.api.ValidateSubscriptionAppleRequest + 67, // 77: nakama.api.Nakama.ValidatePurchaseGoogle:input_type -> nakama.api.ValidatePurchaseGoogleRequest + 68, // 78: nakama.api.Nakama.ValidateSubscriptionGoogle:input_type -> nakama.api.ValidateSubscriptionGoogleRequest + 69, // 79: nakama.api.Nakama.ValidatePurchaseHuawei:input_type -> nakama.api.ValidatePurchaseHuaweiRequest + 70, // 80: nakama.api.Nakama.ValidatePurchaseFacebookInstant:input_type -> nakama.api.ValidatePurchaseFacebookInstantRequest + 71, // 81: nakama.api.Nakama.ValidatePurchaseXbox:input_type -> nakama.api.ValidatePurchaseXboxRequest + 72, // 82: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest + 73, // 83: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest + 74, // 84: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest + 16, // 85: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty + 16, // 86: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty + 75, // 87: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session + 16, // 88: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty + 75, // 89: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session + 75, // 90: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session + 75, // 91: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session + 75, // 92: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session + 75, // 93: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session + 75, // 94: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session + 75, // 95: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session + 75, // 96: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session + 75, // 97: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session + 16, // 98: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty + 16, // 99: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty + 76, // 100: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group + 16, // 101: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty + 16, // 102: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty + 16, // 103: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty + 16, // 104: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty + 16, // 105: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty + 16, // 106: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty + 16, // 107: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty + 16, // 108: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty + 77, // 109: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account + 78, // 110: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users + 79, // 111: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription + 80, // 112: nakama.api.Nakama.GetMatchmakerStats:output_type -> nakama.api.MatchmakerStats + 16, // 113: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty + 16, // 114: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty + 16, // 115: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty + 16, // 116: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty + 16, // 117: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty + 16, // 118: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty + 16, // 119: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty + 16, // 120: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty + 16, // 121: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty + 16, // 122: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty + 16, // 123: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty + 16, // 124: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty + 16, // 125: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 126: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty + 16, // 127: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty + 16, // 128: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty + 81, // 129: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList + 82, // 130: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList + 83, // 131: nakama.api.Nakama.ListFriendsOfFriends:output_type -> nakama.api.FriendsOfFriendsList + 84, // 132: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList + 85, // 133: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList + 86, // 134: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList + 86, // 135: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList + 87, // 136: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList + 88, // 137: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList + 89, // 138: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList + 90, // 139: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList + 91, // 140: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList + 92, // 141: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList + 92, // 142: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList + 93, // 143: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList + 16, // 144: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty + 16, // 145: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty + 94, // 146: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects + 59, // 147: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc + 16, // 148: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty + 16, // 149: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty + 16, // 150: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty + 16, // 151: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty + 16, // 152: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty + 16, // 153: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 154: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty + 16, // 155: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty + 16, // 156: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty + 16, // 157: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty + 16, // 158: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty + 95, // 159: nakama.api.Nakama.ValidatePurchase:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 160: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse + 96, // 161: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse + 95, // 162: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse + 96, // 163: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse + 95, // 164: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 165: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 166: nakama.api.Nakama.ValidatePurchaseXbox:output_type -> nakama.api.ValidatePurchaseResponse + 97, // 167: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord + 98, // 168: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks + 97, // 169: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord + 85, // [85:170] is the sub-list for method output_type + 0, // [0:85] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/apigrpc/apigrpc.pb.gw.go b/apigrpc/apigrpc.pb.gw.go index b1cbdfb170..51f125362a 100644 --- a/apigrpc/apigrpc.pb.gw.go +++ b/apigrpc/apigrpc.pb.gw.go @@ -2702,6 +2702,30 @@ func local_request_Nakama_UpdateGroup_0(ctx context.Context, marshaler runtime.M return msg, metadata, err } +func request_Nakama_ValidatePurchase_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq api.ValidatePurchaseRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.ValidatePurchase(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Nakama_ValidatePurchase_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq api.ValidatePurchaseRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.ValidatePurchase(ctx, &protoReq) + return msg, metadata, err +} + func request_Nakama_ValidatePurchaseApple_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq api.ValidatePurchaseAppleRequest @@ -4546,6 +4570,26 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Nakama_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPut, pattern_Nakama_ValidatePurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchase", runtime.WithHTTPPathPattern("/v2/iap/purchase")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Nakama_ValidatePurchase_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Nakama_ValidatePurchase_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -6098,6 +6142,23 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Nakama_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodPut, pattern_Nakama_ValidatePurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchase", runtime.WithHTTPPathPattern("/v2/iap/purchase")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Nakama_ValidatePurchase_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Nakama_ValidatePurchase_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseApple_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -6365,6 +6426,7 @@ var ( pattern_Nakama_UnlinkSteam_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "account", "unlink", "steam"}, "")) pattern_Nakama_UpdateAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "account"}, "")) pattern_Nakama_UpdateGroup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "group", "group_id"}, "")) + pattern_Nakama_ValidatePurchase_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "iap", "purchase"}, "")) pattern_Nakama_ValidatePurchaseApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "apple"}, "")) pattern_Nakama_ValidateSubscriptionApple_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "subscription", "apple"}, "")) pattern_Nakama_ValidatePurchaseGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "google"}, "")) @@ -6455,6 +6517,7 @@ var ( forward_Nakama_UnlinkSteam_0 = runtime.ForwardResponseMessage forward_Nakama_UpdateAccount_0 = runtime.ForwardResponseMessage forward_Nakama_UpdateGroup_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidatePurchase_0 = runtime.ForwardResponseMessage forward_Nakama_ValidatePurchaseApple_0 = runtime.ForwardResponseMessage forward_Nakama_ValidateSubscriptionApple_0 = runtime.ForwardResponseMessage forward_Nakama_ValidatePurchaseGoogle_0 = runtime.ForwardResponseMessage diff --git a/apigrpc/apigrpc.proto b/apigrpc/apigrpc.proto index bb48ab3086..c7f0337451 100644 --- a/apigrpc/apigrpc.proto +++ b/apigrpc/apigrpc.proto @@ -677,6 +677,14 @@ service Nakama { }; } + // Validate Purchase + rpc ValidatePurchase (api.ValidatePurchaseRequest) returns (api.ValidatePurchaseResponse) { + option (google.api.http) = { + put: "/v2/iap/purchase", + body: "*" + }; + } + // Validate Apple IAP Receipt rpc ValidatePurchaseApple (api.ValidatePurchaseAppleRequest) returns (api.ValidatePurchaseResponse) { option (google.api.http) = { diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index 527b0f8346..5fef79c222 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -2216,6 +2216,39 @@ ] } }, + "/v2/iap/purchase": { + "put": { + "summary": "Validate Purchase", + "operationId": "Nakama_ValidatePurchase", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/apiValidatePurchaseResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/apiValidatePurchaseRequest" + } + } + ], + "tags": [ + "Nakama" + ] + } + }, "/v2/iap/purchase/apple": { "post": { "summary": "Validate Apple IAP Receipt", @@ -4839,10 +4872,13 @@ "HUAWEI_APP_GALLERY", "FACEBOOK_INSTANT_STORE", "XBOX_STORE", - "PLAYSTATION_STORE" + "PLAYSTATION_STORE", + "EPIC_STORE", + "STEAM_STORE", + "DISCORD_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store\n - PLAYSTATION_STORE: Playstation Store", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store\n - PLAYSTATION_STORE: Playstation Store\n - EPIC_STORE: Epic Store\n - STEAM_STORE: Steam Store\n - DISCORD_STORE: Discord Store", "title": "Validation Provider," }, "apiSubscriptionList": { @@ -5222,6 +5258,20 @@ }, "title": "Huawei IAP Purchase validation request" }, + "apiValidatePurchaseRequest": { + "type": "object", + "properties": { + "receipt": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "persist": { + "type": "boolean" + } + } + }, "apiValidatePurchaseResponse": { "type": "object", "properties": { @@ -5244,6 +5294,9 @@ }, "persist": { "type": "boolean" + }, + "platform": { + "type": "string" } }, "title": "Xbox Purchase validation request" diff --git a/apigrpc/apigrpc_grpc.pb.go b/apigrpc/apigrpc_grpc.pb.go index 5eb15807b1..a6dfaa3134 100644 --- a/apigrpc/apigrpc_grpc.pb.go +++ b/apigrpc/apigrpc_grpc.pb.go @@ -112,6 +112,7 @@ const ( Nakama_UnlinkSteam_FullMethodName = "/nakama.api.Nakama/UnlinkSteam" Nakama_UpdateAccount_FullMethodName = "/nakama.api.Nakama/UpdateAccount" Nakama_UpdateGroup_FullMethodName = "/nakama.api.Nakama/UpdateGroup" + Nakama_ValidatePurchase_FullMethodName = "/nakama.api.Nakama/ValidatePurchase" Nakama_ValidatePurchaseApple_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseApple" Nakama_ValidateSubscriptionApple_FullMethodName = "/nakama.api.Nakama/ValidateSubscriptionApple" Nakama_ValidatePurchaseGoogle_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseGoogle" @@ -279,6 +280,8 @@ type NakamaClient interface { UpdateAccount(ctx context.Context, in *api.UpdateAccountRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Update fields in a given group. UpdateGroup(ctx context.Context, in *api.UpdateGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Validate Purchase + ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Validate Apple IAP Receipt ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Validate Apple Subscription Receipt @@ -1049,6 +1052,16 @@ func (c *nakamaClient) UpdateGroup(ctx context.Context, in *api.UpdateGroupReque return out, nil } +func (c *nakamaClient) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(api.ValidatePurchaseResponse) + err := c.cc.Invoke(ctx, Nakama_ValidatePurchase_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *nakamaClient) ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.ValidatePurchaseResponse) @@ -1304,6 +1317,8 @@ type NakamaServer interface { UpdateAccount(context.Context, *api.UpdateAccountRequest) (*emptypb.Empty, error) // Update fields in a given group. UpdateGroup(context.Context, *api.UpdateGroupRequest) (*emptypb.Empty, error) + // Validate Purchase + ValidatePurchase(context.Context, *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) // Validate Apple IAP Receipt ValidatePurchaseApple(context.Context, *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) // Validate Apple Subscription Receipt @@ -1556,6 +1571,9 @@ func (UnimplementedNakamaServer) UpdateAccount(context.Context, *api.UpdateAccou func (UnimplementedNakamaServer) UpdateGroup(context.Context, *api.UpdateGroupRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateGroup not implemented") } +func (UnimplementedNakamaServer) ValidatePurchase(context.Context, *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchase not implemented") +} func (UnimplementedNakamaServer) ValidatePurchaseApple(context.Context, *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseApple not implemented") } @@ -2939,6 +2957,24 @@ func _Nakama_UpdateGroup_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _Nakama_ValidatePurchase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(api.ValidatePurchaseRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NakamaServer).ValidatePurchase(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Nakama_ValidatePurchase_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NakamaServer).ValidatePurchase(ctx, req.(*api.ValidatePurchaseRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Nakama_ValidatePurchaseApple_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(api.ValidatePurchaseAppleRequest) if err := dec(in); err != nil { @@ -3422,6 +3458,10 @@ var Nakama_ServiceDesc = grpc.ServiceDesc{ MethodName: "UpdateGroup", Handler: _Nakama_UpdateGroup_Handler, }, + { + MethodName: "ValidatePurchase", + Handler: _Nakama_ValidatePurchase_Handler, + }, { MethodName: "ValidatePurchaseApple", Handler: _Nakama_ValidatePurchaseApple_Handler, diff --git a/console/console.swagger.json b/console/console.swagger.json index 2c7a167588..bc71b55141 100644 --- a/console/console.swagger.json +++ b/console/console.swagger.json @@ -3289,10 +3289,13 @@ "HUAWEI_APP_GALLERY", "FACEBOOK_INSTANT_STORE", "XBOX_STORE", - "PLAYSTATION_STORE" + "PLAYSTATION_STORE", + "EPIC_STORE", + "STEAM_STORE", + "DISCORD_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store\n - PLAYSTATION_STORE: Playstation Store", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store\n - XBOX_STORE: Xbox Store\n - PLAYSTATION_STORE: Playstation Store\n - EPIC_STORE: Epic Store\n - STEAM_STORE: Steam Store\n - DISCORD_STORE: Discord Store", "title": "Validation Provider," }, "apiSubscriptionList": { diff --git a/go.mod b/go.mod index 8cc3c03d7e..f78736fa7b 100644 --- a/go.mod +++ b/go.mod @@ -75,3 +75,5 @@ require ( golang.org/x/text v0.24.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 // indirect ) + +replace github.com/heroiclabs/nakama-common v1.37.0 => ../nakama-common-master/nakama-common diff --git a/go.sum b/go.sum index 8675a82aa0..e96561f36a 100644 --- a/go.sum +++ b/go.sum @@ -98,8 +98,6 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/heroiclabs/nakama-common v1.37.0 h1:RceEGzvb+d+kPZY7ONbfozjaVyX3wIqNA/zZyp+M+mw= -github.com/heroiclabs/nakama-common v1.37.0/go.mod h1:gpGzr0tineLtVeNuBNfN4lObWfalcXClXdH/LHV9IX0= github.com/heroiclabs/sql-migrate v0.0.0-20241125131053-95a7949783b0 h1:hHJcYOP6L2/wZIEnYjjkJM+rOk/bK0uaYkDAejYpLhI= github.com/heroiclabs/sql-migrate v0.0.0-20241125131053-95a7949783b0/go.mod h1:uwcmopkVQIfb/JQqul5zmGI9ounclRC08j9S9lLcpRQ= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= diff --git a/iap/apple.go b/iap/apple.go new file mode 100644 index 0000000000..34c8d83c58 --- /dev/null +++ b/iap/apple.go @@ -0,0 +1,579 @@ +package iap + +import ( + "context" + "crypto/x509" + "database/sql" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "github.com/gofrs/uuid/v5" + "github.com/heroiclabs/nakama-common/api" + "github.com/heroiclabs/nakama-common/runtime" + "github.com/jackc/pgerrcode" + "github.com/jackc/pgx/v5/pgconn" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" + "io" + "net/http" + "strconv" + "strings" + "time" +) + +type ApplePurchaseProvider struct { + nk runtime.NakamaModule + logger *zap.Logger + purchaseFn runtime.PurchaseRefundFn + subscriptionFn runtime.SubscriptionRefundFn +} + +func (a ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) { + a.logger.Info("Initializing internal apple purchase provider") + a.purchaseFn = purchaseRefundFn + a.subscriptionFn = subscriptionRefundFn +} + +func (a ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, receipt string, userID uuid.UUID, persist bool, config runtime.IAPConfig) (*api.ValidatePurchaseResponse, error) { + a.logger.Info("purcahse validate on apple internal purchase provider hit") + validation, raw, err := ValidateReceiptApple(ctx, Httpc, receipt, config.GetApple().GetSharedPassword()) + if err != nil { + if err != context.Canceled { + var vErr *ValidationError + if errors.As(err, &vErr) { + logger.Debug("Error validating Apple receipt", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) + return nil, vErr + } else { + logger.Error("Error validating Apple receipt", zap.Error(err)) + } + } + return nil, err + } + + if validation.Status != AppleReceiptIsValid { + if validation.IsRetryable { + return nil, status.Error(codes.Unavailable, "Apple IAP verification is currently unavailable. Try again later.") + } + return nil, status.Error(codes.FailedPrecondition, fmt.Sprintf("Invalid Receipt. Status: %d", validation.Status)) + } + + env := api.StoreEnvironment_PRODUCTION + if validation.Environment == AppleSandboxEnvironment { + env = api.StoreEnvironment_SANDBOX + } + + seenTransactionIDs := make(map[string]struct{}, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) + storagePurchases := make([]*StoragePurchase, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) + for _, purchase := range validation.Receipt.InApp { + if purchase.ExpiresDateMs != "" { + continue + } + if _, seen := seenTransactionIDs[purchase.TransactionId]; seen { + continue + } + + purchaseTime, err := strconv.ParseInt(purchase.PurchaseDateMs, 10, 64) + if err != nil { + return nil, err + } + + seenTransactionIDs[purchase.TransactionId] = struct{}{} + storagePurchases = append(storagePurchases, &StoragePurchase{ + UserID: userID, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: purchase.ProductID, + TransactionId: purchase.TransactionId, + RawResponse: string(raw), + PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + }) + } + // latest_receipt_info can also contaion purchases. + // https://developer.apple.com/forums/thread/63092 + for _, purchase := range validation.LatestReceiptInfo { + if purchase.ExpiresDateMs != "" { + continue + } + if _, seen := seenTransactionIDs[purchase.TransactionId]; seen { + continue + } + + purchaseTime, err := strconv.ParseInt(purchase.PurchaseDateMs, 10, 64) + if err != nil { + return nil, err + } + + seenTransactionIDs[purchase.TransactionId] = struct{}{} + storagePurchases = append(storagePurchases, &StoragePurchase{ + UserID: userID, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: purchase.ProductId, + TransactionId: purchase.TransactionId, + RawResponse: string(raw), + PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + }) + } + + if len(storagePurchases) == 0 && len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo) > 0 { + // All purchases in this receipt are subscriptions. + return nil, status.Error(codes.FailedPrecondition, "Subscription Receipt. Use the appropriate function instead.") + } + + if !persist { + // Skip storing the receipts + validatedPurchases := make([]*api.ValidatedPurchase, 0, len(storagePurchases)) + for _, p := range storagePurchases { + validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ + UserId: p.UserID.String(), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + ProviderResponse: string(raw), + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil + } + + purchases, err := UpsertPurchases(ctx, db, storagePurchases) + if err != nil { + return nil, err + } + + validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) + for _, p := range purchases { + suid := p.UserID.String() + if p.UserID.IsNil() { + suid = "" + } + validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ + UserId: suid, + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), + ProviderResponse: string(raw), + SeenBefore: p.SeenBefore, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseResponse{ + ValidatedPurchases: validatedPurchases, + }, nil +} + +func (a ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { + validation, rawResponse, err := ValidateReceiptApple(ctx, Httpc, receipt, password) + if err != nil { + if err != context.Canceled { + var vErr *ValidationError + if errors.As(err, &vErr) { + logger.Error("Error validating Apple receipt", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) + return nil, vErr + } else { + logger.Error("Error validating Apple receipt", zap.Error(err)) + } + } + return nil, err + } + + if validation.Status != AppleReceiptIsValid { + if validation.IsRetryable { + return nil, status.Error(codes.Unavailable, "Apple IAP verification is currently unavailable. Try again later.") + } + return nil, status.Error(codes.FailedPrecondition, fmt.Sprintf("Invalid Receipt. Status: %d", validation.Status)) + } + + env := api.StoreEnvironment_PRODUCTION + if validation.Environment == AppleSandboxEnvironment { + env = api.StoreEnvironment_SANDBOX + } + + var found bool + var receiptInfo ValidateReceiptAppleResponseLatestReceiptInfo + for _, latestReceiptInfo := range validation.LatestReceiptInfo { + if latestReceiptInfo.ExpiresDateMs == "" { + // Not a subscription, skip. + continue + } + receiptInfo = latestReceiptInfo + found = true + } + if !found { + // Receipt is for a purchase (or otherwise has no subscriptions for any reason) so ValidatePurchaseApple should be used instead. + return nil, status.Error(codes.FailedPrecondition, "Purchase Receipt. Use the appropriate function instead.") + } + + purchaseTime, err := strconv.ParseInt(receiptInfo.OriginalPurchaseDateMs, 10, 64) + if err != nil { + return nil, err + } + + expireTimeInt, err := strconv.ParseInt(receiptInfo.ExpiresDateMs, 10, 64) + if err != nil { + return nil, err + } + + expireTime := ParseMillisecondUnixTimestamp(expireTimeInt) + + active := false + if expireTime.After(time.Now()) { + active = true + } + + storageSub := &StorageSubscription{ + UserID: userID, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: receiptInfo.ProductId, + OriginalTransactionId: receiptInfo.OriginalTransactionId, + PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + ExpireTime: expireTime, + RawResponse: string(rawResponse), + } + + validatedSub := &api.ValidatedSubscription{ + UserId: storageSub.UserID.String(), + ProductId: storageSub.ProductId, + OriginalTransactionId: storageSub.OriginalTransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + PurchaseTime: timestamppb.New(storageSub.PurchaseTime), + Environment: env, + Active: active, + ExpiryTime: timestamppb.New(storageSub.ExpireTime), + ProviderResponse: storageSub.RawResponse, + ProviderNotification: storageSub.RawNotification, + } + + if !persist { + return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil + } + + if err = UpsertSubscription(ctx, db, storageSub); err != nil { + return nil, err + } + + suid := storageSub.UserID.String() + if storageSub.UserID.IsNil() { + suid = "" + } + + validatedSub.UserId = suid + validatedSub.CreateTime = timestamppb.New(storageSub.CreateTime) + validatedSub.UpdateTime = timestamppb.New(storageSub.UpdateTime) + validatedSub.ProviderResponse = storageSub.RawResponse + validatedSub.ProviderNotification = storageSub.RawNotification + + return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil +} + +func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) (http.HandlerFunc, error) { + return func(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + if err != nil { + logger.Error("Failed to decode App Store notification body", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + defer r.Body.Close() + + var applePayload *AppleNotificationSignedPayload + if err := json.Unmarshal(body, &applePayload); err != nil { + logger.Error("Failed to unmarshal App Store notification", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + tokens := strings.Split(applePayload.SignedPayload, ".") + if len(tokens) < 3 { + logger.Error("Unexpected App Store notification JWS token length") + w.WriteHeader(http.StatusInternalServerError) + return + } + + seg := tokens[0] + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } + + headerByte, err := base64.StdEncoding.DecodeString(seg) + if err != nil { + logger.Error("Failed to decode Apple notification JWS header", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + type Header struct { + Alg string `json:"alg"` + X5c []string `json:"x5c"` + } + var header Header + + if err = json.Unmarshal(headerByte, &header); err != nil { + logger.Error("Failed to unmarshal Apple notification JWS header", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + certs := make([][]byte, 0) + for _, encodedCert := range header.X5c { + cert, err := base64.StdEncoding.DecodeString(encodedCert) + if err != nil { + logger.Error("Failed to decode Apple notification JWS header certificate", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + certs = append(certs, cert) + } + + rootCert := x509.NewCertPool() + ok := rootCert.AppendCertsFromPEM([]byte(AppleRootPEM)) + if !ok { + logger.Error("Failed to parse Apple root certificate", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + interCert, err := x509.ParseCertificate(certs[1]) + if err != nil { + logger.Error("Failed to parse Apple notification intermediate certificate", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + intermedia := x509.NewCertPool() + intermedia.AddCert(interCert) + + cert, err := x509.ParseCertificate(certs[2]) + if err != nil { + logger.Error("Failed to parse Apple notification certificate", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + opts := x509.VerifyOptions{ + Roots: rootCert, + Intermediates: intermedia, + } + + _, err = cert.Verify(opts) + if err != nil { + logger.Error("Failed to validate Apple notification signature", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + seg = tokens[1] + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } + + jsonPayload, err := base64.StdEncoding.DecodeString(seg) + if err != nil { + logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + var notificationPayload *AppleNotificationPayload + if err = json.Unmarshal(jsonPayload, ¬ificationPayload); err != nil { + logger.Error("Failed to json unmarshal App Store notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + tokens = strings.Split(notificationPayload.Data.SignedTransactionInfo, ".") + if len(tokens) < 3 { + logger.Error("Unexpected App Store notification SignedTransactionInfo JWS token length") + w.WriteHeader(http.StatusInternalServerError) + return + } + + seg = tokens[1] + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } + + jsonPayload, err = base64.StdEncoding.DecodeString(seg) + if err != nil { + logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + var signedTransactionInfo *AppleNotificationTransactionInfo + if err = json.Unmarshal(jsonPayload, &signedTransactionInfo); err != nil { + logger.Error("Failed to json unmarshal App Store notification SignedTransactionInfo JWS token", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + logger.Debug("Apple IAP notification received", zap.Any("notification_payload", signedTransactionInfo)) + + uid := uuid.Nil + if signedTransactionInfo.AppAccountToken != "" { + tokenUID, err := uuid.FromString(signedTransactionInfo.AppAccountToken) + if err != nil { + logger.Warn("App Store subscription notification AppAccountToken is an invalid uuid", zap.String("app_account_token", signedTransactionInfo.AppAccountToken), zap.Error(err), zap.String("payload", string(body))) + } else { + uid = tokenUID + } + } + + env := api.StoreEnvironment_PRODUCTION + if notificationPayload.Data.Environment == AppleSandboxEnvironment { + env = api.StoreEnvironment_SANDBOX + } + + if signedTransactionInfo.ExpiresDateMs != 0 { + // Notification regarding a subscription. + if uid.IsNil() { + // No user ID was found in receipt, lookup a validated subscription. + s, err := GetSubscriptionByOriginalTransactionId(r.Context(), logger, db, signedTransactionInfo.OriginalTransactionId) + if err != nil || s == nil { + w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. + return + } + uid = uuid.Must(uuid.FromString(s.UserId)) + } + + sub := &StorageSubscription{ + UserID: uid, + OriginalTransactionId: signedTransactionInfo.OriginalTransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: signedTransactionInfo.ProductId, + PurchaseTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.OriginalPurchaseDateMs), + Environment: env, + ExpireTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.ExpiresDateMs), + RawNotification: string(body), + RefundTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), + } + + if err = UpsertSubscription(r.Context(), db, sub); err != nil { + var pgErr *pgconn.PgError + if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { + // User id was not found, ignore this notification + w.WriteHeader(http.StatusOK) + return + } + logger.Error("Failed to store App Store notification subscription data", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + active := false + if sub.ExpireTime.After(time.Now()) && sub.RefundTime.Unix() == 0 { + active = true + } + + var suid string + if !sub.UserID.IsNil() { + suid = sub.UserID.String() + } + + if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { + validatedSub := &api.ValidatedSubscription{ + UserId: suid, + ProductId: sub.ProductId, + OriginalTransactionId: sub.OriginalTransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + PurchaseTime: timestamppb.New(sub.PurchaseTime), + CreateTime: timestamppb.New(sub.CreateTime), + UpdateTime: timestamppb.New(sub.UpdateTime), + Environment: env, + ExpiryTime: timestamppb.New(sub.ExpireTime), + RefundTime: timestamppb.New(sub.RefundTime), + ProviderResponse: sub.RawResponse, + ProviderNotification: sub.RawNotification, + Active: active, + } + + if a.subscriptionFn != nil { + if err = a.subscriptionFn(r.Context(), logger, db, a.nk, validatedSub, string(body)); err != nil { + logger.Error("Error invoking Apple subscription refund runtime function", zap.Error(err)) + w.WriteHeader(http.StatusOK) + return + } + } + } + + } else { + // Notification regarding a purchase. + if uid.IsNil() { + // No user ID was found in receipt, lookup a validated subscription. + p, err := GetPurchaseByTransactionId(r.Context(), logger, db, signedTransactionInfo.TransactionId) + if err != nil || p == nil { + // User validated purchase not found. + w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. + return + } + uid = uuid.Must(uuid.FromString(p.UserId)) + } + + if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { + purchase := &StoragePurchase{ + UserID: uid, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: signedTransactionInfo.ProductId, + TransactionId: signedTransactionInfo.TransactionId, + PurchaseTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.PurchaseDateMs), + RefundTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), + Environment: env, + } + + dbPurchases, err := UpsertPurchases(r.Context(), db, []*StoragePurchase{purchase}) + if err != nil { + logger.Error("Failed to store App Store notification purchase data") + w.WriteHeader(http.StatusInternalServerError) + return + } + + if a.purchaseFn != nil { + dbPurchase := dbPurchases[0] + suid := dbPurchase.UserID.String() + if dbPurchase.UserID.IsNil() { + suid = "" + } + validatedPurchase := &api.ValidatedPurchase{ + UserId: suid, + ProductId: signedTransactionInfo.ProductId, + TransactionId: signedTransactionInfo.TransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + CreateTime: timestamppb.New(dbPurchase.CreateTime), + UpdateTime: timestamppb.New(dbPurchase.UpdateTime), + PurchaseTime: timestamppb.New(dbPurchase.PurchaseTime), + RefundTime: timestamppb.New(dbPurchase.RefundTime), + ProviderResponse: string(body), + Environment: env, + SeenBefore: dbPurchase.SeenBefore, + } + + if err = a.purchaseFn(r.Context(), logger, db, a.nk, validatedPurchase, string(body)); err != nil { + logger.Error("Error invoking Apple purchase refund runtime function", zap.Error(err)) + w.WriteHeader(http.StatusOK) + return + } + } + } + } + + w.WriteHeader(http.StatusOK) + }, nil +} + +func NewApplePurchaseProvider(nk runtime.NakamaModule, logger *zap.Logger) runtime.PurchaseProvider { + purchaseProvider := &ApplePurchaseProvider{ + nk: nk, + logger: logger, + } + + return purchaseProvider +} diff --git a/iap/iap.go b/iap/iap.go index 2583006660..e1b419e968 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -19,11 +19,18 @@ import ( "crypto/rsa" "crypto/sha256" "crypto/x509" + "database/sql" "encoding/base64" "encoding/json" "encoding/pem" "errors" "fmt" + "github.com/gofrs/uuid/v5" + "github.com/heroiclabs/nakama-common/api" + "github.com/heroiclabs/nakama-common/runtime" + "github.com/jackc/pgx/v5/pgtype" + "go.uber.org/zap" + "google.golang.org/protobuf/types/known/timestamppb" "io" "net/http" "net/url" @@ -54,11 +61,95 @@ const ( const accessTokenExpiresGracePeriod = 300 // 5 min grace period +const AppleRootPEM = ` +-----BEGIN CERTIFICATE----- +MIICQzCCAcmgAwIBAgIILcX8iNLFS5UwCgYIKoZIzj0EAwMwZzEbMBkGA1UEAwwS +QXBwbGUgUm9vdCBDQSAtIEczMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcN +MTQwNDMwMTgxOTA2WhcNMzkwNDMwMTgxOTA2WjBnMRswGQYDVQQDDBJBcHBsZSBS +b290IENBIC0gRzMxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABJjpLz1AcqTtkyJygRMc3RCV8cWjTnHcFBbZDuWmBSp3ZHtf +TjjTuxxEtX/1H7YyYl3J6YRbTzBPEVoA/VhYDKX1DyxNB0cTddqXl5dvMVztK517 +IDvYuVTZXpmkOlEKMaNCMEAwHQYDVR0OBBYEFLuw3qFYM4iapIqZ3r6966/ayySr +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gA +MGUCMQCD6cHEFl4aXTQY2e3v9GwOAEZLuN+yRhHFD/3meoyhpmvOwgPUnPWTxnS4 +at+qIxUCMG1mihDK1A3UT82NQz60imOlM27jbdoXt2QfyFMm+YhidDkLF1vLUagM +6BgD56KyKA== +-----END CERTIFICATE----- +` + var cachedTokensGoogle = &googleTokenCache{ tokenMap: make(map[string]*accessTokenGoogle), } var cachedTokenHuawei accessTokenHuawei +var Httpc = &http.Client{Timeout: 20 * time.Second} + +type AppleNotificationSignedPayload struct { + SignedPayload string `json:"signedPayload"` +} + +type AppleNotificationPayload struct { + NotificationType string `json:"notificationType"` + Subtype string `json:"subtype"` + Version string `json:"version"` + Data AppleNotificationData `json:"data"` + SignedDate int64 `json:"signedDate"` +} + +type AppleNotificationData struct { + Environment string `json:"string"` + BundleId string `json:"bundleId"` + BundleVersion string `json:"bundleVersion"` + SignedTransactionInfo string `json:"signedTransactionInfo"` + SignedRenewalInfo string `json:"signedRenewalInfo"` +} + +type AppleNotificationTransactionInfo struct { + AppAccountToken string `json:"appAccountToken"` + BundleId string `json:"bundleId"` + Environment string `json:"environment"` + TransactionId string `json:"transactionId"` + OriginalTransactionId string `json:"originalTransactionId"` + ProductId string `json:"productId"` + ExpiresDateMs int64 `json:"expiresDate"` + RevocationDateMs int64 `json:"revocationDate"` + OriginalPurchaseDateMs int64 `json:"originalPurchaseDate"` + PurchaseDateMs int64 `json:"purchaseDate"` +} + +const AppleNotificationTypeRefund = "REFUND" + +type StoragePurchase struct { + UserID uuid.UUID + Store api.StoreProvider + ProductId string + TransactionId string + RawResponse string + PurchaseTime time.Time + CreateTime time.Time // Set by upsertPurchases + UpdateTime time.Time // Set by upsertPurchases + RefundTime time.Time + Environment api.StoreEnvironment + SeenBefore bool // Set by upsertPurchases +} + +type StorageSubscription struct { + OriginalTransactionId string + UserID uuid.UUID + Store api.StoreProvider + ProductId string + PurchaseTime time.Time + CreateTime time.Time // Set by upsertSubscription + UpdateTime time.Time // Set by upsertSubscription + RefundTime time.Time + Environment api.StoreEnvironment + ExpireTime time.Time + RawResponse string + RawNotification string +} + type Platform int const ( @@ -78,6 +169,8 @@ func (enum Platform) String() string { return [...]string{"apple", "google", "facebook", "huawei"}[enum] } +var AllPlatforms = []Platform{Apple, Google, Facebook, Huawei, Xbox, Playstation, Steam, Epic, Discord} + func FromString(s string) Platform { return map[string]Platform{ "apple": Apple, @@ -86,9 +179,30 @@ func FromString(s string) Platform { "huawei": Huawei, "xbox": Xbox, "playstation": Playstation, + "epic": Epic, + "steam": Steam, + "discord": Discord, }[s] } +func GetPurchaseProvider(platform string, purchaseProviders map[string]runtime.PurchaseProvider) (runtime.PurchaseProvider, error) { + purchaseProvider, exists := purchaseProviders[platform] + if !exists || purchaseProvider == nil { + return nil, errors.New("purchase provider doesn't exist") + } + + return purchaseProvider, nil +} + +func GetRefundFn(platform string, refundFns map[string]runtime.RefundFns) (runtime.RefundFns, error) { + refundFn, exists := refundFns[platform] + if !exists || refundFn == nil { + return nil, errors.New("refund fn doesn't exist") + } + + return refundFn, nil +} + type googleTokenCache struct { sync.RWMutex tokenMap map[string]*accessTokenGoogle @@ -978,3 +1092,290 @@ func ValidateReceiptFacebookInstant(appSecret, signedRequest string) (*FacebookI return payment, string(payload), nil } + +func UpsertPurchases(ctx context.Context, db *sql.DB, purchases []*StoragePurchase) ([]*StoragePurchase, error) { + if len(purchases) < 1 { + return nil, errors.New("expects at least one receipt") + } + + transactionIDsToPurchase := make(map[string]*StoragePurchase) + + userIdParams := make([]uuid.UUID, 0, len(purchases)) + storeParams := make([]api.StoreProvider, 0, len(purchases)) + transactionIdParams := make([]string, 0, len(purchases)) + productIdParams := make([]string, 0, len(purchases)) + purchaseTimeParams := make([]time.Time, 0, len(purchases)) + rawResponseParams := make([]string, 0, len(purchases)) + environmentParams := make([]api.StoreEnvironment, 0, len(purchases)) + refundTimeParams := make([]time.Time, 0, len(purchases)) + + for _, purchase := range purchases { + if purchase.RefundTime.IsZero() { + purchase.RefundTime = time.Unix(0, 0) + } + if purchase.RawResponse == "" { + purchase.RawResponse = "{}" + } + transactionIDsToPurchase[purchase.TransactionId] = purchase + + userIdParams = append(userIdParams, purchase.UserID) + storeParams = append(storeParams, purchase.Store) + transactionIdParams = append(transactionIdParams, purchase.TransactionId) + productIdParams = append(productIdParams, purchase.ProductId) + purchaseTimeParams = append(purchaseTimeParams, purchase.PurchaseTime) + rawResponseParams = append(rawResponseParams, purchase.RawResponse) + environmentParams = append(environmentParams, purchase.Environment) + refundTimeParams = append(refundTimeParams, purchase.RefundTime) + } + + query := ` +INSERT INTO purchase + ( + user_id, + store, + transaction_id, + product_id, + purchase_time, + raw_response, + environment, + refund_time + ) +SELECT unnest($1::uuid[]), unnest($2::smallint[]), unnest($3::text[]), unnest($4::text[]), unnest($5::timestamptz[]), unnest($6::jsonb[]), unnest($7::smallint[]), unnest($8::timestamptz[]) +ON CONFLICT + (transaction_id) +DO UPDATE SET + refund_time = EXCLUDED.refund_time, + update_time = now() +RETURNING + user_id, + transaction_id, + create_time, + update_time, + refund_time +` + + rows, err := db.QueryContext(ctx, query, userIdParams, storeParams, transactionIdParams, productIdParams, purchaseTimeParams, rawResponseParams, environmentParams, refundTimeParams) + if err != nil { + return nil, err + } + for rows.Next() { + // Newly inserted purchases + var dbUserID uuid.UUID + var transactionId string + var createTime pgtype.Timestamptz + var updateTime pgtype.Timestamptz + var refundTime pgtype.Timestamptz + if err = rows.Scan(&dbUserID, &transactionId, &createTime, &updateTime, &refundTime); err != nil { + _ = rows.Close() + return nil, err + } + storedPurchase := transactionIDsToPurchase[transactionId] + storedPurchase.CreateTime = createTime.Time + storedPurchase.UpdateTime = updateTime.Time + storedPurchase.SeenBefore = updateTime.Time.After(createTime.Time) + if refundTime.Time.Unix() != 0 { + storedPurchase.RefundTime = refundTime.Time + } + } + _ = rows.Close() + if err := rows.Err(); err != nil { + return nil, err + } + + storedPurchases := make([]*StoragePurchase, 0, len(transactionIDsToPurchase)) + for _, purchase := range transactionIDsToPurchase { + storedPurchases = append(storedPurchases, purchase) + } + + return storedPurchases, nil +} + +func ParseMillisecondUnixTimestamp(t int64) time.Time { + return time.Unix(0, 0).Add(time.Duration(t) * time.Millisecond) +} + +func GetPurchaseByTransactionId(ctx context.Context, logger *zap.Logger, db *sql.DB, transactionID string) (*api.ValidatedPurchase, error) { + var ( + dbTransactionId string + dbUserId uuid.UUID + dbStore api.StoreProvider + dbCreateTime pgtype.Timestamptz + dbUpdateTime pgtype.Timestamptz + dbPurchaseTime pgtype.Timestamptz + dbRefundTime pgtype.Timestamptz + dbProductId string + dbEnvironment api.StoreEnvironment + dbRawResponse string + ) + + err := db.QueryRowContext(ctx, ` + SELECT + user_id, + store, + transaction_id, + create_time, + update_time, + purchase_time, + refund_time, + product_id, + environment, + raw_response + FROM purchase + WHERE transaction_id = $1 +`, transactionID).Scan(&dbUserId, &dbStore, &dbTransactionId, &dbCreateTime, &dbUpdateTime, &dbPurchaseTime, &dbRefundTime, &dbProductId, &dbEnvironment, &dbRawResponse) + if err != nil { + if err == sql.ErrNoRows { + // Not found + return nil, nil + } + logger.Error("Error getting purchase", zap.Error(err)) + return nil, err + } + + suid := dbUserId.String() + if dbUserId.IsNil() { + suid = "" + } + + return &api.ValidatedPurchase{ + UserId: suid, + ProductId: dbProductId, + TransactionId: dbTransactionId, + Store: dbStore, + PurchaseTime: timestamppb.New(dbPurchaseTime.Time), + CreateTime: timestamppb.New(dbCreateTime.Time), + UpdateTime: timestamppb.New(dbUpdateTime.Time), + Environment: dbEnvironment, + RefundTime: timestamppb.New(dbRefundTime.Time), + ProviderResponse: dbRawResponse, + }, nil +} + +func UpsertSubscription(ctx context.Context, db *sql.DB, sub *StorageSubscription) error { + if sub.RefundTime.IsZero() { + // Refund time not set, init as default value. + sub.RefundTime = time.Unix(0, 0) + } + + query := ` +INSERT +INTO + subscription + ( + user_id, + store, + original_transaction_id, + product_id, + purchase_time, + environment, + expire_time, + raw_response, + raw_notification, + refund_time + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, to_jsonb(coalesce(nullif($8, ''), '{}')), to_jsonb(coalesce(nullif($9, ''), '{}')), $10) +ON CONFLICT + (original_transaction_id) +DO + UPDATE SET + expire_time = $7, + update_time = now(), + raw_response = coalesce(to_jsonb(nullif($8, '')), subscription.raw_response::jsonb), + raw_notification = coalesce(to_jsonb(nullif($9, '')), subscription.raw_notification::jsonb), + refund_time = coalesce($10, subscription.refund_time) +RETURNING + user_id, create_time, update_time, expire_time, refund_time, raw_response, raw_notification +` + var ( + userID uuid.UUID + createTime pgtype.Timestamptz + updateTime pgtype.Timestamptz + expireTime pgtype.Timestamptz + refundTime pgtype.Timestamptz + rawResponse string + rawNotification string + ) + if err := db.QueryRowContext(ctx, query, sub.UserID, sub.Store, sub.OriginalTransactionId, sub.ProductId, sub.PurchaseTime, sub.Environment, sub.ExpireTime, sub.RawResponse, sub.RawNotification, sub.RefundTime).Scan(&userID, &createTime, &updateTime, &expireTime, &refundTime, &rawResponse, &rawNotification); err != nil { + return err + } + + sub.UserID = userID + sub.CreateTime = createTime.Time + sub.UpdateTime = updateTime.Time + sub.ExpireTime = expireTime.Time + sub.RefundTime = refundTime.Time + sub.RawResponse = rawResponse + sub.RawNotification = rawNotification + + return nil +} + +func GetSubscriptionByOriginalTransactionId(ctx context.Context, logger *zap.Logger, db *sql.DB, originalTransactionId string) (*api.ValidatedSubscription, error) { + var ( + dbUserId uuid.UUID + dbStore api.StoreProvider + dbOriginalTransactionId string + dbCreateTime pgtype.Timestamptz + dbUpdateTime pgtype.Timestamptz + dbExpireTime pgtype.Timestamptz + dbPurchaseTime pgtype.Timestamptz + dbRefundTime pgtype.Timestamptz + dbProductId string + dbEnvironment api.StoreEnvironment + dbRawResponse string + dbRawNotification string + ) + + err := db.QueryRowContext(ctx, ` + SELECT + user_id, + store, + original_transaction_id, + create_time, + update_time, + expire_time, + purchase_time, + refund_time, + product_id, + environment, + raw_response, + raw_notification + FROM subscription + WHERE original_transaction_id = $1 +`, originalTransactionId).Scan(&dbUserId, &dbStore, &dbOriginalTransactionId, &dbCreateTime, &dbUpdateTime, &dbExpireTime, &dbPurchaseTime, &dbRefundTime, &dbProductId, &dbEnvironment, &dbRawResponse, &dbRawNotification) + if err != nil { + if err == sql.ErrNoRows { + // Not found + return nil, nil + } + logger.Error("Failed to get subscription", zap.Error(err)) + return nil, err + } + + active := false + if dbExpireTime.Time.After(time.Now()) && dbRefundTime.Time.Unix() == 0 { + active = true + } + + suid := dbUserId.String() + if dbUserId.IsNil() { + suid = "" + } + + return &api.ValidatedSubscription{ + UserId: suid, + ProductId: dbProductId, + OriginalTransactionId: dbOriginalTransactionId, + Store: dbStore, + PurchaseTime: timestamppb.New(dbPurchaseTime.Time), + CreateTime: timestamppb.New(dbCreateTime.Time), + UpdateTime: timestamppb.New(dbUpdateTime.Time), + Environment: dbEnvironment, + ExpiryTime: timestamppb.New(dbExpireTime.Time), + RefundTime: timestamppb.New(dbRefundTime.Time), + ProviderResponse: dbRawResponse, + ProviderNotification: dbRawNotification, + Active: active, + }, nil +} diff --git a/server/api_purchase.go b/server/api_purchase.go index 3e2fa5ca09..bae4bf6b3f 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -16,13 +16,84 @@ package server import ( "context" + "fmt" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" + "github.com/heroiclabs/nakama/v3/iap" "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) +// // hit from validatepurchase rpc - should i just include the paramters for each platform in the validate purchase request struct +func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) { + userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + + // Before hook. + // should i just use one before hook for all the validate purchase calls + //if fn := s.runtime.BeforeValidatePurchase(); fn != nil { + // beforeFn := func(clientIP, clientPort string) error { + // result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + // if err != nil { + // return status.Error(code, err.Error()) + // } + // if result == nil { + // // If result is nil, requested resource is disabled. + // s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) + // return status.Error(codes.NotFound, "Requested resource was not found.") + // } + // in = result + // return nil + // } + // + // // Execute the before function lambda wrapped in a trace for stats measurement. + // err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + // if err != nil { + // return nil, err + // } + //} + + // still need to handle this for every platform + // create a validate inputs based on platform func + //if s.config.GetIAP().Apple.SharedPassword == "" { + // return nil, status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") + //} + + // receipt can be empty for steam + if len(in.Receipt) < 1 { + return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") + } + + persist := true + if in.Persist != nil { + persist = in.Persist.GetValue() + } + + purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) + if err != nil { + return nil, status.Error(codes.Internal, "failed to get purchase provider") + } + + validation, err := purchaseProvider.PurchaseValidate(ctx, s.logger, s.db, in.Receipt, userID, persist, s.config.GetIAP()) + if err != nil { + return nil, err + } + + // After hook. + // should i just use one after hook for all the validate purchase calls + // + //if fn := s.runtime.AfterValidatePurchaseApple(); fn != nil { + // afterFn := func(clientIP, clientPort string) error { + // return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) + // } + // + // // Execute the after function lambda wrapped in a trace for stats measurement. + // traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + //} + + return validation, err +} + func (s *ApiServer) ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) @@ -296,7 +367,17 @@ func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePu persist = in.Persist.GetValue() } - validation, err := s.runtime.iapXboxManager.PurchaseValidate(ctx, s.logger, s.db, s.config.GetIAP().Xbox.Token, "", in.ProductId, "", userID, persist) + provider, err := iap.GetPurchaseProvider("xbox", s.runtime.purchaseProviders) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + if provider == nil { + s.logger.Info(fmt.Sprintf("Xbox provider not found for purchase provider")) + return nil, status.Error(codes.NotFound, "Purchase provider not found.") + } + + validation, err := provider.PurchaseValidate(ctx, s.logger, s.db, in.ProductId, userID, persist, s.config.GetIAP()) if err != nil { return nil, err } @@ -340,7 +421,7 @@ func (s *ApiServer) ValidatePurchasePlaystation(ctx context.Context, in *api.Val } } - if s.config.GetIAP().Xbox.Token == "" { + if s.config.GetIAP().Playstation.Token == "" { return nil, status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") } @@ -353,9 +434,7 @@ func (s *ApiServer) ValidatePurchasePlaystation(ctx context.Context, in *api.Val persist = in.Persist.GetValue() } - playstationConfig := s.config.GetIAP().Playstation - // change xbox token to ps token - validation, err := s.runtime.iapPlaystationManager.PurchaseValidate(ctx, s.logger, s.db, playstationConfig.Token, playstationConfig.Environment, "", in.EntitlementLabel, userID, persist) + validation, err := s.runtime.purchaseProviders["playstation"].PurchaseValidate(ctx, s.logger, s.db, in.EntitlementLabel, userID, persist, s.config.GetIAP()) if err != nil { return nil, err } @@ -372,3 +451,61 @@ func (s *ApiServer) ValidatePurchasePlaystation(ctx context.Context, in *api.Val return validation, err } + +//func (s *ApiServer) ValidatePurchaseEpic(ctx context.Context, in *api.ValidatePurchaseEpicRequest) (*api.ValidatePurchaseResponse, error) { +// userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) +// +// // Before hook. +// if fn := s.runtime.BeforeValidatePurchaseEpic(); fn != nil { +// beforeFn := func(clientIP, clientPort string) error { +// result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) +// if err != nil { +// return status.Error(code, err.Error()) +// } +// if result == nil { +// // If result is nil, requested resource is disabled. +// s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) +// return status.Error(codes.NotFound, "Requested resource was not found.") +// } +// in = result +// return nil +// } +// +// // Execute the before function lambda wrapped in a trace for stats measurement. +// err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) +// if err != nil { +// return nil, err +// } +// } +// +// if s.config.GetIAP().Xbox.Token == "" { +// return nil, status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") +// } +// +// if len(in.NsCatalogItemId) < 1 { +// return nil, status.Error(codes.InvalidArgument, "NsCatalogItemId required.") +// } +// +// persist := true +// if in.Persist != nil { +// persist = in.Persist.GetValue() +// } +// +// epicConfig := s.config.GetIAP().Playstation +// validation, err := s.runtime.iapPlaystationManager.PurchaseValidate(ctx, s.logger, s.db, "", "", "", "", in.NsCatalogItemId, "", userID, persist) +// if err != nil { +// return nil, err +// } +// +// // After hook. +// if fn := s.runtime.AfterValidatePurchasePlaystation(); fn != nil { +// afterFn := func(clientIP, clientPort string) error { +// return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) +// } +// +// // Execute the after function lambda wrapped in a trace for stats measurement. +// traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) +// } +// +// return validation, err +//} diff --git a/server/config.go b/server/config.go index b04f904054..9b704d916c 100644 --- a/server/config.go +++ b/server/config.go @@ -1340,6 +1340,9 @@ type IAPConfig struct { FacebookInstant *IAPFacebookInstantConfig `yaml:"facebook_instant" json:"facebook_instant" usage:"Facebook Instant purchase validation configuration."` Xbox *IAPXboxConfig `yaml:"xbox" json:"xbox" usage:"Xbox Configuration."` Playstation *IAPPlaystationConfig `yaml:"playstation" json:"playstation" usage:"Playstation Configuration."` + //Epic *IAPEpicConfig `yaml:"epic" json:"epic" usage:"Epic Configuration."` + //Steam *IAPSteamConfig `yaml:"steam" json:"steam" usage:"Steam Configuration."` + //Discord *IAPDiscord `yaml:"discord" json:"discord" usage:"Discord Configuration."` } func (cfg *IAPConfig) GetApple() runtime.IAPAppleConfig { @@ -1362,6 +1365,12 @@ func (cfg *IAPConfig) GetXbox() runtime.IAPXboxConfig { return cfg.Xbox } func (cfg *IAPConfig) GetPlaystation() runtime.IAPPlaystationConfig { return cfg.Playstation } +//func (cfg *IAPConfig) GetEpic() runtime.IAPEpicConfig { return cfg.Epic } +// +//func (cfg *IAPConfig) GetSteam() runtime.IAPSteamConfig { return cfg.Steam } +// +//func (cfg *IAPConfig) GetDiscord() runtime.IAPDiscordConfig { return cfg.Discord } + func (cfg *IAPConfig) Clone() *IAPConfig { if cfg == nil { return nil diff --git a/server/console.go b/server/console.go index 885ddca666..35de585071 100644 --- a/server/console.go +++ b/server/console.go @@ -20,6 +20,7 @@ import ( "database/sql" "errors" "fmt" + "github.com/heroiclabs/nakama/v3/iap" "io" "math" "net" @@ -281,7 +282,18 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D // Register public subscription callback endpoints if config.GetIAP().Apple.NotificationsEndpointId != "" { endpoint := fmt.Sprintf("/v2/console/apple/subscriptions/%s", config.GetIAP().Apple.NotificationsEndpointId) - grpcGatewayRouter.HandleFunc(endpoint, appleNotificationHandler(logger, db, runtime.PurchaseNotificationApple(), runtime.SubscriptionNotificationApple())) + provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) + if err != nil && provider == nil { + startupLogger.Error("Console registration failed", zap.Error(err)) + } else { + handler, err := provider.HandleRefund(ctx, logger, db) + if err != nil { + startupLogger.Error("Console registration failed", zap.Error(err)) + } + grpcGatewayRouter.HandleFunc(endpoint, handler) + } + + //grpcGatewayRouter.HandleFunc(endpoint, appleNotificationHandler(logger, db, runtime.PurchaseNotificationApple(), runtime.SubscriptionNotificationApple())) logger.Info("Registered endpoint for Apple subscription notifications callback", zap.String("endpoint", endpoint)) } @@ -291,7 +303,7 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D logger.Info("Registered endpoint for Google subscription notifications callback", zap.String("endpoint", endpoint)) } - runtime.iapXboxManager.Init(runtime.PurchaseNotificationXbox()) + initPurchaseProviderRefundHooks(logger, config, runtime) // TODO: Register Huawei callbacks @@ -410,6 +422,48 @@ SELECT collection FROM t WHERE collection IS NOT NULL` return s } +func initPurchaseProviderRefundHooks(logger *zap.Logger, config Config, runtime *Runtime) error { + if runtime.refundFns == nil { + logger.Error("refundsFn map is nil") + return nil + } + + for _, platform := range iap.AllPlatforms { + refundFn, err := iap.GetRefundFn(platform.String(), runtime.refundFns) + if err != nil { + return err + } + + provider, err := iap.GetPurchaseProvider(platform.String(), runtime.purchaseProviders) + if err != nil { + logger.Error("Error getting Xbox provider", zap.Error(err)) + return err + } + + provider.Init(refundFn.Purchase, refundFn.Subscription) + } + + return nil + + //if config.GetIAP().Xbox.RefundCheckPeriodMin > 0 { + // provider, err := iap.GetPurchaseProvider("xbox", runtime.purchaseProviders) + // if err != nil { + // logger.Error("Error getting Xbox provider", zap.Error(err)) + // } + // + // provider.Init(runtime.purchaseNotificationXboxFunction, nil, nil) + //} + // + //if config.GetIAP().Apple.NotificationsEndpointId != "" { + // provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) + // if err != nil { + // logger.Error("Error getting Apple provider", zap.Error(err)) + // } + // + // provider.Init(nil, runtime.purchaseNotificationAppleFunction, runtime.subscriptionNotificationAppleFunction) + //} +} + func registerDashboardHandlers(logger *zap.Logger, router *mux.Router) { indexFn := func(w http.ResponseWriter, r *http.Request) { indexFile, err := console.UIFS.Open("index.html") diff --git a/server/console_purchase.go b/server/console_purchase.go index 4e689a5a1b..129dc9b140 100644 --- a/server/console_purchase.go +++ b/server/console_purchase.go @@ -16,6 +16,7 @@ package server import ( "context" + "github.com/heroiclabs/nakama/v3/iap" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" @@ -51,7 +52,7 @@ func (s *ConsoleServer) GetPurchase(ctx context.Context, in *console.GetPurchase return nil, status.Error(codes.InvalidArgument, "transaction id is required") } - purchase, err := GetPurchaseByTransactionId(ctx, s.logger, s.db, in.TransactionId) + purchase, err := iap.GetPurchaseByTransactionId(ctx, s.logger, s.db, in.TransactionId) if err != nil || purchase == nil { return nil, status.Error(codes.NotFound, "Purchase not found") } diff --git a/server/console_subscription.go b/server/console_subscription.go index 240d0dc01c..9940473b7c 100644 --- a/server/console_subscription.go +++ b/server/console_subscription.go @@ -16,6 +16,7 @@ package server import ( "context" + "github.com/heroiclabs/nakama/v3/iap" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" @@ -51,7 +52,7 @@ func (s *ConsoleServer) GetSubscription(ctx context.Context, in *console.GetSubs return nil, status.Error(codes.InvalidArgument, "original transaction id is required") } - subscription, err := getSubscriptionByOriginalTransactionId(ctx, s.logger, s.db, in.GetOriginalTransactionId()) + subscription, err := iap.GetSubscriptionByOriginalTransactionId(ctx, s.logger, s.db, in.GetOriginalTransactionId()) if err != nil || subscription == nil { return nil, status.Error(codes.NotFound, "subscription not found") } diff --git a/server/core_purchase.go b/server/core_purchase.go index e36462f265..00b91a1984 100644 --- a/server/core_purchase.go +++ b/server/core_purchase.go @@ -22,7 +22,6 @@ import ( "encoding/gob" "errors" "fmt" - "net/http" "slices" "strconv" "time" @@ -39,10 +38,8 @@ import ( var ErrPurchasesListInvalidCursor = errors.New("purchases list cursor invalid") -var httpc = &http.Client{Timeout: 20 * time.Second} - func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidatePurchaseResponse, error) { - validation, raw, err := iap.ValidateReceiptApple(ctx, httpc, receipt, password) + validation, raw, err := iap.ValidateReceiptApple(ctx, iap.Httpc, receipt, password) if err != nil { if err != context.Canceled { var vErr *iap.ValidationError @@ -69,7 +66,7 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, } seenTransactionIDs := make(map[string]struct{}, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) - storagePurchases := make([]*storagePurchase, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) + storagePurchases := make([]*iap.StoragePurchase, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) for _, purchase := range validation.Receipt.InApp { if purchase.ExpiresDateMs != "" { continue @@ -84,14 +81,14 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, } seenTransactionIDs[purchase.TransactionId] = struct{}{} - storagePurchases = append(storagePurchases, &storagePurchase{ - userID: userID, - store: api.StoreProvider_APPLE_APP_STORE, - productId: purchase.ProductID, - transactionId: purchase.TransactionId, - rawResponse: string(raw), - purchaseTime: parseMillisecondUnixTimestamp(purchaseTime), - environment: env, + storagePurchases = append(storagePurchases, &iap.StoragePurchase{ + UserID: userID, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: purchase.ProductID, + TransactionId: purchase.TransactionId, + RawResponse: string(raw), + PurchaseTime: iap.ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, }) } // latest_receipt_info can also contaion purchases. @@ -110,14 +107,14 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, } seenTransactionIDs[purchase.TransactionId] = struct{}{} - storagePurchases = append(storagePurchases, &storagePurchase{ - userID: userID, - store: api.StoreProvider_APPLE_APP_STORE, - productId: purchase.ProductId, - transactionId: purchase.TransactionId, - rawResponse: string(raw), - purchaseTime: parseMillisecondUnixTimestamp(purchaseTime), - environment: env, + storagePurchases = append(storagePurchases, &iap.StoragePurchase{ + UserID: userID, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: purchase.ProductId, + TransactionId: purchase.TransactionId, + RawResponse: string(raw), + PurchaseTime: iap.ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, }) } @@ -131,41 +128,41 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, validatedPurchases := make([]*api.ValidatedPurchase, 0, len(storagePurchases)) for _, p := range storagePurchases { validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ - UserId: p.userID.String(), - ProductId: p.productId, - TransactionId: p.transactionId, - Store: p.store, - PurchaseTime: timestamppb.New(p.purchaseTime), + UserId: p.UserID.String(), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), ProviderResponse: string(raw), - Environment: p.environment, + Environment: p.Environment, }) } return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := upsertPurchases(ctx, db, storagePurchases) + purchases, err := iap.UpsertPurchases(ctx, db, storagePurchases) if err != nil { return nil, err } validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) for _, p := range purchases { - suid := p.userID.String() - if p.userID.IsNil() { + suid := p.UserID.String() + if p.UserID.IsNil() { suid = "" } validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ UserId: suid, - ProductId: p.productId, - TransactionId: p.transactionId, - Store: p.store, - PurchaseTime: timestamppb.New(p.purchaseTime), - CreateTime: timestamppb.New(p.createTime), - UpdateTime: timestamppb.New(p.updateTime), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), ProviderResponse: string(raw), - SeenBefore: p.seenBefore, - Environment: p.environment, + SeenBefore: p.SeenBefore, + Environment: p.Environment, }) } @@ -175,7 +172,7 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, } func ValidatePurchaseGoogle(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, config *IAPGoogleConfig, receipt string, persist bool) (*api.ValidatePurchaseResponse, error) { - gResponse, gReceipt, raw, err := iap.ValidateReceiptGoogle(ctx, httpc, config.ClientEmail, config.PrivateKey, receipt) + gResponse, gReceipt, raw, err := iap.ValidateReceiptGoogle(ctx, iap.Httpc, config.ClientEmail, config.PrivateKey, receipt) if err != nil { if err != context.Canceled { var vErr *iap.ValidationError @@ -199,33 +196,33 @@ func ValidatePurchaseGoogle(ctx context.Context, logger *zap.Logger, db *sql.DB, return nil, status.Error(codes.FailedPrecondition, fmt.Sprintf("Invalid Receipt. State: %d", gReceipt.PurchaseState)) } - sPurchase := &storagePurchase{ - userID: userID, - store: api.StoreProvider_GOOGLE_PLAY_STORE, - productId: gReceipt.ProductID, - transactionId: gReceipt.PurchaseToken, - rawResponse: string(raw), - purchaseTime: parseMillisecondUnixTimestamp(gReceipt.PurchaseTime), - environment: purchaseEnv, + sPurchase := &iap.StoragePurchase{ + UserID: userID, + Store: api.StoreProvider_GOOGLE_PLAY_STORE, + ProductId: gReceipt.ProductID, + TransactionId: gReceipt.PurchaseToken, + RawResponse: string(raw), + PurchaseTime: iap.ParseMillisecondUnixTimestamp(gReceipt.PurchaseTime), + Environment: purchaseEnv, } if !persist { validatedPurchases := []*api.ValidatedPurchase{ { UserId: userID.String(), - ProductId: sPurchase.productId, - TransactionId: sPurchase.transactionId, - Store: sPurchase.store, - PurchaseTime: timestamppb.New(sPurchase.purchaseTime), + ProductId: sPurchase.ProductId, + TransactionId: sPurchase.TransactionId, + Store: sPurchase.Store, + PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), ProviderResponse: string(raw), - Environment: sPurchase.environment, + Environment: sPurchase.Environment, }, } return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := upsertPurchases(ctx, db, []*storagePurchase{sPurchase}) + purchases, err := iap.UpsertPurchases(ctx, db, []*iap.StoragePurchase{sPurchase}) if err != nil { if err != context.Canceled { logger.Error("Error storing Google receipt", zap.Error(err)) @@ -235,21 +232,21 @@ func ValidatePurchaseGoogle(ctx context.Context, logger *zap.Logger, db *sql.DB, validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) for _, p := range purchases { - suid := p.userID.String() - if p.userID.IsNil() { + suid := p.UserID.String() + if p.UserID.IsNil() { suid = "" } validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ UserId: suid, - ProductId: p.productId, - TransactionId: p.transactionId, - Store: p.store, - PurchaseTime: timestamppb.New(p.purchaseTime), - CreateTime: timestamppb.New(p.createTime), - UpdateTime: timestamppb.New(p.updateTime), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), ProviderResponse: string(raw), - SeenBefore: p.seenBefore, - Environment: p.environment, + SeenBefore: p.SeenBefore, + Environment: p.Environment, }) } @@ -259,7 +256,7 @@ func ValidatePurchaseGoogle(ctx context.Context, logger *zap.Logger, db *sql.DB, } func ValidatePurchaseHuawei(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, config *IAPHuaweiConfig, inAppPurchaseData, signature string, persist bool) (*api.ValidatePurchaseResponse, error) { - validation, data, raw, err := iap.ValidateReceiptHuawei(ctx, httpc, config.PublicKey, config.ClientID, config.ClientSecret, inAppPurchaseData, signature) + validation, data, raw, err := iap.ValidateReceiptHuawei(ctx, iap.Httpc, config.PublicKey, config.ClientID, config.ClientSecret, inAppPurchaseData, signature) if err != nil { if err != context.Canceled { var vErr *iap.ValidationError @@ -282,32 +279,32 @@ func ValidatePurchaseHuawei(ctx context.Context, logger *zap.Logger, db *sql.DB, env = api.StoreEnvironment_SANDBOX } - sPurchase := &storagePurchase{ - userID: userID, - store: api.StoreProvider_HUAWEI_APP_GALLERY, - productId: validation.PurchaseTokenData.ProductId, - transactionId: validation.PurchaseTokenData.PurchaseToken, - rawResponse: string(raw), - purchaseTime: parseMillisecondUnixTimestamp(data.PurchaseTime), - environment: env, + sPurchase := &iap.StoragePurchase{ + UserID: userID, + Store: api.StoreProvider_HUAWEI_APP_GALLERY, + ProductId: validation.PurchaseTokenData.ProductId, + TransactionId: validation.PurchaseTokenData.PurchaseToken, + RawResponse: string(raw), + PurchaseTime: iap.ParseMillisecondUnixTimestamp(data.PurchaseTime), + Environment: env, } if !persist { validatedPurchases := []*api.ValidatedPurchase{ { - ProductId: sPurchase.productId, - TransactionId: sPurchase.transactionId, - Store: sPurchase.store, - PurchaseTime: timestamppb.New(sPurchase.purchaseTime), + ProductId: sPurchase.ProductId, + TransactionId: sPurchase.TransactionId, + Store: sPurchase.Store, + PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), ProviderResponse: string(raw), - Environment: sPurchase.environment, + Environment: sPurchase.Environment, }, } return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := upsertPurchases(ctx, db, []*storagePurchase{sPurchase}) + purchases, err := iap.UpsertPurchases(ctx, db, []*iap.StoragePurchase{sPurchase}) if err != nil { if err != context.Canceled { logger.Error("Error storing Huawei receipt", zap.Error(err)) @@ -317,21 +314,21 @@ func ValidatePurchaseHuawei(ctx context.Context, logger *zap.Logger, db *sql.DB, validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) for _, p := range purchases { - suid := p.userID.String() - if p.userID.IsNil() { + suid := p.UserID.String() + if p.UserID.IsNil() { suid = "" } validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ UserId: suid, - ProductId: p.productId, - TransactionId: p.transactionId, - Store: p.store, - PurchaseTime: timestamppb.New(p.purchaseTime), - CreateTime: timestamppb.New(p.createTime), - UpdateTime: timestamppb.New(p.updateTime), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), ProviderResponse: string(raw), - SeenBefore: p.seenBefore, - Environment: p.environment, + SeenBefore: p.SeenBefore, + Environment: p.Environment, }) } @@ -349,33 +346,33 @@ func ValidatePurchaseFacebookInstant(ctx context.Context, logger *zap.Logger, db return nil, err } - sPurchase := &storagePurchase{ - userID: userID, - store: api.StoreProvider_FACEBOOK_INSTANT_STORE, - productId: payment.ProductId, - transactionId: payment.PurchaseToken, - rawResponse: rawResponse, - purchaseTime: time.Unix(int64(payment.PurchaseTime), 0), - environment: api.StoreEnvironment_PRODUCTION, + sPurchase := &iap.StoragePurchase{ + UserID: userID, + Store: api.StoreProvider_FACEBOOK_INSTANT_STORE, + ProductId: payment.ProductId, + TransactionId: payment.PurchaseToken, + RawResponse: rawResponse, + PurchaseTime: time.Unix(int64(payment.PurchaseTime), 0), + Environment: api.StoreEnvironment_PRODUCTION, } if !persist { validatedPurchases := []*api.ValidatedPurchase{ { UserId: userID.String(), - ProductId: sPurchase.productId, - TransactionId: sPurchase.transactionId, - Store: sPurchase.store, - PurchaseTime: timestamppb.New(sPurchase.purchaseTime), + ProductId: sPurchase.ProductId, + TransactionId: sPurchase.TransactionId, + Store: sPurchase.Store, + PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), ProviderResponse: rawResponse, - Environment: sPurchase.environment, + Environment: sPurchase.Environment, }, } return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := upsertPurchases(ctx, db, []*storagePurchase{sPurchase}) + purchases, err := iap.UpsertPurchases(ctx, db, []*iap.StoragePurchase{sPurchase}) if err != nil { if err != context.Canceled { logger.Error("Error storing Facebook Instant receipt", zap.Error(err)) @@ -385,21 +382,21 @@ func ValidatePurchaseFacebookInstant(ctx context.Context, logger *zap.Logger, db validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) for _, p := range purchases { - suid := p.userID.String() - if p.userID.IsNil() { + suid := p.UserID.String() + if p.UserID.IsNil() { suid = "" } validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ UserId: suid, - ProductId: p.productId, - TransactionId: p.transactionId, - Store: p.store, - PurchaseTime: timestamppb.New(p.purchaseTime), - CreateTime: timestamppb.New(p.createTime), - UpdateTime: timestamppb.New(p.updateTime), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), ProviderResponse: rawResponse, - SeenBefore: p.seenBefore, - Environment: p.environment, + SeenBefore: p.SeenBefore, + Environment: p.Environment, }) } @@ -408,63 +405,6 @@ func ValidatePurchaseFacebookInstant(ctx context.Context, logger *zap.Logger, db }, nil } -func GetPurchaseByTransactionId(ctx context.Context, logger *zap.Logger, db *sql.DB, transactionID string) (*api.ValidatedPurchase, error) { - var ( - dbTransactionId string - dbUserId uuid.UUID - dbStore api.StoreProvider - dbCreateTime pgtype.Timestamptz - dbUpdateTime pgtype.Timestamptz - dbPurchaseTime pgtype.Timestamptz - dbRefundTime pgtype.Timestamptz - dbProductId string - dbEnvironment api.StoreEnvironment - dbRawResponse string - ) - - err := db.QueryRowContext(ctx, ` - SELECT - user_id, - store, - transaction_id, - create_time, - update_time, - purchase_time, - refund_time, - product_id, - environment, - raw_response - FROM purchase - WHERE transaction_id = $1 -`, transactionID).Scan(&dbUserId, &dbStore, &dbTransactionId, &dbCreateTime, &dbUpdateTime, &dbPurchaseTime, &dbRefundTime, &dbProductId, &dbEnvironment, &dbRawResponse) - if err != nil { - if err == sql.ErrNoRows { - // Not found - return nil, nil - } - logger.Error("Error getting purchase", zap.Error(err)) - return nil, err - } - - suid := dbUserId.String() - if dbUserId.IsNil() { - suid = "" - } - - return &api.ValidatedPurchase{ - UserId: suid, - ProductId: dbProductId, - TransactionId: dbTransactionId, - Store: dbStore, - PurchaseTime: timestamppb.New(dbPurchaseTime.Time), - CreateTime: timestamppb.New(dbCreateTime.Time), - UpdateTime: timestamppb.New(dbUpdateTime.Time), - Environment: dbEnvironment, - RefundTime: timestamppb.New(dbRefundTime.Time), - ProviderResponse: dbRawResponse, - }, nil -} - type purchasesListCursor struct { TransactionId string PurchaseTime *timestamppb.Timestamp @@ -660,118 +600,3 @@ LIMIT $4` return &api.PurchaseList{ValidatedPurchases: purchases, Cursor: nextCursorStr, PrevCursor: prevCursorStr}, nil } - -type storagePurchase struct { - userID uuid.UUID - store api.StoreProvider - productId string - transactionId string - rawResponse string - purchaseTime time.Time - createTime time.Time // Set by upsertPurchases - updateTime time.Time // Set by upsertPurchases - refundTime time.Time - environment api.StoreEnvironment - seenBefore bool // Set by upsertPurchases -} - -func upsertPurchases(ctx context.Context, db *sql.DB, purchases []*storagePurchase) ([]*storagePurchase, error) { - if len(purchases) < 1 { - return nil, errors.New("expects at least one receipt") - } - - transactionIDsToPurchase := make(map[string]*storagePurchase) - - userIdParams := make([]uuid.UUID, 0, len(purchases)) - storeParams := make([]api.StoreProvider, 0, len(purchases)) - transactionIdParams := make([]string, 0, len(purchases)) - productIdParams := make([]string, 0, len(purchases)) - purchaseTimeParams := make([]time.Time, 0, len(purchases)) - rawResponseParams := make([]string, 0, len(purchases)) - environmentParams := make([]api.StoreEnvironment, 0, len(purchases)) - refundTimeParams := make([]time.Time, 0, len(purchases)) - - for _, purchase := range purchases { - if purchase.refundTime.IsZero() { - purchase.refundTime = time.Unix(0, 0) - } - if purchase.rawResponse == "" { - purchase.rawResponse = "{}" - } - transactionIDsToPurchase[purchase.transactionId] = purchase - - userIdParams = append(userIdParams, purchase.userID) - storeParams = append(storeParams, purchase.store) - transactionIdParams = append(transactionIdParams, purchase.transactionId) - productIdParams = append(productIdParams, purchase.productId) - purchaseTimeParams = append(purchaseTimeParams, purchase.purchaseTime) - rawResponseParams = append(rawResponseParams, purchase.rawResponse) - environmentParams = append(environmentParams, purchase.environment) - refundTimeParams = append(refundTimeParams, purchase.refundTime) - } - - query := ` -INSERT INTO purchase - ( - user_id, - store, - transaction_id, - product_id, - purchase_time, - raw_response, - environment, - refund_time - ) -SELECT unnest($1::uuid[]), unnest($2::smallint[]), unnest($3::text[]), unnest($4::text[]), unnest($5::timestamptz[]), unnest($6::jsonb[]), unnest($7::smallint[]), unnest($8::timestamptz[]) -ON CONFLICT - (transaction_id) -DO UPDATE SET - refund_time = EXCLUDED.refund_time, - update_time = now() -RETURNING - user_id, - transaction_id, - create_time, - update_time, - refund_time -` - - rows, err := db.QueryContext(ctx, query, userIdParams, storeParams, transactionIdParams, productIdParams, purchaseTimeParams, rawResponseParams, environmentParams, refundTimeParams) - if err != nil { - return nil, err - } - for rows.Next() { - // Newly inserted purchases - var dbUserID uuid.UUID - var transactionId string - var createTime pgtype.Timestamptz - var updateTime pgtype.Timestamptz - var refundTime pgtype.Timestamptz - if err = rows.Scan(&dbUserID, &transactionId, &createTime, &updateTime, &refundTime); err != nil { - _ = rows.Close() - return nil, err - } - storedPurchase := transactionIDsToPurchase[transactionId] - storedPurchase.createTime = createTime.Time - storedPurchase.updateTime = updateTime.Time - storedPurchase.seenBefore = updateTime.Time.After(createTime.Time) - if refundTime.Time.Unix() != 0 { - storedPurchase.refundTime = refundTime.Time - } - } - _ = rows.Close() - if err := rows.Err(); err != nil { - return nil, err - } - - storedPurchases := make([]*storagePurchase, 0, len(transactionIDsToPurchase)) - for _, purchase := range transactionIDsToPurchase { - storedPurchases = append(storedPurchases, purchase) - } - - return storedPurchases, nil -} - -func parseMillisecondUnixTimestamp(t int64) time.Time { - return time.Unix(0, 0).Add(time.Duration(t) * time.Millisecond) -} diff --git a/server/core_subscription.go b/server/core_subscription.go index 453e3088ab..cccbe54b7e 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -24,6 +24,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/heroiclabs/nakama-common/runtime" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "io" @@ -243,7 +244,7 @@ func ListSubscriptions(ctx context.Context, logger *zap.Logger, db *sql.DB, user } func ValidateSubscriptionApple(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { - validation, rawResponse, err := iap.ValidateReceiptApple(ctx, httpc, receipt, password) + validation, rawResponse, err := iap.ValidateReceiptApple(ctx, iap.Httpc, receipt, password) if err != nil { if err != context.Canceled { var vErr *iap.ValidationError @@ -294,61 +295,61 @@ func ValidateSubscriptionApple(ctx context.Context, logger *zap.Logger, db *sql. return nil, err } - expireTime := parseMillisecondUnixTimestamp(expireTimeInt) + expireTime := iap.ParseMillisecondUnixTimestamp(expireTimeInt) active := false if expireTime.After(time.Now()) { active = true } - storageSub := &storageSubscription{ - userID: userID, - store: api.StoreProvider_APPLE_APP_STORE, - productId: receiptInfo.ProductId, - originalTransactionId: receiptInfo.OriginalTransactionId, - purchaseTime: parseMillisecondUnixTimestamp(purchaseTime), - environment: env, - expireTime: expireTime, - rawResponse: string(rawResponse), + storageSub := &iap.StorageSubscription{ + UserID: userID, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: receiptInfo.ProductId, + OriginalTransactionId: receiptInfo.OriginalTransactionId, + PurchaseTime: iap.ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + ExpireTime: expireTime, + RawResponse: string(rawResponse), } validatedSub := &api.ValidatedSubscription{ - UserId: storageSub.userID.String(), - ProductId: storageSub.productId, - OriginalTransactionId: storageSub.originalTransactionId, + UserId: storageSub.UserID.String(), + ProductId: storageSub.ProductId, + OriginalTransactionId: storageSub.OriginalTransactionId, Store: api.StoreProvider_APPLE_APP_STORE, - PurchaseTime: timestamppb.New(storageSub.purchaseTime), + PurchaseTime: timestamppb.New(storageSub.PurchaseTime), Environment: env, Active: active, - ExpiryTime: timestamppb.New(storageSub.expireTime), - ProviderResponse: storageSub.rawResponse, - ProviderNotification: storageSub.rawNotification, + ExpiryTime: timestamppb.New(storageSub.ExpireTime), + ProviderResponse: storageSub.RawResponse, + ProviderNotification: storageSub.RawNotification, } if !persist { return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil } - if err = upsertSubscription(ctx, db, storageSub); err != nil { + if err = iap.UpsertSubscription(ctx, db, storageSub); err != nil { return nil, err } - suid := storageSub.userID.String() - if storageSub.userID.IsNil() { + suid := storageSub.UserID.String() + if storageSub.UserID.IsNil() { suid = "" } validatedSub.UserId = suid - validatedSub.CreateTime = timestamppb.New(storageSub.createTime) - validatedSub.UpdateTime = timestamppb.New(storageSub.updateTime) - validatedSub.ProviderResponse = storageSub.rawResponse - validatedSub.ProviderNotification = storageSub.rawNotification + validatedSub.CreateTime = timestamppb.New(storageSub.CreateTime) + validatedSub.UpdateTime = timestamppb.New(storageSub.UpdateTime) + validatedSub.ProviderResponse = storageSub.RawResponse + validatedSub.ProviderNotification = storageSub.RawNotification return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil } func ValidateSubscriptionGoogle(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, config *IAPGoogleConfig, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { - gResponse, gReceipt, rawResponse, err := iap.ValidateSubscriptionReceiptGoogle(ctx, httpc, config.ClientEmail, config.PrivateKey, receipt) + gResponse, gReceipt, rawResponse, err := iap.ValidateSubscriptionReceiptGoogle(ctx, iap.Httpc, config.ClientEmail, config.PrivateKey, receipt) if err != nil { if err != context.Canceled { var vErr *iap.ValidationError @@ -372,60 +373,60 @@ func ValidateSubscriptionGoogle(ctx context.Context, logger *zap.Logger, db *sql return nil, err } - expireTime := parseMillisecondUnixTimestamp(expireTimeInt) + expireTime := iap.ParseMillisecondUnixTimestamp(expireTimeInt) active := false if expireTime.After(time.Now()) { active = true } - storageSub := &storageSubscription{ - originalTransactionId: gReceipt.PurchaseToken, - userID: userID, - store: api.StoreProvider_GOOGLE_PLAY_STORE, - productId: gReceipt.ProductID, - purchaseTime: parseMillisecondUnixTimestamp(gReceipt.PurchaseTime), - environment: purchaseEnv, - expireTime: expireTime, - rawResponse: string(rawResponse), + storageSub := &iap.StorageSubscription{ + OriginalTransactionId: gReceipt.PurchaseToken, + UserID: userID, + Store: api.StoreProvider_GOOGLE_PLAY_STORE, + ProductId: gReceipt.ProductID, + PurchaseTime: iap.ParseMillisecondUnixTimestamp(gReceipt.PurchaseTime), + Environment: purchaseEnv, + ExpireTime: expireTime, + RawResponse: string(rawResponse), } if gResponse.LinkedPurchaseToken != "" { // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da - storageSub.originalTransactionId = gResponse.LinkedPurchaseToken + storageSub.OriginalTransactionId = gResponse.LinkedPurchaseToken } validatedSub := &api.ValidatedSubscription{ UserId: userID.String(), - ProductId: storageSub.productId, - OriginalTransactionId: storageSub.originalTransactionId, - Store: storageSub.store, - PurchaseTime: timestamppb.New(storageSub.purchaseTime), - Environment: storageSub.environment, + ProductId: storageSub.ProductId, + OriginalTransactionId: storageSub.OriginalTransactionId, + Store: storageSub.Store, + PurchaseTime: timestamppb.New(storageSub.PurchaseTime), + Environment: storageSub.Environment, Active: active, - ExpiryTime: timestamppb.New(storageSub.expireTime), - ProviderResponse: storageSub.rawResponse, - ProviderNotification: storageSub.rawNotification, + ExpiryTime: timestamppb.New(storageSub.ExpireTime), + ProviderResponse: storageSub.RawResponse, + ProviderNotification: storageSub.RawNotification, } if !persist { return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil } - if err = upsertSubscription(ctx, db, storageSub); err != nil { + if err = iap.UpsertSubscription(ctx, db, storageSub); err != nil { return nil, err } - suid := storageSub.userID.String() - if storageSub.userID.IsNil() { + suid := storageSub.UserID.String() + if storageSub.UserID.IsNil() { suid = "" } validatedSub.UserId = suid - validatedSub.CreateTime = timestamppb.New(storageSub.createTime) - validatedSub.UpdateTime = timestamppb.New(storageSub.updateTime) - validatedSub.ProviderResponse = storageSub.rawResponse - validatedSub.ProviderNotification = storageSub.rawNotification + validatedSub.CreateTime = timestamppb.New(storageSub.CreateTime) + validatedSub.UpdateTime = timestamppb.New(storageSub.UpdateTime) + validatedSub.ProviderResponse = storageSub.RawResponse + validatedSub.ProviderNotification = storageSub.RawNotification return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil } @@ -495,205 +496,8 @@ WHERE }, nil } -func getSubscriptionByOriginalTransactionId(ctx context.Context, logger *zap.Logger, db *sql.DB, originalTransactionId string) (*api.ValidatedSubscription, error) { - var ( - dbUserId uuid.UUID - dbStore api.StoreProvider - dbOriginalTransactionId string - dbCreateTime pgtype.Timestamptz - dbUpdateTime pgtype.Timestamptz - dbExpireTime pgtype.Timestamptz - dbPurchaseTime pgtype.Timestamptz - dbRefundTime pgtype.Timestamptz - dbProductId string - dbEnvironment api.StoreEnvironment - dbRawResponse string - dbRawNotification string - ) - - err := db.QueryRowContext(ctx, ` - SELECT - user_id, - store, - original_transaction_id, - create_time, - update_time, - expire_time, - purchase_time, - refund_time, - product_id, - environment, - raw_response, - raw_notification - FROM subscription - WHERE original_transaction_id = $1 -`, originalTransactionId).Scan(&dbUserId, &dbStore, &dbOriginalTransactionId, &dbCreateTime, &dbUpdateTime, &dbExpireTime, &dbPurchaseTime, &dbRefundTime, &dbProductId, &dbEnvironment, &dbRawResponse, &dbRawNotification) - if err != nil { - if err == sql.ErrNoRows { - // Not found - return nil, nil - } - logger.Error("Failed to get subscription", zap.Error(err)) - return nil, err - } - - active := false - if dbExpireTime.Time.After(time.Now()) && dbRefundTime.Time.Unix() == 0 { - active = true - } - - suid := dbUserId.String() - if dbUserId.IsNil() { - suid = "" - } - - return &api.ValidatedSubscription{ - UserId: suid, - ProductId: dbProductId, - OriginalTransactionId: dbOriginalTransactionId, - Store: dbStore, - PurchaseTime: timestamppb.New(dbPurchaseTime.Time), - CreateTime: timestamppb.New(dbCreateTime.Time), - UpdateTime: timestamppb.New(dbUpdateTime.Time), - Environment: dbEnvironment, - ExpiryTime: timestamppb.New(dbExpireTime.Time), - RefundTime: timestamppb.New(dbRefundTime.Time), - ProviderResponse: dbRawResponse, - ProviderNotification: dbRawNotification, - Active: active, - }, nil -} - -type storageSubscription struct { - originalTransactionId string - userID uuid.UUID - store api.StoreProvider - productId string - purchaseTime time.Time - createTime time.Time // Set by upsertSubscription - updateTime time.Time // Set by upsertSubscription - refundTime time.Time - environment api.StoreEnvironment - expireTime time.Time - rawResponse string - rawNotification string -} - -func upsertSubscription(ctx context.Context, db *sql.DB, sub *storageSubscription) error { - if sub.refundTime.IsZero() { - // Refund time not set, init as default value. - sub.refundTime = time.Unix(0, 0) - } - - query := ` -INSERT -INTO - subscription - ( - user_id, - store, - original_transaction_id, - product_id, - purchase_time, - environment, - expire_time, - raw_response, - raw_notification, - refund_time - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, to_jsonb(coalesce(nullif($8, ''), '{}')), to_jsonb(coalesce(nullif($9, ''), '{}')), $10) -ON CONFLICT - (original_transaction_id) -DO - UPDATE SET - expire_time = $7, - update_time = now(), - raw_response = coalesce(to_jsonb(nullif($8, '')), subscription.raw_response::jsonb), - raw_notification = coalesce(to_jsonb(nullif($9, '')), subscription.raw_notification::jsonb), - refund_time = coalesce($10, subscription.refund_time) -RETURNING - user_id, create_time, update_time, expire_time, refund_time, raw_response, raw_notification -` - var ( - userID uuid.UUID - createTime pgtype.Timestamptz - updateTime pgtype.Timestamptz - expireTime pgtype.Timestamptz - refundTime pgtype.Timestamptz - rawResponse string - rawNotification string - ) - if err := db.QueryRowContext(ctx, query, sub.userID, sub.store, sub.originalTransactionId, sub.productId, sub.purchaseTime, sub.environment, sub.expireTime, sub.rawResponse, sub.rawNotification, sub.refundTime).Scan(&userID, &createTime, &updateTime, &expireTime, &refundTime, &rawResponse, &rawNotification); err != nil { - return err - } - - sub.userID = userID - sub.createTime = createTime.Time - sub.updateTime = updateTime.Time - sub.expireTime = expireTime.Time - sub.refundTime = refundTime.Time - sub.rawResponse = rawResponse - sub.rawNotification = rawNotification - - return nil -} - -const AppleRootPEM = ` ------BEGIN CERTIFICATE----- -MIICQzCCAcmgAwIBAgIILcX8iNLFS5UwCgYIKoZIzj0EAwMwZzEbMBkGA1UEAwwS -QXBwbGUgUm9vdCBDQSAtIEczMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcN -MTQwNDMwMTgxOTA2WhcNMzkwNDMwMTgxOTA2WjBnMRswGQYDVQQDDBJBcHBsZSBS -b290IENBIC0gRzMxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABJjpLz1AcqTtkyJygRMc3RCV8cWjTnHcFBbZDuWmBSp3ZHtf -TjjTuxxEtX/1H7YyYl3J6YRbTzBPEVoA/VhYDKX1DyxNB0cTddqXl5dvMVztK517 -IDvYuVTZXpmkOlEKMaNCMEAwHQYDVR0OBBYEFLuw3qFYM4iapIqZ3r6966/ayySr -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gA -MGUCMQCD6cHEFl4aXTQY2e3v9GwOAEZLuN+yRhHFD/3meoyhpmvOwgPUnPWTxnS4 -at+qIxUCMG1mihDK1A3UT82NQz60imOlM27jbdoXt2QfyFMm+YhidDkLF1vLUagM -6BgD56KyKA== ------END CERTIFICATE----- -` - -type appleNotificationSignedPayload struct { - SignedPayload string `json:"signedPayload"` -} - -type appleNotificationPayload struct { - NotificationType string `json:"notificationType"` - Subtype string `json:"subtype"` - Version string `json:"version"` - Data appleNotificationData `json:"data"` - SignedDate int64 `json:"signedDate"` -} - -type appleNotificationData struct { - Environment string `json:"string"` - BundleId string `json:"bundleId"` - BundleVersion string `json:"bundleVersion"` - SignedTransactionInfo string `json:"signedTransactionInfo"` - SignedRenewalInfo string `json:"signedRenewalInfo"` -} - -type appleNotificationTransactionInfo struct { - AppAccountToken string `json:"appAccountToken"` - BundleId string `json:"bundleId"` - Environment string `json:"environment"` - TransactionId string `json:"transactionId"` - OriginalTransactionId string `json:"originalTransactionId"` - ProductId string `json:"productId"` - ExpiresDateMs int64 `json:"expiresDate"` - RevocationDateMs int64 `json:"revocationDate"` - OriginalPurchaseDateMs int64 `json:"originalPurchaseDate"` - PurchaseDateMs int64 `json:"purchaseDate"` -} - -const AppleNotificationTypeRefund = "REFUND" - // Store providers notification callback handler functions -func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificationCallback RuntimePurchaseNotificationAppleFunction, subscriptionNotificationCallback RuntimeSubscriptionNotificationAppleFunction) http.HandlerFunc { +func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificationCallback runtime.ApplePurchaseHookFn, subscriptionNotificationCallback runtime.AppleSubscriptionFn) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) if err != nil { @@ -703,7 +507,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati } defer r.Body.Close() - var applePayload *appleNotificationSignedPayload + var applePayload *iap.AppleNotificationSignedPayload if err := json.Unmarshal(body, &applePayload); err != nil { logger.Error("Failed to unmarshal App Store notification", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) @@ -753,7 +557,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati } rootCert := x509.NewCertPool() - ok := rootCert.AppendCertsFromPEM([]byte(AppleRootPEM)) + ok := rootCert.AppendCertsFromPEM([]byte(iap.AppleRootPEM)) if !ok { logger.Error("Failed to parse Apple root certificate", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) @@ -800,7 +604,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati return } - var notificationPayload *appleNotificationPayload + var notificationPayload *iap.AppleNotificationPayload if err = json.Unmarshal(jsonPayload, ¬ificationPayload); err != nil { logger.Error("Failed to json unmarshal App Store notification payload", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) @@ -826,7 +630,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati return } - var signedTransactionInfo *appleNotificationTransactionInfo + var signedTransactionInfo *iap.AppleNotificationTransactionInfo if err = json.Unmarshal(jsonPayload, &signedTransactionInfo); err != nil { logger.Error("Failed to json unmarshal App Store notification SignedTransactionInfo JWS token", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) @@ -854,7 +658,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati // Notification regarding a subscription. if uid.IsNil() { // No user ID was found in receipt, lookup a validated subscription. - s, err := getSubscriptionByOriginalTransactionId(r.Context(), logger, db, signedTransactionInfo.OriginalTransactionId) + s, err := iap.GetSubscriptionByOriginalTransactionId(r.Context(), logger, db, signedTransactionInfo.OriginalTransactionId) if err != nil || s == nil { w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. return @@ -862,19 +666,19 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati uid = uuid.Must(uuid.FromString(s.UserId)) } - sub := &storageSubscription{ - userID: uid, - originalTransactionId: signedTransactionInfo.OriginalTransactionId, - store: api.StoreProvider_APPLE_APP_STORE, - productId: signedTransactionInfo.ProductId, - purchaseTime: parseMillisecondUnixTimestamp(signedTransactionInfo.OriginalPurchaseDateMs), - environment: env, - expireTime: parseMillisecondUnixTimestamp(signedTransactionInfo.ExpiresDateMs), - rawNotification: string(body), - refundTime: parseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), + sub := &iap.StorageSubscription{ + UserID: uid, + OriginalTransactionId: signedTransactionInfo.OriginalTransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: signedTransactionInfo.ProductId, + PurchaseTime: iap.ParseMillisecondUnixTimestamp(signedTransactionInfo.OriginalPurchaseDateMs), + Environment: env, + ExpireTime: iap.ParseMillisecondUnixTimestamp(signedTransactionInfo.ExpiresDateMs), + RawNotification: string(body), + RefundTime: iap.ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), } - if err = upsertSubscription(r.Context(), db, sub); err != nil { + if err = iap.UpsertSubscription(r.Context(), db, sub); err != nil { var pgErr *pgconn.PgError if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { // User id was not found, ignore this notification @@ -887,29 +691,29 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati } active := false - if sub.expireTime.After(time.Now()) && sub.refundTime.Unix() == 0 { + if sub.ExpireTime.After(time.Now()) && sub.RefundTime.Unix() == 0 { active = true } var suid string - if !sub.userID.IsNil() { - suid = sub.userID.String() + if !sub.UserID.IsNil() { + suid = sub.UserID.String() } - if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { + if strings.ToUpper(notificationPayload.NotificationType) == iap.AppleNotificationTypeRefund { validatedSub := &api.ValidatedSubscription{ UserId: suid, - ProductId: sub.productId, - OriginalTransactionId: sub.originalTransactionId, + ProductId: sub.ProductId, + OriginalTransactionId: sub.OriginalTransactionId, Store: api.StoreProvider_APPLE_APP_STORE, - PurchaseTime: timestamppb.New(sub.purchaseTime), - CreateTime: timestamppb.New(sub.createTime), - UpdateTime: timestamppb.New(sub.updateTime), + PurchaseTime: timestamppb.New(sub.PurchaseTime), + CreateTime: timestamppb.New(sub.CreateTime), + UpdateTime: timestamppb.New(sub.UpdateTime), Environment: env, - ExpiryTime: timestamppb.New(sub.expireTime), - RefundTime: timestamppb.New(sub.refundTime), - ProviderResponse: sub.rawResponse, - ProviderNotification: sub.rawNotification, + ExpiryTime: timestamppb.New(sub.ExpireTime), + RefundTime: timestamppb.New(sub.RefundTime), + ProviderResponse: sub.RawResponse, + ProviderNotification: sub.RawNotification, Active: active, } @@ -926,7 +730,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati // Notification regarding a purchase. if uid.IsNil() { // No user ID was found in receipt, lookup a validated subscription. - p, err := GetPurchaseByTransactionId(r.Context(), logger, db, signedTransactionInfo.TransactionId) + p, err := iap.GetPurchaseByTransactionId(r.Context(), logger, db, signedTransactionInfo.TransactionId) if err != nil || p == nil { // User validated purchase not found. w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. @@ -935,18 +739,18 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati uid = uuid.Must(uuid.FromString(p.UserId)) } - if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { - purchase := &storagePurchase{ - userID: uid, - store: api.StoreProvider_APPLE_APP_STORE, - productId: signedTransactionInfo.ProductId, - transactionId: signedTransactionInfo.TransactionId, - purchaseTime: parseMillisecondUnixTimestamp(signedTransactionInfo.PurchaseDateMs), - refundTime: parseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), - environment: env, + if strings.ToUpper(notificationPayload.NotificationType) == iap.AppleNotificationTypeRefund { + purchase := &iap.StoragePurchase{ + UserID: uid, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: signedTransactionInfo.ProductId, + TransactionId: signedTransactionInfo.TransactionId, + PurchaseTime: iap.ParseMillisecondUnixTimestamp(signedTransactionInfo.PurchaseDateMs), + RefundTime: iap.ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), + Environment: env, } - dbPurchases, err := upsertPurchases(r.Context(), db, []*storagePurchase{purchase}) + dbPurchases, err := iap.UpsertPurchases(r.Context(), db, []*iap.StoragePurchase{purchase}) if err != nil { logger.Error("Failed to store App Store notification purchase data") w.WriteHeader(http.StatusInternalServerError) @@ -955,8 +759,8 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati if purchaseNotificationCallback != nil { dbPurchase := dbPurchases[0] - suid := dbPurchase.userID.String() - if dbPurchase.userID.IsNil() { + suid := dbPurchase.UserID.String() + if dbPurchase.UserID.IsNil() { suid = "" } validatedPurchase := &api.ValidatedPurchase{ @@ -964,13 +768,13 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati ProductId: signedTransactionInfo.ProductId, TransactionId: signedTransactionInfo.TransactionId, Store: api.StoreProvider_APPLE_APP_STORE, - CreateTime: timestamppb.New(dbPurchase.createTime), - UpdateTime: timestamppb.New(dbPurchase.updateTime), - PurchaseTime: timestamppb.New(dbPurchase.purchaseTime), - RefundTime: timestamppb.New(dbPurchase.refundTime), + CreateTime: timestamppb.New(dbPurchase.CreateTime), + UpdateTime: timestamppb.New(dbPurchase.UpdateTime), + PurchaseTime: timestamppb.New(dbPurchase.PurchaseTime), + RefundTime: timestamppb.New(dbPurchase.RefundTime), ProviderResponse: string(body), Environment: env, - SeenBefore: dbPurchase.seenBefore, + SeenBefore: dbPurchase.SeenBefore, } if err = purchaseNotificationCallback(r.Context(), validatedPurchase, string(body)); err != nil { @@ -1064,7 +868,7 @@ func googleNotificationHandler(logger *zap.Logger, db *sql.DB, config *IAPGoogle return } - gResponse, _, _, err := iap.ValidateSubscriptionReceiptGoogle(r.Context(), httpc, config.ClientEmail, config.PrivateKey, string(encodedReceipt)) + gResponse, _, _, err := iap.ValidateSubscriptionReceiptGoogle(r.Context(), iap.Httpc, config.ClientEmail, config.PrivateKey, string(encodedReceipt)) if err != nil { var vErr *iap.ValidationError if errors.As(err, &vErr) { @@ -1112,7 +916,7 @@ func googleNotificationHandler(logger *zap.Logger, db *sql.DB, config *IAPGoogle // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da purchaseToken = gResponse.LinkedPurchaseToken } - sub, err := getSubscriptionByOriginalTransactionId(r.Context(), logger, db, purchaseToken) + sub, err := iap.GetSubscriptionByOriginalTransactionId(r.Context(), logger, db, purchaseToken) if err != nil || sub == nil { w.WriteHeader(http.StatusInternalServerError) return @@ -1139,23 +943,23 @@ func googleNotificationHandler(logger *zap.Logger, db *sql.DB, config *IAPGoogle return } - storageSub := &storageSubscription{ - originalTransactionId: googleNotification.SubscriptionNotification.PurchaseToken, - userID: uid, - store: api.StoreProvider_GOOGLE_PLAY_STORE, - productId: googleNotification.SubscriptionNotification.SubscriptionId, - purchaseTime: parseMillisecondUnixTimestamp(purchaseTime), - environment: env, - expireTime: parseMillisecondUnixTimestamp(expireTimeInt), - rawNotification: string(body), + storageSub := &iap.StorageSubscription{ + OriginalTransactionId: googleNotification.SubscriptionNotification.PurchaseToken, + UserID: uid, + Store: api.StoreProvider_GOOGLE_PLAY_STORE, + ProductId: googleNotification.SubscriptionNotification.SubscriptionId, + PurchaseTime: iap.ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + ExpireTime: iap.ParseMillisecondUnixTimestamp(expireTimeInt), + RawNotification: string(body), } if gResponse.LinkedPurchaseToken != "" { // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da - storageSub.originalTransactionId = gResponse.LinkedPurchaseToken + storageSub.OriginalTransactionId = gResponse.LinkedPurchaseToken } - if err = upsertSubscription(r.Context(), db, storageSub); err != nil { + if err = iap.UpsertSubscription(r.Context(), db, storageSub); err != nil { var pgErr *pgconn.PgError if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { // Record was inserted and the user id was not found, ignore this notification diff --git a/server/google_refund_scheduler.go b/server/google_refund_scheduler.go index d607561a04..55d785367c 100644 --- a/server/google_refund_scheduler.go +++ b/server/google_refund_scheduler.go @@ -90,14 +90,14 @@ func (g *LocalGoogleRefundScheduler) Start(runtime *Runtime) { continue } - voidedReceipts, err := iap.ListVoidedReceiptsGoogle(g.ctx, httpc, g.config.GetIAP().Google.ClientEmail, g.config.GetIAP().Google.PrivateKey, g.config.GetIAP().Google.PackageName) + voidedReceipts, err := iap.ListVoidedReceiptsGoogle(g.ctx, iap.Httpc, g.config.GetIAP().Google.ClientEmail, g.config.GetIAP().Google.PrivateKey, g.config.GetIAP().Google.PackageName) if err != nil { g.logger.Error("Failed to get IAP Google voided receipts", zap.Error(err)) continue } for _, vr := range voidedReceipts { - purchase, err := GetPurchaseByTransactionId(g.ctx, g.logger, g.db, vr.PurchaseToken) + purchase, err := iap.GetPurchaseByTransactionId(g.ctx, g.logger, g.db, vr.PurchaseToken) if err != nil { g.logger.Error("Failed to get purchase by transaction_id", zap.Error(err), zap.String("purchase_token", vr.PurchaseToken)) continue @@ -121,41 +121,41 @@ func (g *LocalGoogleRefundScheduler) Start(runtime *Runtime) { continue } - refundTime := parseMillisecondUnixTimestamp(refundTimeInt) - - sPurchase := &storagePurchase{ - userID: uuid.Must(uuid.FromString(purchase.UserId)), - store: purchase.Store, - productId: purchase.ProductId, - transactionId: purchase.TransactionId, - purchaseTime: purchase.PurchaseTime.AsTime(), - createTime: purchase.CreateTime.AsTime(), - updateTime: purchase.UpdateTime.AsTime(), - refundTime: refundTime, - environment: purchase.Environment, + refundTime := iap.ParseMillisecondUnixTimestamp(refundTimeInt) + + sPurchase := &iap.StoragePurchase{ + UserID: uuid.Must(uuid.FromString(purchase.UserId)), + Store: purchase.Store, + ProductId: purchase.ProductId, + TransactionId: purchase.TransactionId, + PurchaseTime: purchase.PurchaseTime.AsTime(), + CreateTime: purchase.CreateTime.AsTime(), + UpdateTime: purchase.UpdateTime.AsTime(), + RefundTime: refundTime, + Environment: purchase.Environment, } - dbPurchases, err := upsertPurchases(g.ctx, g.db, []*storagePurchase{sPurchase}) + dbPurchases, err := iap.UpsertPurchases(g.ctx, g.db, []*iap.StoragePurchase{sPurchase}) if err != nil { g.logger.Error("Failed to upsert Google voided purchase", zap.Error(err), zap.String("purchase_token", vr.PurchaseToken)) continue } dbPurchase := dbPurchases[0] - suid := dbPurchase.userID.String() - if dbPurchase.userID.IsNil() { + suid := dbPurchase.UserID.String() + if dbPurchase.UserID.IsNil() { suid = "" } validatedPurchase := &api.ValidatedPurchase{ UserId: suid, - ProductId: dbPurchase.productId, - TransactionId: dbPurchase.transactionId, - Store: dbPurchase.store, - PurchaseTime: timestamppb.New(dbPurchase.purchaseTime), - CreateTime: timestamppb.New(dbPurchase.createTime), - UpdateTime: timestamppb.New(dbPurchase.updateTime), - RefundTime: timestamppb.New(dbPurchase.refundTime), + ProductId: dbPurchase.ProductId, + TransactionId: dbPurchase.TransactionId, + Store: dbPurchase.Store, + PurchaseTime: timestamppb.New(dbPurchase.PurchaseTime), + CreateTime: timestamppb.New(dbPurchase.CreateTime), + UpdateTime: timestamppb.New(dbPurchase.UpdateTime), + RefundTime: timestamppb.New(dbPurchase.RefundTime), Environment: purchase.Environment, - SeenBefore: dbPurchase.seenBefore, + SeenBefore: dbPurchase.SeenBefore, } json, err := json.Marshal(vr) @@ -170,7 +170,7 @@ func (g *LocalGoogleRefundScheduler) Start(runtime *Runtime) { } } } else { - subscription, err := getSubscriptionByOriginalTransactionId(g.ctx, g.logger, g.db, vr.PurchaseToken) + subscription, err := iap.GetSubscriptionByOriginalTransactionId(g.ctx, g.logger, g.db, vr.PurchaseToken) if err != nil && err != sql.ErrNoRows { g.logger.Error("Failed to get subscription by original_transaction_id", zap.Error(err), zap.String("original_transaction_id", vr.PurchaseToken)) continue @@ -198,47 +198,47 @@ func (g *LocalGoogleRefundScheduler) Start(runtime *Runtime) { continue } - refundTime := parseMillisecondUnixTimestamp(refundTimeInt) - - sSubscription := &storageSubscription{ - originalTransactionId: subscription.OriginalTransactionId, - userID: uuid.Must(uuid.FromString(subscription.UserId)), - store: subscription.Store, - productId: subscription.ProductId, - purchaseTime: subscription.PurchaseTime.AsTime(), - createTime: subscription.CreateTime.AsTime(), - updateTime: subscription.UpdateTime.AsTime(), - refundTime: refundTime, - environment: subscription.Environment, - expireTime: subscription.ExpiryTime.AsTime(), + refundTime := iap.ParseMillisecondUnixTimestamp(refundTimeInt) + + sSubscription := &iap.StorageSubscription{ + OriginalTransactionId: subscription.OriginalTransactionId, + UserID: uuid.Must(uuid.FromString(subscription.UserId)), + Store: subscription.Store, + ProductId: subscription.ProductId, + PurchaseTime: subscription.PurchaseTime.AsTime(), + CreateTime: subscription.CreateTime.AsTime(), + UpdateTime: subscription.UpdateTime.AsTime(), + RefundTime: refundTime, + Environment: subscription.Environment, + ExpireTime: subscription.ExpiryTime.AsTime(), } - err = upsertSubscription(g.ctx, g.db, sSubscription) + err = iap.UpsertSubscription(g.ctx, g.db, sSubscription) if err != nil { g.logger.Error("Failed to upsert Google voided subscription", zap.Error(err), zap.String("purchase_token", vr.PurchaseToken)) continue } active := false - if sSubscription.expireTime.After(time.Now()) { + if sSubscription.ExpireTime.After(time.Now()) { active = true } - suid := sSubscription.userID.String() - if sSubscription.userID.IsNil() { + suid := sSubscription.UserID.String() + if sSubscription.UserID.IsNil() { suid = "" } validatedSubscription := &api.ValidatedSubscription{ UserId: suid, - ProductId: sSubscription.productId, - OriginalTransactionId: sSubscription.originalTransactionId, - Store: sSubscription.store, - PurchaseTime: timestamppb.New(sSubscription.purchaseTime), - CreateTime: timestamppb.New(sSubscription.createTime), - UpdateTime: timestamppb.New(sSubscription.updateTime), - Environment: sSubscription.environment, - ExpiryTime: timestamppb.New(sSubscription.expireTime), + ProductId: sSubscription.ProductId, + OriginalTransactionId: sSubscription.OriginalTransactionId, + Store: sSubscription.Store, + PurchaseTime: timestamppb.New(sSubscription.PurchaseTime), + CreateTime: timestamppb.New(sSubscription.CreateTime), + UpdateTime: timestamppb.New(sSubscription.UpdateTime), + Environment: sSubscription.Environment, + ExpiryTime: timestamppb.New(sSubscription.ExpireTime), RefundTime: timestamppb.New(refundTime), Active: active, } diff --git a/server/runtime.go b/server/runtime.go index b9821f115b..9a4b18ea01 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -231,11 +231,11 @@ type ( RuntimeLeaderboardResetFunction func(ctx context.Context, leaderboard *api.Leaderboard, reset int64) error - RuntimePurchaseNotificationAppleFunction func(ctx context.Context, purchase *api.ValidatedPurchase, providerPayload string) error - RuntimeSubscriptionNotificationAppleFunction func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error + RuntimePurchaseNotificationAppleFunction runtime.ApplePurchaseHookFn + RuntimeSubscriptionNotificationAppleFunction runtime.AppleSubscriptionFn RuntimePurchaseNotificationGoogleFunction func(ctx context.Context, purchase *api.ValidatedPurchase, providerPayload string) error RuntimeSubscriptionNotificationGoogleFunction func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error - RuntimePurchaseNotificationXboxFunction func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error + RuntimePurchaseNotificationXboxFunction runtime.XboxRefundHookFn RuntimeStorageIndexFilterFunction func(ctx context.Context, write *StorageOpWrite) (bool, error) @@ -272,7 +272,7 @@ const ( RuntimeExecutionModeSubscriptionNotificationApple RuntimeExecutionModePurchaseNotificationGoogle RuntimeExecutionModeSubscriptionNotificationGoogle - RuntimeExecutionModePurchaseNotificationXbox + RuntimeExecutionModePurchaseNotification RuntimeExecutionModeStorageIndexFilter RuntimeExecutionModeShutdown ) @@ -311,8 +311,8 @@ func (e RuntimeExecutionMode) String() string { return "purchase_notification_google" case RuntimeExecutionModeSubscriptionNotificationGoogle: return "subscription_notification_google" - case RuntimeExecutionModePurchaseNotificationXbox: - return "purchase_notification_xbox" + case RuntimeExecutionModePurchaseNotification: + return "purchase_notification_" case RuntimeExecutionModeStorageIndexFilter: return "storage_index_filter" case RuntimeExecutionModeShutdown: @@ -547,11 +547,11 @@ type Runtime struct { tournamentEndFunction RuntimeTournamentEndFunction tournamentResetFunction RuntimeTournamentResetFunction - purchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction - subscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction + purchaseNotificationAppleFunction runtime.ApplePurchaseHookFn + subscriptionNotificationAppleFunction runtime.AppleSubscriptionFn purchaseNotificationGoogleFunction RuntimePurchaseNotificationGoogleFunction subscriptionNotificationGoogleFunction RuntimeSubscriptionNotificationGoogleFunction - purchaseNotificationXboxFunction RuntimePurchaseNotificationXboxFunction + purchaseNotificationXboxFunction runtime.XboxRefundHookFn storageIndexFilterFunctions map[string]RuntimeStorageIndexFilterFunction @@ -565,8 +565,8 @@ type Runtime struct { fleetManager runtime.FleetManager - iapXboxManager runtime.IAPManager - iapPlaystationManager runtime.IAPManager + purchaseProviders map[string]runtime.PurchaseProvider + refundFns map[string]runtime.RefundFns } type MatchNamesListFunction func() []string @@ -693,7 +693,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. config.GetSatori().CacheEnabled, ) - goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goPurchaseNotificationXboxFn, goIndexFilterFns, fleetManager, iapXboxManager, iapPlaystationManager, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) + goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goPurchaseNotificationXboxFn, goIndexFilterFns, fleetManager, purchaseProviders, refundFns, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) if err != nil { startupLogger.Error("Error initialising Go runtime provider", zap.Error(err)) return nil, nil, err @@ -2654,7 +2654,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. startupLogger.Info("Registered JavaScript runtime Leaderboard Reset function invocation") } - var allPurchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction + var allPurchaseNotificationAppleFunction runtime.ApplePurchaseHookFn switch { case goPurchaseNotificationAppleFn != nil: allPurchaseNotificationAppleFunction = goPurchaseNotificationAppleFn @@ -2667,14 +2667,14 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. startupLogger.Info("Registered JavaScript runtime Purchase Notification Apple function invocation") } - var allPurchaseNotificationXboxFunction RuntimePurchaseNotificationXboxFunction + var allPurchaseNotificationXboxFunction runtime.XboxRefundHookFn switch { case goPurchaseNotificationXboxFn != nil: allPurchaseNotificationXboxFunction = goPurchaseNotificationXboxFn startupLogger.Info("Registered Go runtime Purchase Notification Xbox function invocation") } - var allSubscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction + var allSubscriptionNotificationAppleFunction runtime.AppleSubscriptionFn switch { case goSubscriptionNotificationAppleFn != nil: allSubscriptionNotificationAppleFunction = goSubscriptionNotificationAppleFn @@ -2785,8 +2785,8 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. fleetManager: fleetManager, - iapXboxManager: iapXboxManager, - iapPlaystationManager: iapPlaystationManager, + purchaseProviders: purchaseProviders, + refundFns: refundFns, eventFunctions: allEventFns, }, rInfo, nil @@ -3553,11 +3553,11 @@ func (r *Runtime) Shutdown() RuntimeShutdownFunction { return r.shutdownFunction } -func (r *Runtime) PurchaseNotificationApple() RuntimePurchaseNotificationAppleFunction { +func (r *Runtime) PurchaseNotificationApple() runtime.ApplePurchaseHookFn { return r.purchaseNotificationAppleFunction } -func (r *Runtime) SubscriptionNotificationApple() RuntimeSubscriptionNotificationAppleFunction { +func (r *Runtime) SubscriptionNotificationApple() runtime.AppleSubscriptionFn { return r.subscriptionNotificationAppleFunction } @@ -3573,7 +3573,7 @@ func (r *Runtime) SubscriptionNotificationGoogle() RuntimeSubscriptionNotificati return r.subscriptionNotificationGoogleFunction } -func (r *Runtime) PurchaseNotificationXbox() RuntimePurchaseNotificationXboxFunction { +func (r *Runtime) PurchaseNotificationXbox() runtime.XboxRefundHookFn { return r.purchaseNotificationXboxFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index 2f473b3fb9..ce960ea8bf 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -19,11 +19,9 @@ import ( "database/sql" "errors" "fmt" - "github.com/heroiclabs/nakama/v3/iap" "net/http" "path/filepath" "plugin" - "slices" "strings" "sync" @@ -60,11 +58,11 @@ type RuntimeGoInitializer struct { tournamentReset RuntimeTournamentResetFunction leaderboardReset RuntimeLeaderboardResetFunction shutdownFunction RuntimeShutdownFunction - purchaseNotificationApple RuntimePurchaseNotificationAppleFunction - subscriptionNotificationApple RuntimeSubscriptionNotificationAppleFunction + purchaseNotificationApple runtime.ApplePurchaseHookFn + subscriptionNotificationApple runtime.AppleSubscriptionFn purchaseNotificationGoogle RuntimePurchaseNotificationGoogleFunction subscriptionNotificationGoogle RuntimeSubscriptionNotificationGoogleFunction - purchaseNotificationXbox RuntimePurchaseNotificationXboxFunction + purchaseNotificationXbox runtime.XboxRefundHookFn matchmakerOverride RuntimeMatchmakerOverrideFunction storageIndexFunctions map[string]RuntimeStorageIndexFilterFunction httpHandlers []*RuntimeHttpHandler @@ -82,9 +80,8 @@ type RuntimeGoInitializer struct { fmCallbackHandler runtime.FmCallbackHandler - iapXboxManager runtime.IAPManager - iapPlaystationManager runtime.IAPManager - registeredIAPs []string + purchaseProviders map[string]runtime.PurchaseProvider + refundFns map[string]runtime.RefundFns } func (ri *RuntimeGoInitializer) GetConfig() (runtime.Config, error) { @@ -2828,13 +2825,13 @@ func (ri *RuntimeGoInitializer) RegisterSubscriptionNotificationGoogle(fn func(c return nil } -func (ri *RuntimeGoInitializer) RegisterPurchaseNotificationXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error) error { - ri.purchaseNotificationXbox = func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error { - ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModePurchaseNotificationXbox, nil, nil, 0, "", "", nil, "", "", "", "") - return fn(ctx, ri.logger.WithField("mode", RuntimeExecutionModePurchaseNotificationXbox.String()), ri.db, ri.nk, purchase, providerPayload) - } - return nil -} +//func (ri *RuntimeGoInitializer) RegisterPurchaseNotificationXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error) error { +// ri.purchaseNotificationXbox = func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error { +// ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModePurchaseNotificationXbox, nil, nil, 0, "", "", nil, "", "", "", "") +// return fn(ctx, ri.logger.WithField("mode", RuntimeExecutionModePurchaseNotificationXbox.String()), ri.db, ri.nk, purchase, providerPayload) +// } +// return nil +//} func (ri *RuntimeGoInitializer) RegisterStorageIndex(name, collection, key string, fields []string, sortableFields []string, maxEntries int, indexOnly bool) error { return ri.storageIndex.CreateIndex(context.Background(), name, collection, key, fields, sortableFields, maxEntries, indexOnly) @@ -2874,28 +2871,77 @@ func (ri *RuntimeGoInitializer) RegisterFleetManager(fleetManager runtime.FleetM return nil } -func (ri *RuntimeGoInitializer) RegisterIAPManager(platform string, iapManager runtime.IAPManager) error { - if slices.Contains(ri.registeredIAPs, platform) { +func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purchaseProvider runtime.PurchaseProvider) error { + _, exists := ri.purchaseProviders[platform] + + if exists { return errors.New("platform already registered") } - p := iap.FromString(platform) + ri.logger.Info("platform not registered") + + if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { + ri.logger.Info("platform registered") + if ri.purchaseProviders == nil { + ri.logger.Info("ri purchase providers created") + ri.purchaseProviders = make(map[string]runtime.PurchaseProvider) + } + + if nk.purchaseProviders == nil { + ri.logger.Info("nk purchase providers created") + nk.purchaseProviders = make(map[string]runtime.PurchaseProvider) + } + + ri.purchaseProviders[platform] = purchaseProvider + nk.purchaseProviders[platform] = purchaseProvider + } + + //switch p { + //case iap.Xbox: + // if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { + // ri.iapXboxManager = iapManager + // nk.IAPXboxManager = iapManager + // ri.registeredIAPs = append(ri.registeredIAPs, platform) + // } + //case iap.Playstation: + // if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { + // ri.iapPlaystationManager = iapManager + // nk.IAPPlaystationManager = iapManager + // ri.registeredIAPs = append(ri.registeredIAPs, platform) + // } + //default: + // return errors.New("platform not valid") + //} - switch p { - case iap.Xbox: - if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - ri.iapXboxManager = iapManager - nk.IAPXboxManager = iapManager - ri.registeredIAPs = append(ri.registeredIAPs, platform) + return nil +} + +func (ri *RuntimeGoInitializer) RegisterRefundHandler(platform string, purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) error { + if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { + if ri.refundFns == nil { + ri.refundFns = make(map[string]runtime.RefundFns) + } + + if nk.refundFns == nil { + nk.refundFns = make(map[string]runtime.RefundFns) } - case iap.Playstation: - if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - ri.iapPlaystationManager = iapManager - nk.IAPPlaystationManager = iapManager - ri.registeredIAPs = append(ri.registeredIAPs, platform) + + purchasefuncWrapper := func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModePurchaseNotification, nil, nil, 0, "", "", nil, "", "", "", "") + return purchaseRefundFn(ctx, ri.logger.WithField("mode", RuntimeExecutionModePurchaseNotification.String()+platform), ri.db, ri.nk, purchase, providerPayload) + } + SubscriptionfuncWrapper := func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, subscription *api.ValidatedSubscription, providerPayload string) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModePurchaseNotification, nil, nil, 0, "", "", nil, "", "", "", "") + return subscriptionRefundFn(ctx, ri.logger.WithField("mode", RuntimeExecutionModePurchaseNotification.String()+platform), ri.db, ri.nk, subscription, providerPayload) + } + + refundFns := runtime.RefundFns{ + Purchase: purchasefuncWrapper, + Subscription: SubscriptionfuncWrapper, } - default: - return errors.New("platform not valid") + + ri.refundFns[platform] = refundFns + nk.refundFns[platform] = refundFns } return nil @@ -2927,7 +2973,7 @@ func (ri *RuntimeGoInitializer) RegisterMatch(name string, fn func(ctx context.C return nil } -func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, RuntimePurchaseNotificationXboxFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, runtime.IAPManager, runtime.IAPManager, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { +func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, runtime.ApplePurchaseHookFn, runtime.AppleSubscriptionFn, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, runtime.XboxRefundHookFn, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, map[string]runtime.PurchaseProvider, map[string]runtime.RefundFns, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { runtimeLogger := NewRuntimeGoLogger(logger) node := config.GetName() env := config.GetRuntime().Environment @@ -3070,7 +3116,12 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger } } - return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.purchaseNotificationXbox, initializer.storageIndexFunctions, initializer.fleetManager, initializer.iapXboxManager, initializer.iapPlaystationManager, initializer.httpHandlers, events, matchNamesListFn, nil + //provider := iap.NewApplePurchaseProvider(nk, logger) + //if provider != nil { + // initializer.RegisterPurchaseProvider("apple", provider) + //} + + return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.purchaseNotificationXbox, initializer.storageIndexFunctions, initializer.fleetManager, initializer.purchaseProviders, initializer.refundFns, initializer.httpHandlers, events, matchNamesListFn, nil } func CheckRuntimeProviderGo(logger *zap.Logger, rootPath string, paths []string) error { diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index 1954925537..1de1d5c68a 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -23,6 +23,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/heroiclabs/nakama/v3/iap" "os" "strings" "sync" @@ -42,30 +43,30 @@ import ( type RuntimeGoNakamaModule struct { sync.RWMutex - logger *zap.Logger - db *sql.DB - protojsonMarshaler *protojson.MarshalOptions - config Config - socialClient *social.Client - leaderboardCache LeaderboardCache - leaderboardRankCache LeaderboardRankCache - leaderboardScheduler LeaderboardScheduler - sessionRegistry SessionRegistry - sessionCache SessionCache - statusRegistry StatusRegistry - matchRegistry MatchRegistry - tracker Tracker - metrics Metrics - streamManager StreamManager - router MessageRouter - eventFn RuntimeEventCustomFunction - node string - matchCreateFn RuntimeMatchCreateFunction - satori runtime.Satori - fleetManager runtime.FleetManager - storageIndex StorageIndex - IAPXboxManager runtime.IAPManager - IAPPlaystationManager runtime.IAPManager + logger *zap.Logger + db *sql.DB + protojsonMarshaler *protojson.MarshalOptions + config Config + socialClient *social.Client + leaderboardCache LeaderboardCache + leaderboardRankCache LeaderboardRankCache + leaderboardScheduler LeaderboardScheduler + sessionRegistry SessionRegistry + sessionCache SessionCache + statusRegistry StatusRegistry + matchRegistry MatchRegistry + tracker Tracker + metrics Metrics + streamManager StreamManager + router MessageRouter + eventFn RuntimeEventCustomFunction + node string + matchCreateFn RuntimeMatchCreateFunction + satori runtime.Satori + fleetManager runtime.FleetManager + storageIndex StorageIndex + purchaseProviders map[string]runtime.PurchaseProvider + refundFns map[string]runtime.RefundFns } func NewRuntimeGoNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori) *RuntimeGoNakamaModule { @@ -3323,7 +3324,7 @@ func (n *RuntimeGoNakamaModule) PurchaseGetByTransactionId(ctx context.Context, return nil, errors.New("expects a transaction id string.") } - return GetPurchaseByTransactionId(ctx, n.logger, n.db, transactionID) + return iap.GetPurchaseByTransactionId(ctx, n.logger, n.db, transactionID) } // @group subscriptions diff --git a/server/runtime_javascript.go b/server/runtime_javascript.go index 94cfaf0dd8..4d04ec98fa 100644 --- a/server/runtime_javascript.go +++ b/server/runtime_javascript.go @@ -645,7 +645,7 @@ func (rp *RuntimeProviderJS) Put(r *RuntimeJS) { } } -func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, path, entrypoint string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { +func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, path, entrypoint string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, runtime.ApplePurchaseHookFn, runtime.AppleSubscriptionFn, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { startupLogger.Info("Initialising JavaScript runtime provider", zap.String("path", path), zap.String("entrypoint", entrypoint)) modCache, err := cacheJavascriptModules(startupLogger, path, entrypoint) @@ -699,8 +699,8 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger var tournamentResetFunction RuntimeTournamentResetFunction var leaderboardResetFunction RuntimeLeaderboardResetFunction var shutdownFunction RuntimeShutdownFunction - var purchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction - var subscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction + var purchaseNotificationAppleFunction runtime.ApplePurchaseHookFn + var subscriptionNotificationAppleFunction runtime.AppleSubscriptionFn var purchaseNotificationGoogleFunction RuntimePurchaseNotificationGoogleFunction var subscriptionNotificationGoogleFunction RuntimeSubscriptionNotificationGoogleFunction storageIndexFilterFunctions := make(map[string]RuntimeStorageIndexFilterFunction, 0) diff --git a/server/runtime_javascript_nakama.go b/server/runtime_javascript_nakama.go index ba8f5ad898..158d36f388 100644 --- a/server/runtime_javascript_nakama.go +++ b/server/runtime_javascript_nakama.go @@ -35,6 +35,7 @@ import ( "encoding/pem" "errors" "fmt" + "github.com/heroiclabs/nakama/v3/iap" "io" "net/http" "strings" @@ -6125,7 +6126,7 @@ func (n *RuntimeJavascriptNakamaModule) purchaseGetByTransactionId(r *goja.Runti panic(r.NewTypeError("expects a transaction id string")) } - purchase, err := GetPurchaseByTransactionId(n.ctx, n.logger, n.db, transactionID) + purchase, err := iap.GetPurchaseByTransactionId(n.ctx, n.logger, n.db, transactionID) if err != nil { panic(r.NewGoError(fmt.Errorf("error retrieving purchase: %s", err.Error()))) } diff --git a/server/runtime_lua.go b/server/runtime_lua.go index a733fbff1f..5c2eddc732 100644 --- a/server/runtime_lua.go +++ b/server/runtime_lua.go @@ -113,7 +113,7 @@ type RuntimeProviderLua struct { statsCtx context.Context } -func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, rootPath string, paths []string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { +func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, rootPath string, paths []string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, runtime.ApplePurchaseHookFn, runtime.AppleSubscriptionFn, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { startupLogger.Info("Initialising Lua runtime provider", zap.String("path", rootPath)) // Load Lua modules into memory by reading the file contents. No evaluation/execution at this stage. @@ -135,8 +135,8 @@ func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logge var tournamentResetFunction RuntimeTournamentResetFunction var leaderboardResetFunction RuntimeLeaderboardResetFunction var shutdownFunction RuntimeShutdownFunction - var purchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction - var subscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction + var purchaseNotificationAppleFunction runtime.ApplePurchaseHookFn + var subscriptionNotificationAppleFunction runtime.AppleSubscriptionFn var purchaseNotificationGoogleFunction RuntimePurchaseNotificationGoogleFunction var subscriptionNotificationGoogleFunction RuntimeSubscriptionNotificationGoogleFunction storageIndexFilterFunctions := make(map[string]RuntimeStorageIndexFilterFunction, 0) diff --git a/server/runtime_lua_nakama.go b/server/runtime_lua_nakama.go index d08185c5e7..4dd6b75756 100644 --- a/server/runtime_lua_nakama.go +++ b/server/runtime_lua_nakama.go @@ -35,6 +35,7 @@ import ( "encoding/pem" "errors" "fmt" + "github.com/heroiclabs/nakama/v3/iap" "io" "net/http" "strconv" @@ -7868,7 +7869,7 @@ func (n *RuntimeLuaNakamaModule) purchaseGetByTransactionId(l *lua.LState) int { return 0 } - purchase, err := GetPurchaseByTransactionId(l.Context(), n.logger, n.db, transactionID) + purchase, err := iap.GetPurchaseByTransactionId(l.Context(), n.logger, n.db, transactionID) if err != nil { l.RaiseError("error retrieving purchase: %v", err.Error()) return 0 diff --git a/server/xbox_refund_poller.go b/server/xbox_refund_poller.go index ed1ab804f3..1343ccdc17 100644 --- a/server/xbox_refund_poller.go +++ b/server/xbox_refund_poller.go @@ -3,6 +3,7 @@ package server import ( "context" "database/sql" + "github.com/heroiclabs/nakama/v3/iap" "go.uber.org/atomic" "go.uber.org/zap" "time" @@ -50,7 +51,11 @@ func (x *LocalXboxRefundPoller) Start(runtime *Runtime) { case <-x.ctx.Done(): return case <-ticker.C: - err := runtime.iapXboxManager.HandleRefund(x.ctx, x.logger, x.db) + provider, err := iap.GetPurchaseProvider("xbox", runtime.purchaseProviders) + if err != nil { + x.logger.Error("failed to get purchase provider on xbox refund poller", zap.Error(err)) + } + _, err = provider.HandleRefund(x.ctx, x.logger, x.db) if err != nil { x.logger.Error("xbox refund poller failed", zap.Error(err)) continue diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index 2af429c214..f7dfc9a3c0 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.29.3 +// protoc-gen-go v1.36.6 +// protoc v4.24.3 // source: api.proto package api @@ -30,6 +30,7 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -51,6 +52,16 @@ const ( StoreProvider_HUAWEI_APP_GALLERY StoreProvider = 2 // Facebook Instant Store StoreProvider_FACEBOOK_INSTANT_STORE StoreProvider = 3 + // Xbox Store + StoreProvider_XBOX_STORE StoreProvider = 4 + // Playstation Store + StoreProvider_PLAYSTATION_STORE StoreProvider = 5 + // Epic Store + StoreProvider_EPIC_STORE StoreProvider = 6 + // Steam Store + StoreProvider_STEAM_STORE StoreProvider = 7 + // Discord Store + StoreProvider_DISCORD_STORE StoreProvider = 8 ) // Enum value maps for StoreProvider. @@ -60,12 +71,22 @@ var ( 1: "GOOGLE_PLAY_STORE", 2: "HUAWEI_APP_GALLERY", 3: "FACEBOOK_INSTANT_STORE", + 4: "XBOX_STORE", + 5: "PLAYSTATION_STORE", + 6: "EPIC_STORE", + 7: "STEAM_STORE", + 8: "DISCORD_STORE", } StoreProvider_value = map[string]int32{ "APPLE_APP_STORE": 0, "GOOGLE_PLAY_STORE": 1, "HUAWEI_APP_GALLERY": 2, "FACEBOOK_INSTANT_STORE": 3, + "XBOX_STORE": 4, + "PLAYSTATION_STORE": 5, + "EPIC_STORE": 6, + "STEAM_STORE": 7, + "DISCORD_STORE": 8, } ) @@ -383,10 +404,7 @@ func (UserGroupList_UserGroup_State) EnumDescriptor() ([]byte, []int) { // A user with additional account details. Always the current user. type Account struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user object. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // The user's wallet data. @@ -400,16 +418,16 @@ type Account struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's email was verified. VerifyTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=verify_time,json=verifyTime,proto3" json:"verify_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the user's account was disabled/banned. - DisableTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` + DisableTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=disable_time,json=disableTime,proto3" json:"disable_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Account) Reset() { *x = Account{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Account) String() string { @@ -420,7 +438,7 @@ func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -486,23 +504,20 @@ func (x *Account) GetDisableTime() *timestamppb.Timestamp { // Obtain a new authentication token using a refresh token. type AccountRefresh struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Refresh token. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountRefresh) Reset() { *x = AccountRefresh{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountRefresh) String() string { @@ -513,7 +528,7 @@ func (*AccountRefresh) ProtoMessage() {} func (x *AccountRefresh) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -544,23 +559,20 @@ func (x *AccountRefresh) GetVars() map[string]string { // Send a Apple Sign In token to the server. Used with authenticate/link/unlink. type AccountApple struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID token received from Apple to validate. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountApple) Reset() { *x = AccountApple{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountApple) String() string { @@ -571,7 +583,7 @@ func (*AccountApple) ProtoMessage() {} func (x *AccountApple) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -602,23 +614,20 @@ func (x *AccountApple) GetVars() map[string]string { // Send a custom ID to the server. Used with authenticate/link/unlink. type AccountCustom struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A custom identifier. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountCustom) Reset() { *x = AccountCustom{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountCustom) String() string { @@ -629,7 +638,7 @@ func (*AccountCustom) ProtoMessage() {} func (x *AccountCustom) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -660,23 +669,20 @@ func (x *AccountCustom) GetVars() map[string]string { // Send a device to the server. Used with authenticate/link/unlink and user. type AccountDevice struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A device identifier. Should be obtained by a platform-specific device API. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountDevice) Reset() { *x = AccountDevice{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountDevice) String() string { @@ -687,7 +693,7 @@ func (*AccountDevice) ProtoMessage() {} func (x *AccountDevice) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -718,25 +724,22 @@ func (x *AccountDevice) GetVars() map[string]string { // Send an email with password to the server. Used with authenticate/link/unlink. type AccountEmail struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A valid RFC-5322 email address. Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` // A password for the user account. Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` // Ignored with unlink operations. // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,3,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,3,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountEmail) Reset() { *x = AccountEmail{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountEmail) String() string { @@ -747,7 +750,7 @@ func (*AccountEmail) ProtoMessage() {} func (x *AccountEmail) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -785,23 +788,20 @@ func (x *AccountEmail) GetVars() map[string]string { // Send a Facebook token to the server. Used with authenticate/link/unlink. type AccountFacebook struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The OAuth token received from Facebook to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountFacebook) Reset() { *x = AccountFacebook{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountFacebook) String() string { @@ -812,7 +812,7 @@ func (*AccountFacebook) ProtoMessage() {} func (x *AccountFacebook) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -843,23 +843,20 @@ func (x *AccountFacebook) GetVars() map[string]string { // Send a Facebook Instant Game token to the server. Used with authenticate/link/unlink. type AccountFacebookInstantGame struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The OAuth token received from a Facebook Instant Game that may be decoded with the Application Secret (must be available with the nakama configuration) SignedPlayerInfo string `protobuf:"bytes,1,opt,name=signed_player_info,json=signedPlayerInfo,proto3" json:"signed_player_info,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountFacebookInstantGame) Reset() { *x = AccountFacebookInstantGame{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountFacebookInstantGame) String() string { @@ -870,7 +867,7 @@ func (*AccountFacebookInstantGame) ProtoMessage() {} func (x *AccountFacebookInstantGame) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -901,10 +898,7 @@ func (x *AccountFacebookInstantGame) GetVars() map[string]string { // Send Apple's Game Center account credentials to the server. Used with authenticate/link/unlink. type AccountGameCenter struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Player ID (generated by GameCenter). PlayerId string `protobuf:"bytes,1,opt,name=player_id,json=playerId,proto3" json:"player_id,omitempty"` // Bundle ID (generated by GameCenter). @@ -918,16 +912,16 @@ type AccountGameCenter struct { // The URL for the public encryption key. PublicKeyUrl string `protobuf:"bytes,6,opt,name=public_key_url,json=publicKeyUrl,proto3" json:"public_key_url,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountGameCenter) Reset() { *x = AccountGameCenter{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountGameCenter) String() string { @@ -938,7 +932,7 @@ func (*AccountGameCenter) ProtoMessage() {} func (x *AccountGameCenter) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1004,23 +998,20 @@ func (x *AccountGameCenter) GetVars() map[string]string { // Send a Google token to the server. Used with authenticate/link/unlink. type AccountGoogle struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The OAuth token received from Google to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountGoogle) Reset() { *x = AccountGoogle{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountGoogle) String() string { @@ -1031,7 +1022,7 @@ func (*AccountGoogle) ProtoMessage() {} func (x *AccountGoogle) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1062,23 +1053,20 @@ func (x *AccountGoogle) GetVars() map[string]string { // Send a Steam token to the server. Used with authenticate/link/unlink. type AccountSteam struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account token received from Steam to access their profile API. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountSteam) Reset() { *x = AccountSteam{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AccountSteam) String() string { @@ -1089,7 +1077,7 @@ func (*AccountSteam) ProtoMessage() {} func (x *AccountSteam) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1120,25 +1108,22 @@ func (x *AccountSteam) GetVars() map[string]string { // Add one or more friends to the current user. type AddFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` // Optional metadata to add to friends. - Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddFriendsRequest) Reset() { *x = AddFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddFriendsRequest) String() string { @@ -1149,7 +1134,7 @@ func (*AddFriendsRequest) ProtoMessage() {} func (x *AddFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1187,23 +1172,20 @@ func (x *AddFriendsRequest) GetMetadata() string { // Add users to a group. type AddGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group to add users to. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to add. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddGroupUsersRequest) Reset() { *x = AddGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddGroupUsersRequest) String() string { @@ -1214,7 +1196,7 @@ func (*AddGroupUsersRequest) ProtoMessage() {} func (x *AddGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1245,23 +1227,20 @@ func (x *AddGroupUsersRequest) GetUserIds() []string { // Authenticate against the server with a refresh token. type SessionRefreshRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Refresh token. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Extra information that will be bundled in the session token. - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SessionRefreshRequest) Reset() { *x = SessionRefreshRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SessionRefreshRequest) String() string { @@ -1272,7 +1251,7 @@ func (*SessionRefreshRequest) ProtoMessage() {} func (x *SessionRefreshRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1303,23 +1282,20 @@ func (x *SessionRefreshRequest) GetVars() map[string]string { // Log out a session, invalidate a refresh token, or log out all sessions/refresh tokens for a user. type SessionLogoutRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Session token to log out. Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Refresh token to invalidate. - RefreshToken string `protobuf:"bytes,2,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + RefreshToken string `protobuf:"bytes,2,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SessionLogoutRequest) Reset() { *x = SessionLogoutRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SessionLogoutRequest) String() string { @@ -1330,7 +1306,7 @@ func (*SessionLogoutRequest) ProtoMessage() {} func (x *SessionLogoutRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1361,25 +1337,22 @@ func (x *SessionLogoutRequest) GetRefreshToken() string { // Authenticate against the server with Apple Sign In. type AuthenticateAppleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Apple account details. Account *AccountApple `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateAppleRequest) Reset() { *x = AuthenticateAppleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateAppleRequest) String() string { @@ -1390,7 +1363,7 @@ func (*AuthenticateAppleRequest) ProtoMessage() {} func (x *AuthenticateAppleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1428,25 +1401,22 @@ func (x *AuthenticateAppleRequest) GetUsername() string { // Authenticate against the server with a custom ID. type AuthenticateCustomRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The custom account details. Account *AccountCustom `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateCustomRequest) Reset() { *x = AuthenticateCustomRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateCustomRequest) String() string { @@ -1457,7 +1427,7 @@ func (*AuthenticateCustomRequest) ProtoMessage() {} func (x *AuthenticateCustomRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1495,25 +1465,22 @@ func (x *AuthenticateCustomRequest) GetUsername() string { // Authenticate against the server with a device ID. type AuthenticateDeviceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The device account details. Account *AccountDevice `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateDeviceRequest) Reset() { *x = AuthenticateDeviceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateDeviceRequest) String() string { @@ -1524,7 +1491,7 @@ func (*AuthenticateDeviceRequest) ProtoMessage() {} func (x *AuthenticateDeviceRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1562,25 +1529,22 @@ func (x *AuthenticateDeviceRequest) GetUsername() string { // Authenticate against the server with email+password. type AuthenticateEmailRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The email account details. Account *AccountEmail `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateEmailRequest) Reset() { *x = AuthenticateEmailRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateEmailRequest) String() string { @@ -1591,7 +1555,7 @@ func (*AuthenticateEmailRequest) ProtoMessage() {} func (x *AuthenticateEmailRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1629,10 +1593,7 @@ func (x *AuthenticateEmailRequest) GetUsername() string { // Authenticate against the server with Facebook. type AuthenticateFacebookRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. @@ -1640,16 +1601,16 @@ type AuthenticateFacebookRequest struct { // Set the username on the account at register. Must be unique. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` // Import Facebook friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateFacebookRequest) Reset() { *x = AuthenticateFacebookRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateFacebookRequest) String() string { @@ -1660,7 +1621,7 @@ func (*AuthenticateFacebookRequest) ProtoMessage() {} func (x *AuthenticateFacebookRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1705,25 +1666,22 @@ func (x *AuthenticateFacebookRequest) GetSync() *wrapperspb.BoolValue { // Authenticate against the server with Facebook Instant Game token. type AuthenticateFacebookInstantGameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook Instant Game account details. Account *AccountFacebookInstantGame `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateFacebookInstantGameRequest) Reset() { *x = AuthenticateFacebookInstantGameRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateFacebookInstantGameRequest) String() string { @@ -1734,7 +1692,7 @@ func (*AuthenticateFacebookInstantGameRequest) ProtoMessage() {} func (x *AuthenticateFacebookInstantGameRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1772,25 +1730,22 @@ func (x *AuthenticateFacebookInstantGameRequest) GetUsername() string { // Authenticate against the server with Apple's Game Center. type AuthenticateGameCenterRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Game Center account details. Account *AccountGameCenter `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateGameCenterRequest) Reset() { *x = AuthenticateGameCenterRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateGameCenterRequest) String() string { @@ -1801,7 +1756,7 @@ func (*AuthenticateGameCenterRequest) ProtoMessage() {} func (x *AuthenticateGameCenterRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1839,25 +1794,22 @@ func (x *AuthenticateGameCenterRequest) GetUsername() string { // Authenticate against the server with Google. type AuthenticateGoogleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Google account details. Account *AccountGoogle `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. Create *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=create,proto3" json:"create,omitempty"` // Set the username on the account at register. Must be unique. - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateGoogleRequest) Reset() { *x = AuthenticateGoogleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateGoogleRequest) String() string { @@ -1868,7 +1820,7 @@ func (*AuthenticateGoogleRequest) ProtoMessage() {} func (x *AuthenticateGoogleRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1906,10 +1858,7 @@ func (x *AuthenticateGoogleRequest) GetUsername() string { // Authenticate against the server with Steam. type AuthenticateSteamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Steam account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Register the account if the user does not already exist. @@ -1917,16 +1866,16 @@ type AuthenticateSteamRequest struct { // Set the username on the account at register. Must be unique. Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` // Import Steam friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthenticateSteamRequest) Reset() { *x = AuthenticateSteamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthenticateSteamRequest) String() string { @@ -1937,7 +1886,7 @@ func (*AuthenticateSteamRequest) ProtoMessage() {} func (x *AuthenticateSteamRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1982,23 +1931,20 @@ func (x *AuthenticateSteamRequest) GetSync() *wrapperspb.BoolValue { // Ban users from a group. type BanGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group to ban users from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to ban. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BanGroupUsersRequest) Reset() { *x = BanGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *BanGroupUsersRequest) String() string { @@ -2009,7 +1955,7 @@ func (*BanGroupUsersRequest) ProtoMessage() {} func (x *BanGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2040,23 +1986,20 @@ func (x *BanGroupUsersRequest) GetUserIds() []string { // Block one or more friends for the current user. type BlockFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BlockFriendsRequest) Reset() { *x = BlockFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *BlockFriendsRequest) String() string { @@ -2067,7 +2010,7 @@ func (*BlockFriendsRequest) ProtoMessage() {} func (x *BlockFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2098,10 +2041,7 @@ func (x *BlockFriendsRequest) GetUsernames() []string { // A message sent on a channel. type ChannelMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel this message belongs to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The unique ID of this message. @@ -2127,16 +2067,16 @@ type ChannelMessage struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,12,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,13,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,13,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessage) Reset() { *x = ChannelMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessage) String() string { @@ -2147,7 +2087,7 @@ func (*ChannelMessage) ProtoMessage() {} func (x *ChannelMessage) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2255,10 +2195,7 @@ func (x *ChannelMessage) GetUserIdTwo() string { // A list of channel messages, usually a result of a list operation. type ChannelMessageList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of messages. Messages []*ChannelMessage `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` // The cursor to send when retrieving the next page, if any. @@ -2267,15 +2204,15 @@ type ChannelMessageList struct { PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // Cacheable cursor to list newer messages. Durable and designed to be stored, unlike next/prev cursors. CacheableCursor string `protobuf:"bytes,4,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageList) Reset() { *x = ChannelMessageList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageList) String() string { @@ -2286,7 +2223,7 @@ func (*ChannelMessageList) ProtoMessage() {} func (x *ChannelMessageList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2331,10 +2268,7 @@ func (x *ChannelMessageList) GetCacheableCursor() string { // Create a group with the current user as owner. type CreateGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A unique name for the group. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // A description for the group. @@ -2346,16 +2280,16 @@ type CreateGroupRequest struct { // Mark a group as open or not where only admins can accept members. Open bool `protobuf:"varint,5,opt,name=open,proto3" json:"open,omitempty"` // Maximum number of group members. - MaxCount int32 `protobuf:"varint,6,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` + MaxCount int32 `protobuf:"varint,6,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateGroupRequest) Reset() { *x = CreateGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateGroupRequest) String() string { @@ -2366,7 +2300,7 @@ func (*CreateGroupRequest) ProtoMessage() {} func (x *CreateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2425,23 +2359,20 @@ func (x *CreateGroupRequest) GetMaxCount() int32 { // Delete one or more friends for the current user. type DeleteFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteFriendsRequest) Reset() { *x = DeleteFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteFriendsRequest) String() string { @@ -2452,7 +2383,7 @@ func (*DeleteFriendsRequest) ProtoMessage() {} func (x *DeleteFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2483,21 +2414,18 @@ func (x *DeleteFriendsRequest) GetUsernames() []string { // Delete a group the user has access to. type DeleteGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of a group. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteGroupRequest) Reset() { *x = DeleteGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteGroupRequest) String() string { @@ -2508,7 +2436,7 @@ func (*DeleteGroupRequest) ProtoMessage() {} func (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2532,21 +2460,18 @@ func (x *DeleteGroupRequest) GetGroupId() string { // Delete a leaderboard record. type DeleteLeaderboardRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The leaderboard ID to delete from. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteLeaderboardRecordRequest) Reset() { *x = DeleteLeaderboardRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteLeaderboardRecordRequest) String() string { @@ -2557,7 +2482,7 @@ func (*DeleteLeaderboardRecordRequest) ProtoMessage() {} func (x *DeleteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2581,21 +2506,18 @@ func (x *DeleteLeaderboardRecordRequest) GetLeaderboardId() string { // Delete one or more notifications for the current user. type DeleteNotificationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of notifications. - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteNotificationsRequest) Reset() { *x = DeleteNotificationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteNotificationsRequest) String() string { @@ -2606,7 +2528,7 @@ func (*DeleteNotificationsRequest) ProtoMessage() {} func (x *DeleteNotificationsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2630,21 +2552,18 @@ func (x *DeleteNotificationsRequest) GetIds() []string { // Delete a leaderboard record. type DeleteTournamentRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The tournament ID to delete from. - TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteTournamentRecordRequest) Reset() { *x = DeleteTournamentRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteTournamentRecordRequest) String() string { @@ -2655,7 +2574,7 @@ func (*DeleteTournamentRecordRequest) ProtoMessage() {} func (x *DeleteTournamentRecordRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2679,25 +2598,22 @@ func (x *DeleteTournamentRecordRequest) GetTournamentId() string { // Storage objects to delete. type DeleteStorageObjectId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // The version hash of the object. - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteStorageObjectId) Reset() { *x = DeleteStorageObjectId{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteStorageObjectId) String() string { @@ -2708,7 +2624,7 @@ func (*DeleteStorageObjectId) ProtoMessage() {} func (x *DeleteStorageObjectId) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2746,21 +2662,18 @@ func (x *DeleteStorageObjectId) GetVersion() string { // Batch delete storage objects. type DeleteStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Batch of storage objects. - ObjectIds []*DeleteStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + ObjectIds []*DeleteStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteStorageObjectsRequest) Reset() { *x = DeleteStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteStorageObjectsRequest) String() string { @@ -2771,7 +2684,7 @@ func (*DeleteStorageObjectsRequest) ProtoMessage() {} func (x *DeleteStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2795,27 +2708,24 @@ func (x *DeleteStorageObjectsRequest) GetObjectIds() []*DeleteStorageObjectId { // Represents an event to be passed through the server to registered event handlers. type Event struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // An event name, type, category, or identifier. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Arbitrary event property values. - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // The time when the event was triggered. Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // True if the event came directly from a client call, false otherwise. - External bool `protobuf:"varint,4,opt,name=external,proto3" json:"external,omitempty"` + External bool `protobuf:"varint,4,opt,name=external,proto3" json:"external,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Event) Reset() { *x = Event{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Event) String() string { @@ -2826,7 +2736,7 @@ func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2871,10 +2781,7 @@ func (x *Event) GetExternal() bool { // A friend of a user. type Friend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user object. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // The friend status. @@ -2882,16 +2789,16 @@ type Friend struct { // Time of the latest relationship update. UpdateTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // Metadata. - Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Friend) Reset() { *x = Friend{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Friend) String() string { @@ -2902,7 +2809,7 @@ func (*Friend) ProtoMessage() {} func (x *Friend) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2947,23 +2854,20 @@ func (x *Friend) GetMetadata() string { // A collection of zero or more friends of the user. type FriendList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Friend objects. Friends []*Friend `protobuf:"bytes,1,rep,name=friends,proto3" json:"friends,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FriendList) Reset() { *x = FriendList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FriendList) String() string { @@ -2974,7 +2878,7 @@ func (*FriendList) ProtoMessage() {} func (x *FriendList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3005,23 +2909,20 @@ func (x *FriendList) GetCursor() string { // A List of friends of friends type FriendsOfFriendsList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User friends of friends. FriendsOfFriends []*FriendsOfFriendsList_FriendOfFriend `protobuf:"bytes,1,rep,name=friends_of_friends,json=friendsOfFriends,proto3" json:"friends_of_friends,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FriendsOfFriendsList) Reset() { *x = FriendsOfFriendsList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FriendsOfFriendsList) String() string { @@ -3032,7 +2933,7 @@ func (*FriendsOfFriendsList) ProtoMessage() {} func (x *FriendsOfFriendsList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3063,25 +2964,22 @@ func (x *FriendsOfFriendsList) GetCursor() string { // Fetch a batch of zero or more users from the server. type GetUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The account id of a user. Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` // The account username of a user. Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` // The Facebook ID of a user. - FacebookIds []string `protobuf:"bytes,3,rep,name=facebook_ids,json=facebookIds,proto3" json:"facebook_ids,omitempty"` + FacebookIds []string `protobuf:"bytes,3,rep,name=facebook_ids,json=facebookIds,proto3" json:"facebook_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetUsersRequest) Reset() { *x = GetUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetUsersRequest) String() string { @@ -3092,7 +2990,7 @@ func (*GetUsersRequest) ProtoMessage() {} func (x *GetUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3130,21 +3028,18 @@ func (x *GetUsersRequest) GetFacebookIds() []string { // Fetch a subscription by product id. type GetSubscriptionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Product id of the subscription - ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` + ProductId string `protobuf:"bytes,1,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetSubscriptionRequest) Reset() { *x = GetSubscriptionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetSubscriptionRequest) String() string { @@ -3155,7 +3050,7 @@ func (*GetSubscriptionRequest) ProtoMessage() {} func (x *GetSubscriptionRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3179,10 +3074,7 @@ func (x *GetSubscriptionRequest) GetProductId() string { // A group in the server. type Group struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of a group. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The id of the user who created the group. @@ -3206,16 +3098,16 @@ type Group struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the group was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Group) Reset() { *x = Group{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Group) String() string { @@ -3226,7 +3118,7 @@ func (*Group) ProtoMessage() {} func (x *Group) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3327,23 +3219,20 @@ func (x *Group) GetUpdateTime() *timestamppb.Timestamp { // One or more groups returned from a listing operation. type GroupList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // One or more groups. Groups []*Group `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` // A cursor used to get the next page. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupList) Reset() { *x = GroupList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupList) String() string { @@ -3354,7 +3243,7 @@ func (*GroupList) ProtoMessage() {} func (x *GroupList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3385,23 +3274,20 @@ func (x *GroupList) GetCursor() string { // A list of users belonging to a group, along with their role. type GroupUserList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User-role pairs for a group. GroupUsers []*GroupUserList_GroupUser `protobuf:"bytes,1,rep,name=group_users,json=groupUsers,proto3" json:"group_users,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupUserList) Reset() { *x = GroupUserList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupUserList) String() string { @@ -3412,7 +3298,7 @@ func (*GroupUserList) ProtoMessage() {} func (x *GroupUserList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3443,23 +3329,20 @@ func (x *GroupUserList) GetCursor() string { // Import Facebook friends into the current user's account. type ImportFacebookFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Reset the current user's friends list. - Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ImportFacebookFriendsRequest) Reset() { *x = ImportFacebookFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImportFacebookFriendsRequest) String() string { @@ -3470,7 +3353,7 @@ func (*ImportFacebookFriendsRequest) ProtoMessage() {} func (x *ImportFacebookFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3501,23 +3384,20 @@ func (x *ImportFacebookFriendsRequest) GetReset_() *wrapperspb.BoolValue { // Import Facebook friends into the current user's account. type ImportSteamFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Reset the current user's friends list. - Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + Reset_ *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=reset,proto3" json:"reset,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ImportSteamFriendsRequest) Reset() { *x = ImportSteamFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImportSteamFriendsRequest) String() string { @@ -3528,7 +3408,7 @@ func (*ImportSteamFriendsRequest) ProtoMessage() {} func (x *ImportSteamFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3559,21 +3439,18 @@ func (x *ImportSteamFriendsRequest) GetReset_() *wrapperspb.BoolValue { // Immediately join an open group, or request to join a closed one. type JoinGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to join. The group must already exist. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinGroupRequest) Reset() { *x = JoinGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *JoinGroupRequest) String() string { @@ -3584,7 +3461,7 @@ func (*JoinGroupRequest) ProtoMessage() {} func (x *JoinGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3608,21 +3485,18 @@ func (x *JoinGroupRequest) GetGroupId() string { // The request to join a tournament. type JoinTournamentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to join. The tournament must already exist. - TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinTournamentRequest) Reset() { *x = JoinTournamentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *JoinTournamentRequest) String() string { @@ -3633,7 +3507,7 @@ func (*JoinTournamentRequest) ProtoMessage() {} func (x *JoinTournamentRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3657,23 +3531,20 @@ func (x *JoinTournamentRequest) GetTournamentId() string { // Kick a set of users from a group. type KickGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to kick from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to kick. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *KickGroupUsersRequest) Reset() { *x = KickGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *KickGroupUsersRequest) String() string { @@ -3684,7 +3555,7 @@ func (*KickGroupUsersRequest) ProtoMessage() {} func (x *KickGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3715,10 +3586,7 @@ func (x *KickGroupUsersRequest) GetUserIds() []string { // A leaderboard on the server. type Leaderboard struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // ASC(0) or DESC(1) sort mode of scores in the leaderboard. @@ -3735,15 +3603,15 @@ type Leaderboard struct { CreateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // Whether the leaderboard was created authoritatively or not. Authoritative bool `protobuf:"varint,8,opt,name=authoritative,proto3" json:"authoritative,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Leaderboard) Reset() { *x = Leaderboard{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Leaderboard) String() string { @@ -3754,7 +3622,7 @@ func (*Leaderboard) ProtoMessage() {} func (x *Leaderboard) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3827,23 +3695,20 @@ func (x *Leaderboard) GetAuthoritative() bool { // A list of leaderboards type LeaderboardList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of leaderboards returned. Leaderboards []*Leaderboard `protobuf:"bytes,1,rep,name=leaderboards,proto3" json:"leaderboards,omitempty"` // A pagination cursor (optional). - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardList) Reset() { *x = LeaderboardList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardList) String() string { @@ -3854,7 +3719,7 @@ func (*LeaderboardList) ProtoMessage() {} func (x *LeaderboardList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3885,10 +3750,7 @@ func (x *LeaderboardList) GetCursor() string { // Represents a complete leaderboard record with all scores and associated metadata. type LeaderboardRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard this score belongs to. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // The ID of the score owner, usually a user or group. @@ -3912,16 +3774,16 @@ type LeaderboardRecord struct { // The rank of this record. Rank int64 `protobuf:"varint,11,opt,name=rank,proto3" json:"rank,omitempty"` // The maximum number of score updates allowed by the owner. - MaxNumScore uint32 `protobuf:"varint,12,opt,name=max_num_score,json=maxNumScore,proto3" json:"max_num_score,omitempty"` + MaxNumScore uint32 `protobuf:"varint,12,opt,name=max_num_score,json=maxNumScore,proto3" json:"max_num_score,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardRecord) Reset() { *x = LeaderboardRecord{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardRecord) String() string { @@ -3932,7 +3794,7 @@ func (*LeaderboardRecord) ProtoMessage() {} func (x *LeaderboardRecord) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4033,10 +3895,7 @@ func (x *LeaderboardRecord) GetMaxNumScore() uint32 { // A set of leaderboard records, may be part of a leaderboard records page or a batch of individual records. type LeaderboardRecordList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of leaderboard records. Records []*LeaderboardRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` // A batched set of leaderboard records belonging to specified owners. @@ -4046,16 +3905,16 @@ type LeaderboardRecordList struct { // The cursor to send when retrieving the previous page, if any. PrevCursor string `protobuf:"bytes,4,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // The total number of ranks available. - RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaderboardRecordList) Reset() { *x = LeaderboardRecordList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaderboardRecordList) String() string { @@ -4066,7 +3925,7 @@ func (*LeaderboardRecordList) ProtoMessage() {} func (x *LeaderboardRecordList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4118,21 +3977,18 @@ func (x *LeaderboardRecordList) GetRankCount() int64 { // Leave a group. type LeaveGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to leave. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LeaveGroupRequest) Reset() { *x = LeaveGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LeaveGroupRequest) String() string { @@ -4143,7 +3999,7 @@ func (*LeaveGroupRequest) ProtoMessage() {} func (x *LeaveGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4167,23 +4023,20 @@ func (x *LeaveGroupRequest) GetGroupId() string { // Link Facebook to the current user's account. type LinkFacebookRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountFacebook `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Import Facebook friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LinkFacebookRequest) Reset() { *x = LinkFacebookRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LinkFacebookRequest) String() string { @@ -4194,7 +4047,7 @@ func (*LinkFacebookRequest) ProtoMessage() {} func (x *LinkFacebookRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4225,23 +4078,20 @@ func (x *LinkFacebookRequest) GetSync() *wrapperspb.BoolValue { // Link Steam to the current user's account. type LinkSteamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The Facebook account details. Account *AccountSteam `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // Import Steam friends for the user. - Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + Sync *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=sync,proto3" json:"sync,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LinkSteamRequest) Reset() { *x = LinkSteamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LinkSteamRequest) String() string { @@ -4252,7 +4102,7 @@ func (*LinkSteamRequest) ProtoMessage() {} func (x *LinkSteamRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4283,10 +4133,7 @@ func (x *LinkSteamRequest) GetSync() *wrapperspb.BoolValue { // List a channel's message history. type ListChannelMessagesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel ID to list from. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4294,16 +4141,16 @@ type ListChannelMessagesRequest struct { // True if listing should be older messages to newer, false if reverse. Forward *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=forward,proto3" json:"forward,omitempty"` // A pagination cursor, if any. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListChannelMessagesRequest) Reset() { *x = ListChannelMessagesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListChannelMessagesRequest) String() string { @@ -4314,7 +4161,7 @@ func (*ListChannelMessagesRequest) ProtoMessage() {} func (x *ListChannelMessagesRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4359,25 +4206,22 @@ func (x *ListChannelMessagesRequest) GetCursor() string { // List friends for a user. type ListFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // The friend state to list. State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListFriendsRequest) Reset() { *x = ListFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListFriendsRequest) String() string { @@ -4388,7 +4232,7 @@ func (*ListFriendsRequest) ProtoMessage() {} func (x *ListFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4425,23 +4269,20 @@ func (x *ListFriendsRequest) GetCursor() string { } type ListFriendsOfFriendsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListFriendsOfFriendsRequest) Reset() { *x = ListFriendsOfFriendsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListFriendsOfFriendsRequest) String() string { @@ -4452,7 +4293,7 @@ func (*ListFriendsOfFriendsRequest) ProtoMessage() {} func (x *ListFriendsOfFriendsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4483,10 +4324,7 @@ func (x *ListFriendsOfFriendsRequest) GetCursor() string { // List groups based on given filters. type ListGroupsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // List groups that contain this value in their names. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Optional pagination cursor. @@ -4498,16 +4336,16 @@ type ListGroupsRequest struct { // Number of group members Members *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=members,proto3" json:"members,omitempty"` // Optional Open/Closed filter. - Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListGroupsRequest) Reset() { *x = ListGroupsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListGroupsRequest) String() string { @@ -4518,7 +4356,7 @@ func (*ListGroupsRequest) ProtoMessage() {} func (x *ListGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4577,10 +4415,7 @@ func (x *ListGroupsRequest) GetOpen() *wrapperspb.BoolValue { // List all users that are part of a group. type ListGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to list from. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4588,16 +4423,16 @@ type ListGroupUsersRequest struct { // The group user state to list. State *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListGroupUsersRequest) Reset() { *x = ListGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListGroupUsersRequest) String() string { @@ -4608,7 +4443,7 @@ func (*ListGroupUsersRequest) ProtoMessage() {} func (x *ListGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4653,10 +4488,7 @@ func (x *ListGroupUsersRequest) GetCursor() string { // List leaerboard records from a given leaderboard around the owner. type ListLeaderboardRecordsAroundOwnerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to list for. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -4666,16 +4498,16 @@ type ListLeaderboardRecordsAroundOwnerRequest struct { // Expiry in seconds (since epoch) to begin fetching records from. Expiry *wrapperspb.Int64Value `protobuf:"bytes,4,opt,name=expiry,proto3" json:"expiry,omitempty"` // A next or previous page cursor. - Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListLeaderboardRecordsAroundOwnerRequest) Reset() { *x = ListLeaderboardRecordsAroundOwnerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListLeaderboardRecordsAroundOwnerRequest) String() string { @@ -4686,7 +4518,7 @@ func (*ListLeaderboardRecordsAroundOwnerRequest) ProtoMessage() {} func (x *ListLeaderboardRecordsAroundOwnerRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4738,10 +4570,7 @@ func (x *ListLeaderboardRecordsAroundOwnerRequest) GetCursor() string { // List leaderboard records from a given leaderboard. type ListLeaderboardRecordsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard to list for. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // One or more owners to retrieve records for. @@ -4751,16 +4580,16 @@ type ListLeaderboardRecordsRequest struct { // A next or previous page cursor. Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // Expiry in seconds (since epoch) to begin fetching records from. Optional. 0 means from current time. - Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListLeaderboardRecordsRequest) Reset() { *x = ListLeaderboardRecordsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListLeaderboardRecordsRequest) String() string { @@ -4771,7 +4600,7 @@ func (*ListLeaderboardRecordsRequest) ProtoMessage() {} func (x *ListLeaderboardRecordsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4823,10 +4652,7 @@ func (x *ListLeaderboardRecordsRequest) GetExpiry() *wrapperspb.Int64Value { // List realtime matches. type ListMatchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Limit the number of returned matches. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // Authoritative or relayed matches. @@ -4838,16 +4664,16 @@ type ListMatchesRequest struct { // Maximum user count. MaxSize *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` // Arbitrary label query. - Query *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=query,proto3" json:"query,omitempty"` + Query *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=query,proto3" json:"query,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListMatchesRequest) Reset() { *x = ListMatchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMatchesRequest) String() string { @@ -4858,7 +4684,7 @@ func (*ListMatchesRequest) ProtoMessage() {} func (x *ListMatchesRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4917,23 +4743,20 @@ func (x *ListMatchesRequest) GetQuery() *wrapperspb.StringValue { // Get a list of unexpired notifications. type ListNotificationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The number of notifications to get. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // A cursor to page through notifications. May be cached by clients to get from point in time forwards. CacheableCursor string `protobuf:"bytes,2,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` // value from NotificationList.cacheable_cursor. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListNotificationsRequest) Reset() { *x = ListNotificationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListNotificationsRequest) String() string { @@ -4944,7 +4767,7 @@ func (*ListNotificationsRequest) ProtoMessage() {} func (x *ListNotificationsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4975,10 +4798,7 @@ func (x *ListNotificationsRequest) GetCacheableCursor() string { // List publicly readable storage objects in a given collection. type ListStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the user. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // The collection which stores the object. @@ -4986,16 +4806,16 @@ type ListStorageObjectsRequest struct { // The number of storage objects to list. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=limit,proto3" json:"limit,omitempty"` // The cursor to page through results from. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // value from StorageObjectList.cursor. + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // value from StorageObjectList.cursor. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListStorageObjectsRequest) Reset() { *x = ListStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListStorageObjectsRequest) String() string { @@ -5006,7 +4826,7 @@ func (*ListStorageObjectsRequest) ProtoMessage() {} func (x *ListStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5051,23 +4871,20 @@ func (x *ListStorageObjectsRequest) GetCursor() string { // List user subscriptions. type ListSubscriptionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Max number of results per page Limit *wrapperspb.Int32Value `protobuf:"bytes,1,opt,name=limit,proto3" json:"limit,omitempty"` // Cursor to retrieve a page of records from - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListSubscriptionsRequest) Reset() { *x = ListSubscriptionsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListSubscriptionsRequest) String() string { @@ -5078,7 +4895,7 @@ func (*ListSubscriptionsRequest) ProtoMessage() {} func (x *ListSubscriptionsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[67] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5109,10 +4926,7 @@ func (x *ListSubscriptionsRequest) GetCursor() string { // List tournament records from a given tournament around the owner. type ListTournamentRecordsAroundOwnerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to list for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -5122,16 +4936,16 @@ type ListTournamentRecordsAroundOwnerRequest struct { // Expiry in seconds (since epoch) to begin fetching records from. Expiry *wrapperspb.Int64Value `protobuf:"bytes,4,opt,name=expiry,proto3" json:"expiry,omitempty"` // A next or previous page cursor. - Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,5,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListTournamentRecordsAroundOwnerRequest) Reset() { *x = ListTournamentRecordsAroundOwnerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTournamentRecordsAroundOwnerRequest) String() string { @@ -5142,7 +4956,7 @@ func (*ListTournamentRecordsAroundOwnerRequest) ProtoMessage() {} func (x *ListTournamentRecordsAroundOwnerRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5194,10 +5008,7 @@ func (x *ListTournamentRecordsAroundOwnerRequest) GetCursor() string { // List tournament records from a given tournament. type ListTournamentRecordsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament to list for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // One or more owners to retrieve records for. @@ -5207,16 +5018,16 @@ type ListTournamentRecordsRequest struct { // A next or previous page cursor. Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` // Expiry in seconds (since epoch) to begin fetching records from. - Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + Expiry *wrapperspb.Int64Value `protobuf:"bytes,5,opt,name=expiry,proto3" json:"expiry,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListTournamentRecordsRequest) Reset() { *x = ListTournamentRecordsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTournamentRecordsRequest) String() string { @@ -5227,7 +5038,7 @@ func (*ListTournamentRecordsRequest) ProtoMessage() {} func (x *ListTournamentRecordsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[69] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5279,10 +5090,7 @@ func (x *ListTournamentRecordsRequest) GetExpiry() *wrapperspb.Int64Value { // List active/upcoming tournaments based on given filters. type ListTournamentsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The start of the categories to include. Defaults to 0. CategoryStart *wrapperspb.UInt32Value `protobuf:"bytes,1,opt,name=category_start,json=categoryStart,proto3" json:"category_start,omitempty"` // The end of the categories to include. Defaults to 128. @@ -5294,16 +5102,16 @@ type ListTournamentsRequest struct { // Max number of records to return. Between 1 and 100. Limit *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=limit,proto3" json:"limit,omitempty"` // A next page cursor for listings (optional). - Cursor string `protobuf:"bytes,8,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,8,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListTournamentsRequest) Reset() { *x = ListTournamentsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTournamentsRequest) String() string { @@ -5314,7 +5122,7 @@ func (*ListTournamentsRequest) ProtoMessage() {} func (x *ListTournamentsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5373,10 +5181,7 @@ func (x *ListTournamentsRequest) GetCursor() string { // List the groups a user is part of, and their relationship to each. type ListUserGroupsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the user. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Max number of records to return. Between 1 and 100. @@ -5384,16 +5189,16 @@ type ListUserGroupsRequest struct { // The user group state to list. State *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // An optional next page cursor. - Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListUserGroupsRequest) Reset() { *x = ListUserGroupsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListUserGroupsRequest) String() string { @@ -5404,7 +5209,7 @@ func (*ListUserGroupsRequest) ProtoMessage() {} func (x *ListUserGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5449,10 +5254,7 @@ func (x *ListUserGroupsRequest) GetCursor() string { // Represents a realtime match. type Match struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the match, can be used to join. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // True if it's an server-managed authoritative match, false otherwise. @@ -5464,16 +5266,16 @@ type Match struct { // Tick Rate TickRate int32 `protobuf:"varint,5,opt,name=tick_rate,json=tickRate,proto3" json:"tick_rate,omitempty"` // Handler name - HandlerName string `protobuf:"bytes,6,opt,name=handler_name,json=handlerName,proto3" json:"handler_name,omitempty"` + HandlerName string `protobuf:"bytes,6,opt,name=handler_name,json=handlerName,proto3" json:"handler_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Match) Reset() { *x = Match{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Match) String() string { @@ -5484,7 +5286,7 @@ func (*Match) ProtoMessage() {} func (x *Match) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5543,21 +5345,18 @@ func (x *Match) GetHandlerName() string { // A list of realtime matches. type MatchList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A number of matches corresponding to a list operation. - Matches []*Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` + Matches []*Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchList) Reset() { *x = MatchList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[73] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchList) String() string { @@ -5568,7 +5367,7 @@ func (*MatchList) ProtoMessage() {} func (x *MatchList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[73] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5592,21 +5391,18 @@ func (x *MatchList) GetMatches() []*Match { // Matchmaker ticket completion stats type MatchmakerCompletionStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + CreateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + CompleteTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=complete_time,json=completeTime,proto3" json:"complete_time,omitempty"` unknownFields protoimpl.UnknownFields - - CreateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - CompleteTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=complete_time,json=completeTime,proto3" json:"complete_time,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MatchmakerCompletionStats) Reset() { *x = MatchmakerCompletionStats{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[74] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerCompletionStats) String() string { @@ -5617,7 +5413,7 @@ func (*MatchmakerCompletionStats) ProtoMessage() {} func (x *MatchmakerCompletionStats) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[74] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5648,22 +5444,19 @@ func (x *MatchmakerCompletionStats) GetCompleteTime() *timestamppb.Timestamp { // Matchmaker stats type MatchmakerStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` TicketCount int32 `protobuf:"varint,1,opt,name=ticket_count,json=ticketCount,proto3" json:"ticket_count,omitempty"` OldestTicketCreateTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=oldest_ticket_create_time,json=oldestTicketCreateTime,proto3" json:"oldest_ticket_create_time,omitempty"` Completions []*MatchmakerCompletionStats `protobuf:"bytes,3,rep,name=completions,proto3" json:"completions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerStats) Reset() { *x = MatchmakerStats{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[75] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerStats) String() string { @@ -5674,7 +5467,7 @@ func (*MatchmakerStats) ProtoMessage() {} func (x *MatchmakerStats) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[75] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5712,10 +5505,7 @@ func (x *MatchmakerStats) GetCompletions() []*MatchmakerCompletionStats { // A notification in the server. type Notification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID of the Notification. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Subject of the notification. @@ -5729,16 +5519,16 @@ type Notification struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the notification was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // True if this notification was persisted to the database. - Persistent bool `protobuf:"varint,7,opt,name=persistent,proto3" json:"persistent,omitempty"` + Persistent bool `protobuf:"varint,7,opt,name=persistent,proto3" json:"persistent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Notification) Reset() { *x = Notification{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Notification) String() string { @@ -5749,7 +5539,7 @@ func (*Notification) ProtoMessage() {} func (x *Notification) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[76] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5815,23 +5605,20 @@ func (x *Notification) GetPersistent() bool { // A collection of zero or more notifications. type NotificationList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Collection of notifications. Notifications []*Notification `protobuf:"bytes,1,rep,name=notifications,proto3" json:"notifications,omitempty"` // Use this cursor to paginate notifications. Cache this to catch up to new notifications. CacheableCursor string `protobuf:"bytes,2,opt,name=cacheable_cursor,json=cacheableCursor,proto3" json:"cacheable_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NotificationList) Reset() { *x = NotificationList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[77] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *NotificationList) String() string { @@ -5842,7 +5629,7 @@ func (*NotificationList) ProtoMessage() {} func (x *NotificationList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[77] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5873,23 +5660,20 @@ func (x *NotificationList) GetCacheableCursor() string { // Promote a set of users in a group to the next role up. type PromoteGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to promote in. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to promote. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PromoteGroupUsersRequest) Reset() { *x = PromoteGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[78] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PromoteGroupUsersRequest) String() string { @@ -5900,7 +5684,7 @@ func (*PromoteGroupUsersRequest) ProtoMessage() {} func (x *PromoteGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[78] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5931,23 +5715,20 @@ func (x *PromoteGroupUsersRequest) GetUserIds() []string { // Demote a set of users in a group to the next role down. type DemoteGroupUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The group ID to demote in. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The users to demote. - UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DemoteGroupUsersRequest) Reset() { *x = DemoteGroupUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[79] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DemoteGroupUsersRequest) String() string { @@ -5958,7 +5739,7 @@ func (*DemoteGroupUsersRequest) ProtoMessage() {} func (x *DemoteGroupUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[79] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5989,25 +5770,22 @@ func (x *DemoteGroupUsersRequest) GetUserIds() []string { // Storage objects to get. type ReadStorageObjectId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // The user owner of the object. - UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReadStorageObjectId) Reset() { *x = ReadStorageObjectId{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[80] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReadStorageObjectId) String() string { @@ -6018,7 +5796,7 @@ func (*ReadStorageObjectId) ProtoMessage() {} func (x *ReadStorageObjectId) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[80] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6056,21 +5834,18 @@ func (x *ReadStorageObjectId) GetUserId() string { // Batch get storage objects. type ReadStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Batch of storage objects. - ObjectIds []*ReadStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + ObjectIds []*ReadStorageObjectId `protobuf:"bytes,1,rep,name=object_ids,json=objectIds,proto3" json:"object_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReadStorageObjectsRequest) Reset() { *x = ReadStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[81] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReadStorageObjectsRequest) String() string { @@ -6081,7 +5856,7 @@ func (*ReadStorageObjectsRequest) ProtoMessage() {} func (x *ReadStorageObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[81] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6105,25 +5880,22 @@ func (x *ReadStorageObjectsRequest) GetObjectIds() []*ReadStorageObjectId { // Execute an Lua function on the server. type Rpc struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The identifier of the function. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The payload of the function which must be a JSON object. Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` // The authentication key used when executed as a non-client HTTP request. - HttpKey string `protobuf:"bytes,3,opt,name=http_key,json=httpKey,proto3" json:"http_key,omitempty"` + HttpKey string `protobuf:"bytes,3,opt,name=http_key,json=httpKey,proto3" json:"http_key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Rpc) Reset() { *x = Rpc{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[82] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Rpc) String() string { @@ -6134,7 +5906,7 @@ func (*Rpc) ProtoMessage() {} func (x *Rpc) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[82] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6172,25 +5944,22 @@ func (x *Rpc) GetHttpKey() string { // A user's session used to authenticate messages. type Session struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // True if the corresponding account was just created, false otherwise. Created bool `protobuf:"varint,1,opt,name=created,proto3" json:"created,omitempty"` // Authentication credentials. Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` // Refresh token that can be used for session token renewal. - RefreshToken string `protobuf:"bytes,3,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + RefreshToken string `protobuf:"bytes,3,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Session) Reset() { *x = Session{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[83] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Session) String() string { @@ -6201,7 +5970,7 @@ func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[83] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6239,10 +6008,7 @@ func (x *Session) GetRefreshToken() string { // An object within the storage engine. type StorageObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. @@ -6260,16 +6026,16 @@ type StorageObject struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObject) Reset() { *x = StorageObject{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[84] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObject) String() string { @@ -6280,7 +6046,7 @@ func (*StorageObject) ProtoMessage() {} func (x *StorageObject) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[84] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6360,10 +6126,7 @@ func (x *StorageObject) GetUpdateTime() *timestamppb.Timestamp { // A storage acknowledgement. type StorageObjectAck struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection which stores the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key of the object within the collection. @@ -6375,16 +6138,16 @@ type StorageObjectAck struct { // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was created. CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the object was last updated. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjectAck) Reset() { *x = StorageObjectAck{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[85] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[85] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjectAck) String() string { @@ -6395,7 +6158,7 @@ func (*StorageObjectAck) ProtoMessage() {} func (x *StorageObjectAck) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[85] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6454,21 +6217,18 @@ func (x *StorageObjectAck) GetUpdateTime() *timestamppb.Timestamp { // Batch of acknowledgements for the storage object write. type StorageObjectAcks struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Batch of storage write acknowledgements. - Acks []*StorageObjectAck `protobuf:"bytes,1,rep,name=acks,proto3" json:"acks,omitempty"` + Acks []*StorageObjectAck `protobuf:"bytes,1,rep,name=acks,proto3" json:"acks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjectAcks) Reset() { *x = StorageObjectAcks{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[86] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjectAcks) String() string { @@ -6479,7 +6239,7 @@ func (*StorageObjectAcks) ProtoMessage() {} func (x *StorageObjectAcks) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[86] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6503,21 +6263,18 @@ func (x *StorageObjectAcks) GetAcks() []*StorageObjectAck { // Batch of storage objects. type StorageObjects struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The batch of storage objects. - Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjects) Reset() { *x = StorageObjects{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[87] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjects) String() string { @@ -6528,7 +6285,7 @@ func (*StorageObjects) ProtoMessage() {} func (x *StorageObjects) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[87] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6552,23 +6309,20 @@ func (x *StorageObjects) GetObjects() []*StorageObject { // List of storage objects. type StorageObjectList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of storage objects. Objects []*StorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` // The cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StorageObjectList) Reset() { *x = StorageObjectList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[88] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StorageObjectList) String() string { @@ -6579,7 +6333,7 @@ func (*StorageObjectList) ProtoMessage() {} func (x *StorageObjectList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[88] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6610,10 +6364,7 @@ func (x *StorageObjectList) GetCursor() string { // A tournament on the server. type Tournament struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the tournament. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The title for the tournament. @@ -6654,15 +6405,15 @@ type Tournament struct { Operator Operator `protobuf:"varint,19,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` // Whether the leaderboard was created authoritatively or not. Authoritative bool `protobuf:"varint,20,opt,name=authoritative,proto3" json:"authoritative,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Tournament) Reset() { *x = Tournament{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[89] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Tournament) String() string { @@ -6673,7 +6424,7 @@ func (*Tournament) ProtoMessage() {} func (x *Tournament) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[89] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6830,23 +6581,20 @@ func (x *Tournament) GetAuthoritative() bool { // A list of tournaments. type TournamentList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The list of tournaments returned. Tournaments []*Tournament `protobuf:"bytes,1,rep,name=tournaments,proto3" json:"tournaments,omitempty"` // A pagination cursor (optional). - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TournamentList) Reset() { *x = TournamentList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[90] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[90] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TournamentList) String() string { @@ -6857,7 +6605,7 @@ func (*TournamentList) ProtoMessage() {} func (x *TournamentList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[90] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6888,10 +6636,7 @@ func (x *TournamentList) GetCursor() string { // A set of tournament records which may be part of a tournament records page or a batch of individual records. type TournamentRecordList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of tournament records. Records []*LeaderboardRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` // A batched set of tournament records belonging to specified owners. @@ -6901,16 +6646,16 @@ type TournamentRecordList struct { // The cursor to send when retrieving the previous page (optional). PrevCursor string `protobuf:"bytes,4,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` // The total number of ranks available. - RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + RankCount int64 `protobuf:"varint,5,opt,name=rank_count,json=rankCount,proto3" json:"rank_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TournamentRecordList) Reset() { *x = TournamentRecordList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[91] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[91] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TournamentRecordList) String() string { @@ -6921,7 +6666,7 @@ func (*TournamentRecordList) ProtoMessage() {} func (x *TournamentRecordList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[91] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6973,10 +6718,7 @@ func (x *TournamentRecordList) GetRankCount() int64 { // Update a user's account details. type UpdateAccountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The username of the user's account. Username *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // The display name of the user. @@ -6988,16 +6730,16 @@ type UpdateAccountRequest struct { // The location set by the user. Location *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=location,proto3" json:"location,omitempty"` // The timezone set by the user. - Timezone *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=timezone,proto3" json:"timezone,omitempty"` + Timezone *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=timezone,proto3" json:"timezone,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateAccountRequest) Reset() { *x = UpdateAccountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[92] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAccountRequest) String() string { @@ -7008,7 +6750,7 @@ func (*UpdateAccountRequest) ProtoMessage() {} func (x *UpdateAccountRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[92] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7067,10 +6809,7 @@ func (x *UpdateAccountRequest) GetTimezone() *wrapperspb.StringValue { // Update fields in a given group. type UpdateGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the group to update. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // Name. @@ -7082,16 +6821,16 @@ type UpdateGroupRequest struct { // Avatar URL. AvatarUrl *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // Open is true if anyone should be allowed to join, or false if joins must be approved by a group admin. - Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + Open *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=open,proto3" json:"open,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateGroupRequest) Reset() { *x = UpdateGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[93] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateGroupRequest) String() string { @@ -7102,7 +6841,7 @@ func (*UpdateGroupRequest) ProtoMessage() {} func (x *UpdateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[93] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7161,10 +6900,7 @@ func (x *UpdateGroupRequest) GetOpen() *wrapperspb.BoolValue { // A user in the server. type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The id of the user's account. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The username of the user's account. @@ -7200,16 +6936,16 @@ type User struct { // The Facebook Instant Game ID in the user's account. FacebookInstantGameId string `protobuf:"bytes,17,opt,name=facebook_instant_game_id,json=facebookInstantGameId,proto3" json:"facebook_instant_game_id,omitempty"` // The Apple Sign In ID in the user's account. - AppleId string `protobuf:"bytes,18,opt,name=apple_id,json=appleId,proto3" json:"apple_id,omitempty"` + AppleId string `protobuf:"bytes,18,opt,name=apple_id,json=appleId,proto3" json:"apple_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *User) Reset() { *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[94] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[94] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *User) String() string { @@ -7220,7 +6956,7 @@ func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[94] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7363,23 +7099,20 @@ func (x *User) GetAppleId() string { // A list of groups belonging to a user, along with the user's role in each group. type UserGroupList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Group-role pairs for a user. UserGroups []*UserGroupList_UserGroup `protobuf:"bytes,1,rep,name=user_groups,json=userGroups,proto3" json:"user_groups,omitempty"` // Cursor for the next page of results, if any. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserGroupList) Reset() { *x = UserGroupList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[95] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[95] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserGroupList) String() string { @@ -7390,7 +7123,7 @@ func (*UserGroupList) ProtoMessage() {} func (x *UserGroupList) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[95] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7421,21 +7154,18 @@ func (x *UserGroupList) GetCursor() string { // A collection of zero or more users. type Users struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The User objects. - Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Users) Reset() { *x = Users{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[96] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[96] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Users) String() string { @@ -7446,7 +7176,7 @@ func (*Users) ProtoMessage() {} func (x *Users) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[96] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7468,25 +7198,82 @@ func (x *Users) GetUsers() []*User { return nil } -// Apple IAP Purchases validation request -type ValidatePurchaseAppleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ValidatePurchaseRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` + Platform string `protobuf:"bytes,2,opt,name=platform,proto3" json:"platform,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchaseRequest) Reset() { + *x = ValidatePurchaseRequest{} + mi := &file_api_proto_msgTypes[97] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseRequest) ProtoMessage() {} + +func (x *ValidatePurchaseRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[97] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{97} +} + +func (x *ValidatePurchaseRequest) GetReceipt() string { + if x != nil { + return x.Receipt + } + return "" +} +func (x *ValidatePurchaseRequest) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +func (x *ValidatePurchaseRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + +// Apple IAP Purchases validation request +type ValidatePurchaseAppleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` // Base64 encoded Apple receipt data payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseAppleRequest) Reset() { *x = ValidatePurchaseAppleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[97] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseAppleRequest) String() string { @@ -7496,8 +7283,8 @@ func (x *ValidatePurchaseAppleRequest) String() string { func (*ValidatePurchaseAppleRequest) ProtoMessage() {} func (x *ValidatePurchaseAppleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[97] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[98] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7509,7 +7296,7 @@ func (x *ValidatePurchaseAppleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseAppleRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseAppleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{97} + return file_api_proto_rawDescGZIP(), []int{98} } func (x *ValidatePurchaseAppleRequest) GetReceipt() string { @@ -7528,23 +7315,20 @@ func (x *ValidatePurchaseAppleRequest) GetPersist() *wrapperspb.BoolValue { // Apple Subscription validation request type ValidateSubscriptionAppleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Base64 encoded Apple receipt data payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the subscription. - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidateSubscriptionAppleRequest) Reset() { *x = ValidateSubscriptionAppleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[98] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[99] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateSubscriptionAppleRequest) String() string { @@ -7554,8 +7338,8 @@ func (x *ValidateSubscriptionAppleRequest) String() string { func (*ValidateSubscriptionAppleRequest) ProtoMessage() {} func (x *ValidateSubscriptionAppleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[98] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[99] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7567,7 +7351,7 @@ func (x *ValidateSubscriptionAppleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionAppleRequest.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionAppleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{98} + return file_api_proto_rawDescGZIP(), []int{99} } func (x *ValidateSubscriptionAppleRequest) GetReceipt() string { @@ -7586,23 +7370,20 @@ func (x *ValidateSubscriptionAppleRequest) GetPersist() *wrapperspb.BoolValue { // Google IAP Purchase validation request type ValidatePurchaseGoogleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // JSON encoded Google purchase payload. Purchase string `protobuf:"bytes,1,opt,name=purchase,proto3" json:"purchase,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseGoogleRequest) Reset() { *x = ValidatePurchaseGoogleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[99] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseGoogleRequest) String() string { @@ -7612,8 +7393,8 @@ func (x *ValidatePurchaseGoogleRequest) String() string { func (*ValidatePurchaseGoogleRequest) ProtoMessage() {} func (x *ValidatePurchaseGoogleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[99] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[100] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7625,7 +7406,7 @@ func (x *ValidatePurchaseGoogleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseGoogleRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseGoogleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{99} + return file_api_proto_rawDescGZIP(), []int{100} } func (x *ValidatePurchaseGoogleRequest) GetPurchase() string { @@ -7644,23 +7425,20 @@ func (x *ValidatePurchaseGoogleRequest) GetPersist() *wrapperspb.BoolValue { // Google Subscription validation request type ValidateSubscriptionGoogleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // JSON encoded Google purchase payload. Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` // Persist the subscription. - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidateSubscriptionGoogleRequest) Reset() { *x = ValidateSubscriptionGoogleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[100] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateSubscriptionGoogleRequest) String() string { @@ -7670,8 +7448,8 @@ func (x *ValidateSubscriptionGoogleRequest) String() string { func (*ValidateSubscriptionGoogleRequest) ProtoMessage() {} func (x *ValidateSubscriptionGoogleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[100] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[101] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7683,7 +7461,7 @@ func (x *ValidateSubscriptionGoogleRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ValidateSubscriptionGoogleRequest.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionGoogleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{100} + return file_api_proto_rawDescGZIP(), []int{101} } func (x *ValidateSubscriptionGoogleRequest) GetReceipt() string { @@ -7702,25 +7480,22 @@ func (x *ValidateSubscriptionGoogleRequest) GetPersist() *wrapperspb.BoolValue { // Huawei IAP Purchase validation request type ValidatePurchaseHuaweiRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // JSON encoded Huawei InAppPurchaseData. Purchase string `protobuf:"bytes,1,opt,name=purchase,proto3" json:"purchase,omitempty"` // InAppPurchaseData signature. Signature string `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseHuaweiRequest) Reset() { *x = ValidatePurchaseHuaweiRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[101] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseHuaweiRequest) String() string { @@ -7730,8 +7505,8 @@ func (x *ValidatePurchaseHuaweiRequest) String() string { func (*ValidatePurchaseHuaweiRequest) ProtoMessage() {} func (x *ValidatePurchaseHuaweiRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[101] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[102] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7743,7 +7518,7 @@ func (x *ValidatePurchaseHuaweiRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseHuaweiRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseHuaweiRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{101} + return file_api_proto_rawDescGZIP(), []int{102} } func (x *ValidatePurchaseHuaweiRequest) GetPurchase() string { @@ -7769,23 +7544,20 @@ func (x *ValidatePurchaseHuaweiRequest) GetPersist() *wrapperspb.BoolValue { // Facebook Instant IAP Purchase validation request type ValidatePurchaseFacebookInstantRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Base64 encoded Facebook Instant signedRequest receipt data payload. SignedRequest string `protobuf:"bytes,1,opt,name=signed_request,json=signedRequest,proto3" json:"signed_request,omitempty"` // Persist the purchase - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseFacebookInstantRequest) Reset() { *x = ValidatePurchaseFacebookInstantRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[102] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseFacebookInstantRequest) String() string { @@ -7795,8 +7567,8 @@ func (x *ValidatePurchaseFacebookInstantRequest) String() string { func (*ValidatePurchaseFacebookInstantRequest) ProtoMessage() {} func (x *ValidatePurchaseFacebookInstantRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[102] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[103] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7808,7 +7580,7 @@ func (x *ValidatePurchaseFacebookInstantRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use ValidatePurchaseFacebookInstantRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseFacebookInstantRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{102} + return file_api_proto_rawDescGZIP(), []int{103} } func (x *ValidatePurchaseFacebookInstantRequest) GetSignedRequest() string { @@ -7825,15 +7597,274 @@ func (x *ValidatePurchaseFacebookInstantRequest) GetPersist() *wrapperspb.BoolVa return nil } -// Validated Purchase stored by Nakama. -type ValidatedPurchase struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +// Xbox Purchase validation request +type ValidatePurchaseXboxRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProductId string `protobuf:"bytes,1,opt,name=productId,proto3" json:"productId,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + Platform string `protobuf:"bytes,3,opt,name=platform,proto3" json:"platform,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} - // Purchase User ID. - UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - // Purchase Product ID. +func (x *ValidatePurchaseXboxRequest) Reset() { + *x = ValidatePurchaseXboxRequest{} + mi := &file_api_proto_msgTypes[104] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseXboxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseXboxRequest) ProtoMessage() {} + +func (x *ValidatePurchaseXboxRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[104] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseXboxRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseXboxRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{104} +} + +func (x *ValidatePurchaseXboxRequest) GetProductId() string { + if x != nil { + return x.ProductId + } + return "" +} + +func (x *ValidatePurchaseXboxRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + +func (x *ValidatePurchaseXboxRequest) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +// Playstation validation request +type ValidatePurchasePlaystationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + EntitlementLabel string `protobuf:"bytes,1,opt,name=entitlementLabel,proto3" json:"entitlementLabel,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchasePlaystationRequest) Reset() { + *x = ValidatePurchasePlaystationRequest{} + mi := &file_api_proto_msgTypes[105] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchasePlaystationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchasePlaystationRequest) ProtoMessage() {} + +func (x *ValidatePurchasePlaystationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[105] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchasePlaystationRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchasePlaystationRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{105} +} + +func (x *ValidatePurchasePlaystationRequest) GetEntitlementLabel() string { + if x != nil { + return x.EntitlementLabel + } + return "" +} + +func (x *ValidatePurchasePlaystationRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + +type ValidatePurchaseEpicRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + NsCatalogItemId string `protobuf:"bytes,1,opt,name=nsCatalogItemId,proto3" json:"nsCatalogItemId,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchaseEpicRequest) Reset() { + *x = ValidatePurchaseEpicRequest{} + mi := &file_api_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseEpicRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseEpicRequest) ProtoMessage() {} + +func (x *ValidatePurchaseEpicRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[106] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseEpicRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseEpicRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{106} +} + +func (x *ValidatePurchaseEpicRequest) GetNsCatalogItemId() string { + if x != nil { + return x.NsCatalogItemId + } + return "" +} + +func (x *ValidatePurchaseEpicRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + +type ValidatePurchaseSteamRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,1,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchaseSteamRequest) Reset() { + *x = ValidatePurchaseSteamRequest{} + mi := &file_api_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseSteamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseSteamRequest) ProtoMessage() {} + +func (x *ValidatePurchaseSteamRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[107] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseSteamRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseSteamRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{107} +} + +func (x *ValidatePurchaseSteamRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + +type ValidatePurchaseDiscordRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + EntitlementId string `protobuf:"bytes,1,opt,name=entitlementId,proto3" json:"entitlementId,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchaseDiscordRequest) Reset() { + *x = ValidatePurchaseDiscordRequest{} + mi := &file_api_proto_msgTypes[108] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseDiscordRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseDiscordRequest) ProtoMessage() {} + +func (x *ValidatePurchaseDiscordRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[108] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseDiscordRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseDiscordRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{108} +} + +func (x *ValidatePurchaseDiscordRequest) GetEntitlementId() string { + if x != nil { + return x.EntitlementId + } + return "" +} + +func (x *ValidatePurchaseDiscordRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + +// Validated Purchase stored by Nakama. +type ValidatedPurchase struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Purchase User ID. + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // Purchase Product ID. ProductId string `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` // Purchase Transaction ID. TransactionId string `protobuf:"bytes,3,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` @@ -7852,16 +7883,16 @@ type ValidatedPurchase struct { // Whether the purchase was done in production or sandbox environment. Environment StoreEnvironment `protobuf:"varint,10,opt,name=environment,proto3,enum=nakama.api.StoreEnvironment" json:"environment,omitempty"` // Whether the purchase had already been validated by Nakama before. - SeenBefore bool `protobuf:"varint,11,opt,name=seen_before,json=seenBefore,proto3" json:"seen_before,omitempty"` + SeenBefore bool `protobuf:"varint,11,opt,name=seen_before,json=seenBefore,proto3" json:"seen_before,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatedPurchase) Reset() { *x = ValidatedPurchase{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[103] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[109] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatedPurchase) String() string { @@ -7871,8 +7902,8 @@ func (x *ValidatedPurchase) String() string { func (*ValidatedPurchase) ProtoMessage() {} func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[103] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[109] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7884,7 +7915,7 @@ func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedPurchase.ProtoReflect.Descriptor instead. func (*ValidatedPurchase) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{103} + return file_api_proto_rawDescGZIP(), []int{109} } func (x *ValidatedPurchase) GetUserId() string { @@ -7966,21 +7997,18 @@ func (x *ValidatedPurchase) GetSeenBefore() bool { // Validate IAP response. type ValidatePurchaseResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Newly seen validated purchases. ValidatedPurchases []*ValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatePurchaseResponse) Reset() { *x = ValidatePurchaseResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[104] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatePurchaseResponse) String() string { @@ -7990,8 +8018,8 @@ func (x *ValidatePurchaseResponse) String() string { func (*ValidatePurchaseResponse) ProtoMessage() {} func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[104] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[110] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8003,7 +8031,7 @@ func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseResponse.ProtoReflect.Descriptor instead. func (*ValidatePurchaseResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{104} + return file_api_proto_rawDescGZIP(), []int{110} } func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase { @@ -8015,20 +8043,17 @@ func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase // Validate Subscription response. type ValidateSubscriptionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ValidatedSubscription *ValidatedSubscription `protobuf:"bytes,1,opt,name=validated_subscription,json=validatedSubscription,proto3" json:"validated_subscription,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidateSubscriptionResponse) Reset() { *x = ValidateSubscriptionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[105] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateSubscriptionResponse) String() string { @@ -8038,8 +8063,8 @@ func (x *ValidateSubscriptionResponse) String() string { func (*ValidateSubscriptionResponse) ProtoMessage() {} func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[105] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[111] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8051,7 +8076,7 @@ func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{105} + return file_api_proto_rawDescGZIP(), []int{111} } func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubscription { @@ -8062,10 +8087,7 @@ func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubs } type ValidatedSubscription struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Subscription User ID. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Purchase Product ID. @@ -8091,16 +8113,16 @@ type ValidatedSubscription struct { // Raw provider notification body. ProviderNotification string `protobuf:"bytes,12,opt,name=provider_notification,json=providerNotification,proto3" json:"provider_notification,omitempty"` // Whether the subscription is currently active or not. - Active bool `protobuf:"varint,13,opt,name=active,proto3" json:"active,omitempty"` + Active bool `protobuf:"varint,13,opt,name=active,proto3" json:"active,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValidatedSubscription) Reset() { *x = ValidatedSubscription{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[106] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidatedSubscription) String() string { @@ -8110,8 +8132,8 @@ func (x *ValidatedSubscription) String() string { func (*ValidatedSubscription) ProtoMessage() {} func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[106] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[112] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8123,7 +8145,7 @@ func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedSubscription.ProtoReflect.Descriptor instead. func (*ValidatedSubscription) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{106} + return file_api_proto_rawDescGZIP(), []int{112} } func (x *ValidatedSubscription) GetUserId() string { @@ -8219,25 +8241,22 @@ func (x *ValidatedSubscription) GetActive() bool { // A list of validated purchases stored by Nakama. type PurchaseList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Stored validated purchases. ValidatedPurchases []*ValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` // The cursor to send when retrieving the next page, if any. Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` // The cursor to send when retrieving the previous page, if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PurchaseList) Reset() { *x = PurchaseList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[107] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[113] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PurchaseList) String() string { @@ -8247,8 +8266,8 @@ func (x *PurchaseList) String() string { func (*PurchaseList) ProtoMessage() {} func (x *PurchaseList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[107] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[113] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8260,7 +8279,7 @@ func (x *PurchaseList) ProtoReflect() protoreflect.Message { // Deprecated: Use PurchaseList.ProtoReflect.Descriptor instead. func (*PurchaseList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{107} + return file_api_proto_rawDescGZIP(), []int{113} } func (x *PurchaseList) GetValidatedPurchases() []*ValidatedPurchase { @@ -8286,25 +8305,22 @@ func (x *PurchaseList) GetPrevCursor() string { // A list of validated subscriptions stored by Nakama. type SubscriptionList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Stored validated subscriptions. ValidatedSubscriptions []*ValidatedSubscription `protobuf:"bytes,1,rep,name=validated_subscriptions,json=validatedSubscriptions,proto3" json:"validated_subscriptions,omitempty"` // The cursor to send when retrieving the next page, if any. Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` // The cursor to send when retrieving the previous page, if any. - PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + PrevCursor string `protobuf:"bytes,3,opt,name=prev_cursor,json=prevCursor,proto3" json:"prev_cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[108] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[114] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscriptionList) String() string { @@ -8314,8 +8330,8 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[108] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[114] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8327,7 +8343,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{108} + return file_api_proto_rawDescGZIP(), []int{114} } func (x *SubscriptionList) GetValidatedSubscriptions() []*ValidatedSubscription { @@ -8353,23 +8369,20 @@ func (x *SubscriptionList) GetPrevCursor() string { // A request to submit a score to a leaderboard. type WriteLeaderboardRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the leaderboard to write to. LeaderboardId string `protobuf:"bytes,1,opt,name=leaderboard_id,json=leaderboardId,proto3" json:"leaderboard_id,omitempty"` // Record input. - Record *WriteLeaderboardRecordRequest_LeaderboardRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + Record *WriteLeaderboardRecordRequest_LeaderboardRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteLeaderboardRecordRequest) Reset() { *x = WriteLeaderboardRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[109] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[115] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteLeaderboardRecordRequest) String() string { @@ -8379,8 +8392,8 @@ func (x *WriteLeaderboardRecordRequest) String() string { func (*WriteLeaderboardRecordRequest) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[109] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[115] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8392,7 +8405,7 @@ func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteLeaderboardRecordRequest.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{109} + return file_api_proto_rawDescGZIP(), []int{115} } func (x *WriteLeaderboardRecordRequest) GetLeaderboardId() string { @@ -8411,10 +8424,7 @@ func (x *WriteLeaderboardRecordRequest) GetRecord() *WriteLeaderboardRecordReque // The object to store. type WriteStorageObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The collection to store the object. Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` // The key for the object within the collection. @@ -8427,15 +8437,15 @@ type WriteStorageObject struct { PermissionRead *wrapperspb.Int32Value `protobuf:"bytes,5,opt,name=permission_read,json=permissionRead,proto3" json:"permission_read,omitempty"` // The write access permissions for the object. PermissionWrite *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=permission_write,json=permissionWrite,proto3" json:"permission_write,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteStorageObject) Reset() { *x = WriteStorageObject{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[110] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[116] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteStorageObject) String() string { @@ -8445,8 +8455,8 @@ func (x *WriteStorageObject) String() string { func (*WriteStorageObject) ProtoMessage() {} func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[110] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[116] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8458,7 +8468,7 @@ func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObject.ProtoReflect.Descriptor instead. func (*WriteStorageObject) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{110} + return file_api_proto_rawDescGZIP(), []int{116} } func (x *WriteStorageObject) GetCollection() string { @@ -8505,21 +8515,18 @@ func (x *WriteStorageObject) GetPermissionWrite() *wrapperspb.Int32Value { // Write objects to the storage engine. type WriteStorageObjectsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The objects to store on the server. - Objects []*WriteStorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + Objects []*WriteStorageObject `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteStorageObjectsRequest) Reset() { *x = WriteStorageObjectsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[111] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[117] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteStorageObjectsRequest) String() string { @@ -8529,8 +8536,8 @@ func (x *WriteStorageObjectsRequest) String() string { func (*WriteStorageObjectsRequest) ProtoMessage() {} func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[111] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[117] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8542,7 +8549,7 @@ func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObjectsRequest.ProtoReflect.Descriptor instead. func (*WriteStorageObjectsRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{111} + return file_api_proto_rawDescGZIP(), []int{117} } func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { @@ -8554,23 +8561,20 @@ func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { // A request to submit a score to a tournament. type WriteTournamentRecordRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The tournament ID to write the record for. TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` // Record input. - Record *WriteTournamentRecordRequest_TournamentRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + Record *WriteTournamentRecordRequest_TournamentRecordWrite `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteTournamentRecordRequest) Reset() { *x = WriteTournamentRecordRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[112] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[118] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteTournamentRecordRequest) String() string { @@ -8580,8 +8584,8 @@ func (x *WriteTournamentRecordRequest) String() string { func (*WriteTournamentRecordRequest) ProtoMessage() {} func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[112] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[118] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8593,7 +8597,7 @@ func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteTournamentRecordRequest.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{112} + return file_api_proto_rawDescGZIP(), []int{118} } func (x *WriteTournamentRecordRequest) GetTournamentId() string { @@ -8612,23 +8616,20 @@ func (x *WriteTournamentRecordRequest) GetRecord() *WriteTournamentRecordRequest // A friend of a friend. type FriendsOfFriendsList_FriendOfFriend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user who referred its friend. Referrer string `protobuf:"bytes,1,opt,name=referrer,proto3" json:"referrer,omitempty"` // User. - User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FriendsOfFriendsList_FriendOfFriend) Reset() { *x = FriendsOfFriendsList_FriendOfFriend{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[125] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[131] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FriendsOfFriendsList_FriendOfFriend) String() string { @@ -8638,8 +8639,8 @@ func (x *FriendsOfFriendsList_FriendOfFriend) String() string { func (*FriendsOfFriendsList_FriendOfFriend) ProtoMessage() {} func (x *FriendsOfFriendsList_FriendOfFriend) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[125] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[131] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8670,23 +8671,20 @@ func (x *FriendsOfFriendsList_FriendOfFriend) GetUser() *User { // A single user-role pair. type GroupUserList_GroupUser struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User. User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // Their relationship to the group. - State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupUserList_GroupUser) Reset() { *x = GroupUserList_GroupUser{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[126] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[132] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GroupUserList_GroupUser) String() string { @@ -8696,8 +8694,8 @@ func (x *GroupUserList_GroupUser) String() string { func (*GroupUserList_GroupUser) ProtoMessage() {} func (x *GroupUserList_GroupUser) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[126] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[132] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8728,23 +8726,20 @@ func (x *GroupUserList_GroupUser) GetState() *wrapperspb.Int32Value { // A single group-role pair. type UserGroupList_UserGroup struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Group. Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` // The user's relationship to the group. - State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + State *wrapperspb.Int32Value `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserGroupList_UserGroup) Reset() { *x = UserGroupList_UserGroup{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[127] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserGroupList_UserGroup) String() string { @@ -8754,8 +8749,8 @@ func (x *UserGroupList_UserGroup) String() string { func (*UserGroupList_UserGroup) ProtoMessage() {} func (x *UserGroupList_UserGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[127] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[133] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8786,10 +8781,7 @@ func (x *UserGroupList_UserGroup) GetState() *wrapperspb.Int32Value { // Record values to write. type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The score value to submit. Score int64 `protobuf:"varint,1,opt,name=score,proto3" json:"score,omitempty"` // An optional secondary value. @@ -8797,16 +8789,16 @@ type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { // Optional record metadata. Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` // Operator override. - Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Reset() { *x = WriteLeaderboardRecordRequest_LeaderboardRecordWrite{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[128] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[134] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { @@ -8816,8 +8808,8 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[128] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[134] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8829,7 +8821,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() pr // Deprecated: Use WriteLeaderboardRecordRequest_LeaderboardRecordWrite.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{109, 0} + return file_api_proto_rawDescGZIP(), []int{115, 0} } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetScore() int64 { @@ -8862,10 +8854,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetOperator() Ope // Record values to write. type WriteTournamentRecordRequest_TournamentRecordWrite struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The score value to submit. Score int64 `protobuf:"varint,1,opt,name=score,proto3" json:"score,omitempty"` // An optional secondary value. @@ -8873,16 +8862,16 @@ type WriteTournamentRecordRequest_TournamentRecordWrite struct { // A JSON object of additional properties (optional). Metadata string `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` // Operator override. - Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + Operator Operator `protobuf:"varint,4,opt,name=operator,proto3,enum=nakama.api.Operator" json:"operator,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) Reset() { *x = WriteTournamentRecordRequest_TournamentRecordWrite{} - if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[129] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_api_proto_msgTypes[135] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { @@ -8892,8 +8881,8 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { func (*WriteTournamentRecordRequest_TournamentRecordWrite) ProtoMessage() {} func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[129] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_api_proto_msgTypes[135] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8905,7 +8894,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() prot // Deprecated: Use WriteTournamentRecordRequest_TournamentRecordWrite.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest_TournamentRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{112, 0} + return file_api_proto_rawDescGZIP(), []int{118, 0} } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetScore() int64 { @@ -8938,1364 +8927,762 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetOperator() Opera var File_api_proto protoreflect.FileDescriptor -var file_api_proto_rawDesc = []byte{ - 0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x02, 0x0a, 0x07, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x0a, - 0x09, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x99, 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, - 0x70, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, - 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x91, 0x01, 0x0a, 0x0d, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x37, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x91, - 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x37, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xb1, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x39, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x2e, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x1a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, - 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x44, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xc8, 0x02, 0x0a, 0x11, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, - 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, - 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x61, 0x6c, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x24, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x3b, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x97, 0x01, 0x0a, 0x0d, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x74, 0x65, 0x61, 0x6d, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5f, 0x0a, - 0x11, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4c, - 0x0a, 0x14, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xa7, 0x01, 0x0a, - 0x15, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x14, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, - 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, - 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa0, 0x01, - 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x1b, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xba, 0x01, 0x0a, 0x26, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x1d, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x47, 0x61, 0x6d, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x61, 0x6d, - 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, - 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0xce, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, - 0x73, 0x79, 0x6e, 0x63, 0x22, 0x4c, 0x0a, 0x14, 0x42, 0x61, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x73, 0x22, 0x45, 0x0a, 0x13, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x80, 0x04, 0x0a, 0x0e, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, - 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, 0xb9, 0x01, 0x0a, - 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, - 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x29, 0x0a, - 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xb5, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, - 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, - 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, - 0x70, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x46, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, - 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x1e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, - 0x64, 0x73, 0x22, 0x44, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, - 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x52, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x73, 0x22, 0xf3, - 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x82, 0x02, 0x0a, 0x06, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, - 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x46, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x52, - 0x49, 0x45, 0x4e, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x56, 0x49, 0x54, 0x45, - 0x5f, 0x53, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x56, 0x49, 0x54, - 0x45, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, - 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x03, 0x22, 0x52, 0x0a, 0x0a, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x07, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe1, 0x01, - 0x0a, 0x14, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x12, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x52, 0x10, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x4f, 0x66, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x1a, 0x52, 0x0a, - 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x22, 0x64, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x63, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x37, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, - 0x22, 0xa8, 0x03, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, - 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x64, 0x67, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x09, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x96, 0x02, 0x0a, 0x0d, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, - 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x1a, 0xa6, 0x01, 0x0a, 0x09, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, - 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x22, 0x40, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, - 0x55, 0x50, 0x45, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, - 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, - 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, - 0x53, 0x54, 0x10, 0x03, 0x22, 0x87, 0x01, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, - 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x81, - 0x01, 0x0a, 0x19, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x46, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x22, 0x2d, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x64, 0x22, 0x3c, 0x0a, 0x15, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, - 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, - 0x4d, 0x0a, 0x15, 0x4b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xab, - 0x02, 0x0a, 0x0b, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, - 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x66, 0x0a, 0x0f, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x3b, 0x0a, 0x0c, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x0c, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe9, 0x03, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x22, 0x0a, 0x0d, - 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x22, 0xf5, 0x01, 0x0a, 0x15, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, - 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, - 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, - 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, - 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2e, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x6e, 0x6b, - 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x35, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0x76, 0x0a, 0x10, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x53, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, - 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, - 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xbc, - 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x34, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x92, 0x01, - 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x22, 0x68, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x73, 0x4f, 0x66, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xf4, 0x01, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x31, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x35, 0x0a, 0x07, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6f, - 0x70, 0x65, 0x6e, 0x22, 0xb0, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x41, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, - 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, - 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xe3, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x31, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x22, 0xe1, 0x02, 0x0a, - 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x08, - 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x69, 0x6e, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x32, 0x0a, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x22, 0x78, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x29, 0x0a, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x19, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x65, 0x0a, 0x18, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x22, 0xea, 0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x41, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x22, 0xe0, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x33, - 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x79, 0x22, 0xdf, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, - 0x0a, 0x0e, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x3f, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, - 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x45, 0x6e, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x37, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xae, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xd0, 0x01, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, - 0x6b, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x69, - 0x63, 0x6b, 0x52, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, - 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, - 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, - 0xd4, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x69, 0x63, 0x6b, 0x65, - 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x19, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, - 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x16, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x54, 0x69, 0x63, - 0x6b, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, - 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x0c, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x10, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, - 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, - 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x50, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6d, - 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x4f, 0x0a, 0x17, 0x44, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x60, 0x0a, 0x13, 0x52, - 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x5b, 0x0a, - 0x19, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x61, 0x64, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x52, - 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x73, 0x22, 0x4a, 0x0a, 0x03, 0x52, 0x70, - 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x68, - 0x74, 0x74, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, - 0x74, 0x74, 0x70, 0x4b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x12, 0x29, 0x0a, 0x10, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0xf1, 0x01, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x61, 0x63, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x52, 0x04, 0x61, 0x63, 0x6b, 0x73, 0x22, 0x45, 0x0a, 0x0e, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x33, - 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x22, 0x60, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbe, 0x05, 0x0a, 0x0a, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6f, - 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6d, - 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, - 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, - 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, - 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x6e, 0x64, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x65, 0x76, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x30, - 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x62, 0x0a, 0x0e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xf4, 0x01, 0x0a, 0x14, 0x54, - 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x42, 0x0a, 0x0d, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x52, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xfb, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, - 0x72, 0x6c, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x38, 0x0a, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x22, - 0xc7, 0x02, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x3b, 0x0a, 0x0a, - 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, - 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x04, 0x6f, 0x70, 0x65, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, - 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6c, 0x61, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, - 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, - 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6f, - 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x64, 0x67, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x37, - 0x0a, 0x18, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x74, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x6c, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6c, 0x65, - 0x49, 0x64, 0x22, 0x99, 0x02, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0a, - 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x1a, 0xa9, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x12, 0x27, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x40, 0x0a, 0x05, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x50, 0x45, 0x52, 0x41, 0x44, - 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, - 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x03, 0x22, 0x2f, - 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, - 0x6e, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, - 0x61, 0x73, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, - 0x72, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, - 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x73, 0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x1d, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x48, 0x75, 0x61, 0x77, 0x65, 0x69, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, - 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x85, 0x01, - 0x0a, 0x26, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, - 0x73, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0xa9, 0x04, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, - 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x42, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x22, 0x6a, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, - 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, - 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x72, 0x63, 0x68, - 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x22, 0x78, 0x0a, - 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, - 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x05, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, - 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, - 0x66, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, - 0x75, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x22, 0x97, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, - 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, - 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xa7, 0x01, 0x0a, 0x10, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x5a, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbb, 0x02, 0x0a, 0x1d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x58, - 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x98, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x22, 0x84, 0x02, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0f, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x64, 0x12, 0x46, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x56, 0x0a, 0x1a, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x1c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x56, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x1a, 0x97, 0x01, 0x0a, 0x15, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2a, 0x6f, 0x0a, 0x0d, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x13, 0x0a, 0x0f, 0x41, - 0x50, 0x50, 0x4c, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x00, - 0x12, 0x15, 0x0a, 0x11, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x5f, - 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x55, 0x41, 0x57, 0x45, - 0x49, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x47, 0x41, 0x4c, 0x4c, 0x45, 0x52, 0x59, 0x10, 0x02, 0x12, - 0x1a, 0x0a, 0x16, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x5f, 0x49, 0x4e, 0x53, 0x54, - 0x41, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x3c, 0x0a, 0x10, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x52, 0x4f, - 0x44, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x2a, 0x4c, 0x0a, 0x08, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x4f, 0x56, 0x45, 0x52, - 0x52, 0x49, 0x44, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x45, 0x53, 0x54, 0x10, 0x01, - 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x43, - 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x43, 0x52, - 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x42, 0x63, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x68, - 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x42, 0x09, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x41, 0x70, 0x69, 0x50, - 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, - 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0f, 0x4e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} +const file_api_proto_rawDesc = "" + + "\n" + + "\tapi.proto\x12\n" + + "nakama.api\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xab\x02\n" + + "\aAccount\x12$\n" + + "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x12\x16\n" + + "\x06wallet\x18\x02 \x01(\tR\x06wallet\x12\x14\n" + + "\x05email\x18\x03 \x01(\tR\x05email\x123\n" + + "\adevices\x18\x04 \x03(\v2\x19.nakama.api.AccountDeviceR\adevices\x12\x1b\n" + + "\tcustom_id\x18\x05 \x01(\tR\bcustomId\x12;\n" + + "\vverify_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "verifyTime\x12=\n" + + "\fdisable_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\vdisableTime\"\x99\x01\n" + + "\x0eAccountRefresh\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x128\n" + + "\x04vars\x18\x02 \x03(\v2$.nakama.api.AccountRefresh.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x95\x01\n" + + "\fAccountApple\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x126\n" + + "\x04vars\x18\x02 \x03(\v2\".nakama.api.AccountApple.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x91\x01\n" + + "\rAccountCustom\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x127\n" + + "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountCustom.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x91\x01\n" + + "\rAccountDevice\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x127\n" + + "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountDevice.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb1\x01\n" + + "\fAccountEmail\x12\x14\n" + + "\x05email\x18\x01 \x01(\tR\x05email\x12\x1a\n" + + "\bpassword\x18\x02 \x01(\tR\bpassword\x126\n" + + "\x04vars\x18\x03 \x03(\v2\".nakama.api.AccountEmail.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x9b\x01\n" + + "\x0fAccountFacebook\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x129\n" + + "\x04vars\x18\x02 \x03(\v2%.nakama.api.AccountFacebook.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc9\x01\n" + + "\x1aAccountFacebookInstantGame\x12,\n" + + "\x12signed_player_info\x18\x01 \x01(\tR\x10signedPlayerInfo\x12D\n" + + "\x04vars\x18\x02 \x03(\v20.nakama.api.AccountFacebookInstantGame.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc8\x02\n" + + "\x11AccountGameCenter\x12\x1b\n" + + "\tplayer_id\x18\x01 \x01(\tR\bplayerId\x12\x1b\n" + + "\tbundle_id\x18\x02 \x01(\tR\bbundleId\x12+\n" + + "\x11timestamp_seconds\x18\x03 \x01(\x03R\x10timestampSeconds\x12\x12\n" + + "\x04salt\x18\x04 \x01(\tR\x04salt\x12\x1c\n" + + "\tsignature\x18\x05 \x01(\tR\tsignature\x12$\n" + + "\x0epublic_key_url\x18\x06 \x01(\tR\fpublicKeyUrl\x12;\n" + + "\x04vars\x18\a \x03(\v2'.nakama.api.AccountGameCenter.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x97\x01\n" + + "\rAccountGoogle\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x127\n" + + "\x04vars\x18\x02 \x03(\v2#.nakama.api.AccountGoogle.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x95\x01\n" + + "\fAccountSteam\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x126\n" + + "\x04vars\x18\x02 \x03(\v2\".nakama.api.AccountSteam.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"_\n" + + "\x11AddFriendsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\x12\x1a\n" + + "\bmetadata\x18\x03 \x01(\tR\bmetadata\"L\n" + + "\x14AddGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"\xa7\x01\n" + + "\x15SessionRefreshRequest\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x12?\n" + + "\x04vars\x18\x02 \x03(\v2+.nakama.api.SessionRefreshRequest.VarsEntryR\x04vars\x1a7\n" + + "\tVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"Q\n" + + "\x14SessionLogoutRequest\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x12#\n" + + "\rrefresh_token\x18\x02 \x01(\tR\frefreshToken\"\x9e\x01\n" + + "\x18AuthenticateAppleRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountAppleR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + + "\x19AuthenticateCustomRequest\x123\n" + + "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountCustomR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + + "\x19AuthenticateDeviceRequest\x123\n" + + "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountDeviceR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\x9e\x01\n" + + "\x18AuthenticateEmailRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountEmailR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xd4\x01\n" + + "\x1bAuthenticateFacebookRequest\x125\n" + + "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\x12.\n" + + "\x04sync\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"\xba\x01\n" + + "&AuthenticateFacebookInstantGameRequest\x12@\n" + + "\aaccount\x18\x01 \x01(\v2&.nakama.api.AccountFacebookInstantGameR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa8\x01\n" + + "\x1dAuthenticateGameCenterRequest\x127\n" + + "\aaccount\x18\x01 \x01(\v2\x1d.nakama.api.AccountGameCenterR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xa0\x01\n" + + "\x19AuthenticateGoogleRequest\x123\n" + + "\aaccount\x18\x01 \x01(\v2\x19.nakama.api.AccountGoogleR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\"\xce\x01\n" + + "\x18AuthenticateSteamRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x122\n" + + "\x06create\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x06create\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\x12.\n" + + "\x04sync\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"L\n" + + "\x14BanGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"E\n" + + "\x13BlockFriendsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\"\x80\x04\n" + + "\x0eChannelMessage\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\x12/\n" + + "\x04code\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x04code\x12\x1b\n" + + "\tsender_id\x18\x04 \x01(\tR\bsenderId\x12\x1a\n" + + "\busername\x18\x05 \x01(\tR\busername\x12\x18\n" + + "\acontent\x18\x06 \x01(\tR\acontent\x12;\n" + + "\vcreate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12:\n" + + "\n" + + "persistent\x18\t \x01(\v2\x1a.google.protobuf.BoolValueR\n" + + "persistent\x12\x1b\n" + + "\troom_name\x18\n" + + " \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\v \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\f \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\r \x01(\tR\tuserIdTwo\"\xb9\x01\n" + + "\x12ChannelMessageList\x126\n" + + "\bmessages\x18\x01 \x03(\v2\x1a.nakama.api.ChannelMessageR\bmessages\x12\x1f\n" + + "\vnext_cursor\x18\x02 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\x12)\n" + + "\x10cacheable_cursor\x18\x04 \x01(\tR\x0fcacheableCursor\"\xb5\x01\n" + + "\x12CreateGroupRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12 \n" + + "\vdescription\x18\x02 \x01(\tR\vdescription\x12\x19\n" + + "\blang_tag\x18\x03 \x01(\tR\alangTag\x12\x1d\n" + + "\n" + + "avatar_url\x18\x04 \x01(\tR\tavatarUrl\x12\x12\n" + + "\x04open\x18\x05 \x01(\bR\x04open\x12\x1b\n" + + "\tmax_count\x18\x06 \x01(\x05R\bmaxCount\"F\n" + + "\x14DeleteFriendsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\"/\n" + + "\x12DeleteGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\"G\n" + + "\x1eDeleteLeaderboardRecordRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\".\n" + + "\x1aDeleteNotificationsRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\"D\n" + + "\x1dDeleteTournamentRecordRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\"c\n" + + "\x15DeleteStorageObjectId\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x18\n" + + "\aversion\x18\x03 \x01(\tR\aversion\"_\n" + + "\x1bDeleteStorageObjectsRequest\x12@\n" + + "\n" + + "object_ids\x18\x01 \x03(\v2!.nakama.api.DeleteStorageObjectIdR\tobjectIds\"\xf3\x01\n" + + "\x05Event\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12A\n" + + "\n" + + "properties\x18\x02 \x03(\v2!.nakama.api.Event.PropertiesEntryR\n" + + "properties\x128\n" + + "\ttimestamp\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12\x1a\n" + + "\bexternal\x18\x04 \x01(\bR\bexternal\x1a=\n" + + "\x0fPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x82\x02\n" + + "\x06Friend\x12$\n" + + "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12;\n" + + "\vupdate_time\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12\x1a\n" + + "\bmetadata\x18\x04 \x01(\tR\bmetadata\"F\n" + + "\x05State\x12\n" + + "\n" + + "\x06FRIEND\x10\x00\x12\x0f\n" + + "\vINVITE_SENT\x10\x01\x12\x13\n" + + "\x0fINVITE_RECEIVED\x10\x02\x12\v\n" + + "\aBLOCKED\x10\x03\"R\n" + + "\n" + + "FriendList\x12,\n" + + "\afriends\x18\x01 \x03(\v2\x12.nakama.api.FriendR\afriends\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xe1\x01\n" + + "\x14FriendsOfFriendsList\x12]\n" + + "\x12friends_of_friends\x18\x01 \x03(\v2/.nakama.api.FriendsOfFriendsList.FriendOfFriendR\x10friendsOfFriends\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1aR\n" + + "\x0eFriendOfFriend\x12\x1a\n" + + "\breferrer\x18\x01 \x01(\tR\breferrer\x12$\n" + + "\x04user\x18\x02 \x01(\v2\x10.nakama.api.UserR\x04user\"d\n" + + "\x0fGetUsersRequest\x12\x10\n" + + "\x03ids\x18\x01 \x03(\tR\x03ids\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\x12!\n" + + "\ffacebook_ids\x18\x03 \x03(\tR\vfacebookIds\"7\n" + + "\x16GetSubscriptionRequest\x12\x1d\n" + + "\n" + + "product_id\x18\x01 \x01(\tR\tproductId\"\xa8\x03\n" + + "\x05Group\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "creator_id\x18\x02 \x01(\tR\tcreatorId\x12\x12\n" + + "\x04name\x18\x03 \x01(\tR\x04name\x12 \n" + + "\vdescription\x18\x04 \x01(\tR\vdescription\x12\x19\n" + + "\blang_tag\x18\x05 \x01(\tR\alangTag\x12\x1a\n" + + "\bmetadata\x18\x06 \x01(\tR\bmetadata\x12\x1d\n" + + "\n" + + "avatar_url\x18\a \x01(\tR\tavatarUrl\x12.\n" + + "\x04open\x18\b \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\x12\x1d\n" + + "\n" + + "edge_count\x18\t \x01(\x05R\tedgeCount\x12\x1b\n" + + "\tmax_count\x18\n" + + " \x01(\x05R\bmaxCount\x12;\n" + + "\vcreate_time\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\"N\n" + + "\tGroupList\x12)\n" + + "\x06groups\x18\x01 \x03(\v2\x11.nakama.api.GroupR\x06groups\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\x96\x02\n" + + "\rGroupUserList\x12D\n" + + "\vgroup_users\x18\x01 \x03(\v2#.nakama.api.GroupUserList.GroupUserR\n" + + "groupUsers\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1a\xa6\x01\n" + + "\tGroupUser\x12$\n" + + "\x04user\x18\x01 \x01(\v2\x10.nakama.api.UserR\x04user\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\"@\n" + + "\x05State\x12\x0e\n" + + "\n" + + "SUPERADMIN\x10\x00\x12\t\n" + + "\x05ADMIN\x10\x01\x12\n" + + "\n" + + "\x06MEMBER\x10\x02\x12\x10\n" + + "\fJOIN_REQUEST\x10\x03\"\x87\x01\n" + + "\x1cImportFacebookFriendsRequest\x125\n" + + "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x120\n" + + "\x05reset\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x05reset\"\x81\x01\n" + + "\x19ImportSteamFriendsRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x120\n" + + "\x05reset\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x05reset\"-\n" + + "\x10JoinGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\"<\n" + + "\x15JoinTournamentRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\"M\n" + + "\x15KickGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"\xab\x02\n" + + "\vLeaderboard\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "sort_order\x18\x02 \x01(\rR\tsortOrder\x120\n" + + "\boperator\x18\x03 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\x12\x1d\n" + + "\n" + + "prev_reset\x18\x04 \x01(\rR\tprevReset\x12\x1d\n" + + "\n" + + "next_reset\x18\x05 \x01(\rR\tnextReset\x12\x1a\n" + + "\bmetadata\x18\x06 \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12$\n" + + "\rauthoritative\x18\b \x01(\bR\rauthoritative\"f\n" + + "\x0fLeaderboardList\x12;\n" + + "\fleaderboards\x18\x01 \x03(\v2\x17.nakama.api.LeaderboardR\fleaderboards\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xe9\x03\n" + + "\x11LeaderboardRecord\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12\x19\n" + + "\bowner_id\x18\x02 \x01(\tR\aownerId\x128\n" + + "\busername\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\busername\x12\x14\n" + + "\x05score\x18\x04 \x01(\x03R\x05score\x12\x1a\n" + + "\bsubscore\x18\x05 \x01(\x03R\bsubscore\x12\x1b\n" + + "\tnum_score\x18\x06 \x01(\x05R\bnumScore\x12\x1a\n" + + "\bmetadata\x18\a \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12;\n" + + "\vexpiry_time\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "expiryTime\x12\x12\n" + + "\x04rank\x18\v \x01(\x03R\x04rank\x12\"\n" + + "\rmax_num_score\x18\f \x01(\rR\vmaxNumScore\"\xf5\x01\n" + + "\x15LeaderboardRecordList\x127\n" + + "\arecords\x18\x01 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\arecords\x12B\n" + + "\rowner_records\x18\x02 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\fownerRecords\x12\x1f\n" + + "\vnext_cursor\x18\x03 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x04 \x01(\tR\n" + + "prevCursor\x12\x1d\n" + + "\n" + + "rank_count\x18\x05 \x01(\x03R\trankCount\".\n" + + "\x11LeaveGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\"|\n" + + "\x13LinkFacebookRequest\x125\n" + + "\aaccount\x18\x01 \x01(\v2\x1b.nakama.api.AccountFacebookR\aaccount\x12.\n" + + "\x04sync\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"v\n" + + "\x10LinkSteamRequest\x122\n" + + "\aaccount\x18\x01 \x01(\v2\x18.nakama.api.AccountSteamR\aaccount\x12.\n" + + "\x04sync\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\x04sync\"\xbc\x01\n" + + "\x1aListChannelMessagesRequest\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x121\n" + + "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x124\n" + + "\aforward\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\aforward\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\x92\x01\n" + + "\x12ListFriendsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + + "\x06cursor\x18\x03 \x01(\tR\x06cursor\"h\n" + + "\x1bListFriendsOfFriendsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xf4\x01\n" + + "\x11ListGroupsRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x19\n" + + "\blang_tag\x18\x04 \x01(\tR\alangTag\x125\n" + + "\amembers\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\amembers\x12.\n" + + "\x04open\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\"\xb0\x01\n" + + "\x15ListGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x121\n" + + "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + + "\x05state\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\xed\x01\n" + + "(ListLeaderboardRecordsAroundOwnerRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x122\n" + + "\x05limit\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\x05limit\x12\x19\n" + + "\bowner_id\x18\x03 \x01(\tR\aownerId\x123\n" + + "\x06expiry\x18\x04 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\x12\x16\n" + + "\x06cursor\x18\x05 \x01(\tR\x06cursor\"\xe3\x01\n" + + "\x1dListLeaderboardRecordsRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12\x1b\n" + + "\towner_ids\x18\x02 \x03(\tR\bownerIds\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\x123\n" + + "\x06expiry\x18\x05 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\"\xe1\x02\n" + + "\x12ListMatchesRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12@\n" + + "\rauthoritative\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\rauthoritative\x122\n" + + "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x126\n" + + "\bmin_size\x18\x04 \x01(\v2\x1b.google.protobuf.Int32ValueR\aminSize\x126\n" + + "\bmax_size\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\amaxSize\x122\n" + + "\x05query\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\x05query\"x\n" + + "\x18ListNotificationsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12)\n" + + "\x10cacheable_cursor\x18\x02 \x01(\tR\x0fcacheableCursor\"\x9f\x01\n" + + "\x19ListStorageObjectsRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1e\n" + + "\n" + + "collection\x18\x02 \x01(\tR\n" + + "collection\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"e\n" + + "\x18ListSubscriptionsRequest\x121\n" + + "\x05limit\x18\x01 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xea\x01\n" + + "'ListTournamentRecordsAroundOwnerRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x122\n" + + "\x05limit\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\x05limit\x12\x19\n" + + "\bowner_id\x18\x03 \x01(\tR\aownerId\x123\n" + + "\x06expiry\x18\x04 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\x12\x16\n" + + "\x06cursor\x18\x05 \x01(\tR\x06cursor\"\xe0\x01\n" + + "\x1cListTournamentRecordsRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x12\x1b\n" + + "\towner_ids\x18\x02 \x03(\tR\bownerIds\x121\n" + + "\x05limit\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\x123\n" + + "\x06expiry\x18\x05 \x01(\v2\x1b.google.protobuf.Int64ValueR\x06expiry\"\xdf\x02\n" + + "\x16ListTournamentsRequest\x12C\n" + + "\x0ecategory_start\x18\x01 \x01(\v2\x1c.google.protobuf.UInt32ValueR\rcategoryStart\x12?\n" + + "\fcategory_end\x18\x02 \x01(\v2\x1c.google.protobuf.UInt32ValueR\vcategoryEnd\x12;\n" + + "\n" + + "start_time\x18\x03 \x01(\v2\x1c.google.protobuf.UInt32ValueR\tstartTime\x127\n" + + "\bend_time\x18\x04 \x01(\v2\x1c.google.protobuf.UInt32ValueR\aendTime\x121\n" + + "\x05limit\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x12\x16\n" + + "\x06cursor\x18\b \x01(\tR\x06cursor\"\xae\x01\n" + + "\x15ListUserGroupsRequest\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x121\n" + + "\x05limit\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05limit\x121\n" + + "\x05state\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\x12\x16\n" + + "\x06cursor\x18\x04 \x01(\tR\x06cursor\"\xd0\x01\n" + + "\x05Match\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12$\n" + + "\rauthoritative\x18\x02 \x01(\bR\rauthoritative\x122\n" + + "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x12\x12\n" + + "\x04size\x18\x04 \x01(\x05R\x04size\x12\x1b\n" + + "\ttick_rate\x18\x05 \x01(\x05R\btickRate\x12!\n" + + "\fhandler_name\x18\x06 \x01(\tR\vhandlerName\"8\n" + + "\tMatchList\x12+\n" + + "\amatches\x18\x01 \x03(\v2\x11.nakama.api.MatchR\amatches\"\x99\x01\n" + + "\x19MatchmakerCompletionStats\x12;\n" + + "\vcreate_time\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12?\n" + + "\rcomplete_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\fcompleteTime\"\xd4\x01\n" + + "\x0fMatchmakerStats\x12!\n" + + "\fticket_count\x18\x01 \x01(\x05R\vticketCount\x12U\n" + + "\x19oldest_ticket_create_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x16oldestTicketCreateTime\x12G\n" + + "\vcompletions\x18\x03 \x03(\v2%.nakama.api.MatchmakerCompletionStatsR\vcompletions\"\xe0\x01\n" + + "\fNotification\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x18\n" + + "\asubject\x18\x02 \x01(\tR\asubject\x12\x18\n" + + "\acontent\x18\x03 \x01(\tR\acontent\x12\x12\n" + + "\x04code\x18\x04 \x01(\x05R\x04code\x12\x1b\n" + + "\tsender_id\x18\x05 \x01(\tR\bsenderId\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12\x1e\n" + + "\n" + + "persistent\x18\a \x01(\bR\n" + + "persistent\"}\n" + + "\x10NotificationList\x12>\n" + + "\rnotifications\x18\x01 \x03(\v2\x18.nakama.api.NotificationR\rnotifications\x12)\n" + + "\x10cacheable_cursor\x18\x02 \x01(\tR\x0fcacheableCursor\"P\n" + + "\x18PromoteGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"O\n" + + "\x17DemoteGroupUsersRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x12\x19\n" + + "\buser_ids\x18\x02 \x03(\tR\auserIds\"`\n" + + "\x13ReadStorageObjectId\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\"[\n" + + "\x19ReadStorageObjectsRequest\x12>\n" + + "\n" + + "object_ids\x18\x01 \x03(\v2\x1f.nakama.api.ReadStorageObjectIdR\tobjectIds\"J\n" + + "\x03Rpc\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x18\n" + + "\apayload\x18\x02 \x01(\tR\apayload\x12\x19\n" + + "\bhttp_key\x18\x03 \x01(\tR\ahttpKey\"^\n" + + "\aSession\x12\x18\n" + + "\acreated\x18\x01 \x01(\bR\acreated\x12\x14\n" + + "\x05token\x18\x02 \x01(\tR\x05token\x12#\n" + + "\rrefresh_token\x18\x03 \x01(\tR\frefreshToken\"\xd8\x02\n" + + "\rStorageObject\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x17\n" + + "\auser_id\x18\x03 \x01(\tR\x06userId\x12\x14\n" + + "\x05value\x18\x04 \x01(\tR\x05value\x12\x18\n" + + "\aversion\x18\x05 \x01(\tR\aversion\x12'\n" + + "\x0fpermission_read\x18\x06 \x01(\x05R\x0epermissionRead\x12)\n" + + "\x10permission_write\x18\a \x01(\x05R\x0fpermissionWrite\x12;\n" + + "\vcreate_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\"\xf1\x01\n" + + "\x10StorageObjectAck\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x18\n" + + "\aversion\x18\x03 \x01(\tR\aversion\x12\x17\n" + + "\auser_id\x18\x04 \x01(\tR\x06userId\x12;\n" + + "\vcreate_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\"E\n" + + "\x11StorageObjectAcks\x120\n" + + "\x04acks\x18\x01 \x03(\v2\x1c.nakama.api.StorageObjectAckR\x04acks\"E\n" + + "\x0eStorageObjects\x123\n" + + "\aobjects\x18\x01 \x03(\v2\x19.nakama.api.StorageObjectR\aobjects\"`\n" + + "\x11StorageObjectList\x123\n" + + "\aobjects\x18\x01 \x03(\v2\x19.nakama.api.StorageObjectR\aobjects\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xbe\x05\n" + + "\n" + + "Tournament\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + + "\x05title\x18\x02 \x01(\tR\x05title\x12 \n" + + "\vdescription\x18\x03 \x01(\tR\vdescription\x12\x1a\n" + + "\bcategory\x18\x04 \x01(\rR\bcategory\x12\x1d\n" + + "\n" + + "sort_order\x18\x05 \x01(\rR\tsortOrder\x12\x12\n" + + "\x04size\x18\x06 \x01(\rR\x04size\x12\x19\n" + + "\bmax_size\x18\a \x01(\rR\amaxSize\x12\"\n" + + "\rmax_num_score\x18\b \x01(\rR\vmaxNumScore\x12\x1b\n" + + "\tcan_enter\x18\t \x01(\bR\bcanEnter\x12\x1d\n" + + "\n" + + "end_active\x18\n" + + " \x01(\rR\tendActive\x12\x1d\n" + + "\n" + + "next_reset\x18\v \x01(\rR\tnextReset\x12\x1a\n" + + "\bmetadata\x18\f \x01(\tR\bmetadata\x12;\n" + + "\vcreate_time\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x129\n" + + "\n" + + "start_time\x18\x0e \x01(\v2\x1a.google.protobuf.TimestampR\tstartTime\x125\n" + + "\bend_time\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\aendTime\x12\x1a\n" + + "\bduration\x18\x10 \x01(\rR\bduration\x12!\n" + + "\fstart_active\x18\x11 \x01(\rR\vstartActive\x12\x1d\n" + + "\n" + + "prev_reset\x18\x12 \x01(\rR\tprevReset\x120\n" + + "\boperator\x18\x13 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\x12$\n" + + "\rauthoritative\x18\x14 \x01(\bR\rauthoritative\"b\n" + + "\x0eTournamentList\x128\n" + + "\vtournaments\x18\x01 \x03(\v2\x16.nakama.api.TournamentR\vtournaments\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\"\xf4\x01\n" + + "\x14TournamentRecordList\x127\n" + + "\arecords\x18\x01 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\arecords\x12B\n" + + "\rowner_records\x18\x02 \x03(\v2\x1d.nakama.api.LeaderboardRecordR\fownerRecords\x12\x1f\n" + + "\vnext_cursor\x18\x03 \x01(\tR\n" + + "nextCursor\x12\x1f\n" + + "\vprev_cursor\x18\x04 \x01(\tR\n" + + "prevCursor\x12\x1d\n" + + "\n" + + "rank_count\x18\x05 \x01(\x03R\trankCount\"\xfb\x02\n" + + "\x14UpdateAccountRequest\x128\n" + + "\busername\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\busername\x12?\n" + + "\fdisplay_name\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\vdisplayName\x12;\n" + + "\n" + + "avatar_url\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x127\n" + + "\blang_tag\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x128\n" + + "\blocation\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\blocation\x128\n" + + "\btimezone\x18\x06 \x01(\v2\x1c.google.protobuf.StringValueR\btimezone\"\xc7\x02\n" + + "\x12UpdateGroupRequest\x12\x19\n" + + "\bgroup_id\x18\x01 \x01(\tR\agroupId\x120\n" + + "\x04name\x18\x02 \x01(\v2\x1c.google.protobuf.StringValueR\x04name\x12>\n" + + "\vdescription\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\vdescription\x127\n" + + "\blang_tag\x18\x04 \x01(\v2\x1c.google.protobuf.StringValueR\alangTag\x12;\n" + + "\n" + + "avatar_url\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\tavatarUrl\x12.\n" + + "\x04open\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\x04open\"\xe6\x04\n" + + "\x04User\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1a\n" + + "\busername\x18\x02 \x01(\tR\busername\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x1d\n" + + "\n" + + "avatar_url\x18\x04 \x01(\tR\tavatarUrl\x12\x19\n" + + "\blang_tag\x18\x05 \x01(\tR\alangTag\x12\x1a\n" + + "\blocation\x18\x06 \x01(\tR\blocation\x12\x1a\n" + + "\btimezone\x18\a \x01(\tR\btimezone\x12\x1a\n" + + "\bmetadata\x18\b \x01(\tR\bmetadata\x12\x1f\n" + + "\vfacebook_id\x18\t \x01(\tR\n" + + "facebookId\x12\x1b\n" + + "\tgoogle_id\x18\n" + + " \x01(\tR\bgoogleId\x12#\n" + + "\rgamecenter_id\x18\v \x01(\tR\fgamecenterId\x12\x19\n" + + "\bsteam_id\x18\f \x01(\tR\asteamId\x12\x16\n" + + "\x06online\x18\r \x01(\bR\x06online\x12\x1d\n" + + "\n" + + "edge_count\x18\x0e \x01(\x05R\tedgeCount\x12;\n" + + "\vcreate_time\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\x10 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x127\n" + + "\x18facebook_instant_game_id\x18\x11 \x01(\tR\x15facebookInstantGameId\x12\x19\n" + + "\bapple_id\x18\x12 \x01(\tR\aappleId\"\x99\x02\n" + + "\rUserGroupList\x12D\n" + + "\vuser_groups\x18\x01 \x03(\v2#.nakama.api.UserGroupList.UserGroupR\n" + + "userGroups\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x1a\xa9\x01\n" + + "\tUserGroup\x12'\n" + + "\x05group\x18\x01 \x01(\v2\x11.nakama.api.GroupR\x05group\x121\n" + + "\x05state\x18\x02 \x01(\v2\x1b.google.protobuf.Int32ValueR\x05state\"@\n" + + "\x05State\x12\x0e\n" + + "\n" + + "SUPERADMIN\x10\x00\x12\t\n" + + "\x05ADMIN\x10\x01\x12\n" + + "\n" + + "\x06MEMBER\x10\x02\x12\x10\n" + + "\fJOIN_REQUEST\x10\x03\"/\n" + + "\x05Users\x12&\n" + + "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\"\x85\x01\n" + + "\x17ValidatePurchaseRequest\x12\x18\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x12\x1a\n" + + "\bplatform\x18\x02 \x01(\tR\bplatform\x124\n" + + "\apersist\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"n\n" + + "\x1cValidatePurchaseAppleRequest\x12\x18\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"r\n" + + " ValidateSubscriptionAppleRequest\x12\x18\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"q\n" + + "\x1dValidatePurchaseGoogleRequest\x12\x1a\n" + + "\bpurchase\x18\x01 \x01(\tR\bpurchase\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"s\n" + + "!ValidateSubscriptionGoogleRequest\x12\x18\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x8f\x01\n" + + "\x1dValidatePurchaseHuaweiRequest\x12\x1a\n" + + "\bpurchase\x18\x01 \x01(\tR\bpurchase\x12\x1c\n" + + "\tsignature\x18\x02 \x01(\tR\tsignature\x124\n" + + "\apersist\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x85\x01\n" + + "&ValidatePurchaseFacebookInstantRequest\x12%\n" + + "\x0esigned_request\x18\x01 \x01(\tR\rsignedRequest\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x8d\x01\n" + + "\x1bValidatePurchaseXboxRequest\x12\x1c\n" + + "\tproductId\x18\x01 \x01(\tR\tproductId\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\x12\x1a\n" + + "\bplatform\x18\x03 \x01(\tR\bplatform\"\x86\x01\n" + + "\"ValidatePurchasePlaystationRequest\x12*\n" + + "\x10entitlementLabel\x18\x01 \x01(\tR\x10entitlementLabel\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"}\n" + + "\x1bValidatePurchaseEpicRequest\x12(\n" + + "\x0fnsCatalogItemId\x18\x01 \x01(\tR\x0fnsCatalogItemId\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"T\n" + + "\x1cValidatePurchaseSteamRequest\x124\n" + + "\apersist\x18\x01 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"|\n" + + "\x1eValidatePurchaseDiscordRequest\x12$\n" + + "\rentitlementId\x18\x01 \x01(\tR\rentitlementId\x124\n" + + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\xa9\x04\n" + + "\x11ValidatedPurchase\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + + "\n" + + "product_id\x18\x02 \x01(\tR\tproductId\x12%\n" + + "\x0etransaction_id\x18\x03 \x01(\tR\rtransactionId\x12/\n" + + "\x05store\x18\x04 \x01(\x0e2\x19.nakama.api.StoreProviderR\x05store\x12?\n" + + "\rpurchase_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\fpurchaseTime\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12;\n" + + "\vrefund_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "refundTime\x12+\n" + + "\x11provider_response\x18\t \x01(\tR\x10providerResponse\x12>\n" + + "\venvironment\x18\n" + + " \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\x12\x1f\n" + + "\vseen_before\x18\v \x01(\bR\n" + + "seenBefore\"j\n" + + "\x18ValidatePurchaseResponse\x12N\n" + + "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\"x\n" + + "\x1cValidateSubscriptionResponse\x12X\n" + + "\x16validated_subscription\x18\x01 \x01(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\xa7\x05\n" + + "\x15ValidatedSubscription\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + + "\n" + + "product_id\x18\x02 \x01(\tR\tproductId\x126\n" + + "\x17original_transaction_id\x18\x03 \x01(\tR\x15originalTransactionId\x12/\n" + + "\x05store\x18\x04 \x01(\x0e2\x19.nakama.api.StoreProviderR\x05store\x12?\n" + + "\rpurchase_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\fpurchaseTime\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12>\n" + + "\venvironment\x18\b \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\x12;\n" + + "\vexpiry_time\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "expiryTime\x12;\n" + + "\vrefund_time\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "refundTime\x12+\n" + + "\x11provider_response\x18\v \x01(\tR\x10providerResponse\x123\n" + + "\x15provider_notification\x18\f \x01(\tR\x14providerNotification\x12\x16\n" + + "\x06active\x18\r \x01(\bR\x06active\"\x97\x01\n" + + "\fPurchaseList\x12N\n" + + "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\"\xa7\x01\n" + + "\x10SubscriptionList\x12Z\n" + + "\x17validated_subscriptions\x18\x01 \x03(\v2!.nakama.api.ValidatedSubscriptionR\x16validatedSubscriptions\x12\x16\n" + + "\x06cursor\x18\x02 \x01(\tR\x06cursor\x12\x1f\n" + + "\vprev_cursor\x18\x03 \x01(\tR\n" + + "prevCursor\"\xbb\x02\n" + + "\x1dWriteLeaderboardRecordRequest\x12%\n" + + "\x0eleaderboard_id\x18\x01 \x01(\tR\rleaderboardId\x12X\n" + + "\x06record\x18\x02 \x01(\v2@.nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWriteR\x06record\x1a\x98\x01\n" + + "\x16LeaderboardRecordWrite\x12\x14\n" + + "\x05score\x18\x01 \x01(\x03R\x05score\x12\x1a\n" + + "\bsubscore\x18\x02 \x01(\x03R\bsubscore\x12\x1a\n" + + "\bmetadata\x18\x03 \x01(\tR\bmetadata\x120\n" + + "\boperator\x18\x04 \x01(\x0e2\x14.nakama.api.OperatorR\boperator\"\x84\x02\n" + + "\x12WriteStorageObject\x12\x1e\n" + + "\n" + + "collection\x18\x01 \x01(\tR\n" + + "collection\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x03 \x01(\tR\x05value\x12\x18\n" + + "\aversion\x18\x04 \x01(\tR\aversion\x12D\n" + + "\x0fpermission_read\x18\x05 \x01(\v2\x1b.google.protobuf.Int32ValueR\x0epermissionRead\x12F\n" + + "\x10permission_write\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\x0fpermissionWrite\"V\n" + + "\x1aWriteStorageObjectsRequest\x128\n" + + "\aobjects\x18\x01 \x03(\v2\x1e.nakama.api.WriteStorageObjectR\aobjects\"\xb5\x02\n" + + "\x1cWriteTournamentRecordRequest\x12#\n" + + "\rtournament_id\x18\x01 \x01(\tR\ftournamentId\x12V\n" + + "\x06record\x18\x02 \x01(\v2>.nakama.api.WriteTournamentRecordRequest.TournamentRecordWriteR\x06record\x1a\x97\x01\n" + + "\x15TournamentRecordWrite\x12\x14\n" + + "\x05score\x18\x01 \x01(\x03R\x05score\x12\x1a\n" + + "\bsubscore\x18\x02 \x01(\x03R\bsubscore\x12\x1a\n" + + "\bmetadata\x18\x03 \x01(\tR\bmetadata\x120\n" + + "\boperator\x18\x04 \x01(\x0e2\x14.nakama.api.OperatorR\boperator*\xca\x01\n" + + "\rStoreProvider\x12\x13\n" + + "\x0fAPPLE_APP_STORE\x10\x00\x12\x15\n" + + "\x11GOOGLE_PLAY_STORE\x10\x01\x12\x16\n" + + "\x12HUAWEI_APP_GALLERY\x10\x02\x12\x1a\n" + + "\x16FACEBOOK_INSTANT_STORE\x10\x03\x12\x0e\n" + + "\n" + + "XBOX_STORE\x10\x04\x12\x15\n" + + "\x11PLAYSTATION_STORE\x10\x05\x12\x0e\n" + + "\n" + + "EPIC_STORE\x10\x06\x12\x0f\n" + + "\vSTEAM_STORE\x10\a\x12\x11\n" + + "\rDISCORD_STORE\x10\b*<\n" + + "\x10StoreEnvironment\x12\v\n" + + "\aUNKNOWN\x10\x00\x12\v\n" + + "\aSANDBOX\x10\x01\x12\x0e\n" + + "\n" + + "PRODUCTION\x10\x02*L\n" + + "\bOperator\x12\x0f\n" + + "\vNO_OVERRIDE\x10\x00\x12\b\n" + + "\x04BEST\x10\x01\x12\a\n" + + "\x03SET\x10\x02\x12\r\n" + + "\tINCREMENT\x10\x03\x12\r\n" + + "\tDECREMENT\x10\x04Bc\n" + + "\x19com.heroiclabs.nakama.apiB\tNakamaApiP\x01Z'github.com/heroiclabs/nakama-common/api\xaa\x02\x0fNakama.Protobufb\x06proto3" var ( file_api_proto_rawDescOnce sync.Once - file_api_proto_rawDescData = file_api_proto_rawDesc + file_api_proto_rawDescData []byte ) func file_api_proto_rawDescGZIP() []byte { file_api_proto_rawDescOnce.Do(func() { - file_api_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_proto_rawDescData) + file_api_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc))) }) return file_api_proto_rawDescData } var file_api_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 130) -var file_api_proto_goTypes = []interface{}{ +var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 136) +var file_api_proto_goTypes = []any{ (StoreProvider)(0), // 0: nakama.api.StoreProvider (StoreEnvironment)(0), // 1: nakama.api.StoreEnvironment (Operator)(0), // 2: nakama.api.Operator @@ -10399,229 +9786,241 @@ var file_api_proto_goTypes = []interface{}{ (*User)(nil), // 100: nakama.api.User (*UserGroupList)(nil), // 101: nakama.api.UserGroupList (*Users)(nil), // 102: nakama.api.Users - (*ValidatePurchaseAppleRequest)(nil), // 103: nakama.api.ValidatePurchaseAppleRequest - (*ValidateSubscriptionAppleRequest)(nil), // 104: nakama.api.ValidateSubscriptionAppleRequest - (*ValidatePurchaseGoogleRequest)(nil), // 105: nakama.api.ValidatePurchaseGoogleRequest - (*ValidateSubscriptionGoogleRequest)(nil), // 106: nakama.api.ValidateSubscriptionGoogleRequest - (*ValidatePurchaseHuaweiRequest)(nil), // 107: nakama.api.ValidatePurchaseHuaweiRequest - (*ValidatePurchaseFacebookInstantRequest)(nil), // 108: nakama.api.ValidatePurchaseFacebookInstantRequest - (*ValidatedPurchase)(nil), // 109: nakama.api.ValidatedPurchase - (*ValidatePurchaseResponse)(nil), // 110: nakama.api.ValidatePurchaseResponse - (*ValidateSubscriptionResponse)(nil), // 111: nakama.api.ValidateSubscriptionResponse - (*ValidatedSubscription)(nil), // 112: nakama.api.ValidatedSubscription - (*PurchaseList)(nil), // 113: nakama.api.PurchaseList - (*SubscriptionList)(nil), // 114: nakama.api.SubscriptionList - (*WriteLeaderboardRecordRequest)(nil), // 115: nakama.api.WriteLeaderboardRecordRequest - (*WriteStorageObject)(nil), // 116: nakama.api.WriteStorageObject - (*WriteStorageObjectsRequest)(nil), // 117: nakama.api.WriteStorageObjectsRequest - (*WriteTournamentRecordRequest)(nil), // 118: nakama.api.WriteTournamentRecordRequest - nil, // 119: nakama.api.AccountRefresh.VarsEntry - nil, // 120: nakama.api.AccountApple.VarsEntry - nil, // 121: nakama.api.AccountCustom.VarsEntry - nil, // 122: nakama.api.AccountDevice.VarsEntry - nil, // 123: nakama.api.AccountEmail.VarsEntry - nil, // 124: nakama.api.AccountFacebook.VarsEntry - nil, // 125: nakama.api.AccountFacebookInstantGame.VarsEntry - nil, // 126: nakama.api.AccountGameCenter.VarsEntry - nil, // 127: nakama.api.AccountGoogle.VarsEntry - nil, // 128: nakama.api.AccountSteam.VarsEntry - nil, // 129: nakama.api.SessionRefreshRequest.VarsEntry - nil, // 130: nakama.api.Event.PropertiesEntry - (*FriendsOfFriendsList_FriendOfFriend)(nil), // 131: nakama.api.FriendsOfFriendsList.FriendOfFriend - (*GroupUserList_GroupUser)(nil), // 132: nakama.api.GroupUserList.GroupUser - (*UserGroupList_UserGroup)(nil), // 133: nakama.api.UserGroupList.UserGroup - (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 134: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 135: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - (*timestamppb.Timestamp)(nil), // 136: google.protobuf.Timestamp - (*wrapperspb.BoolValue)(nil), // 137: google.protobuf.BoolValue - (*wrapperspb.Int32Value)(nil), // 138: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 139: google.protobuf.StringValue - (*wrapperspb.UInt32Value)(nil), // 140: google.protobuf.UInt32Value - (*wrapperspb.Int64Value)(nil), // 141: google.protobuf.Int64Value + (*ValidatePurchaseRequest)(nil), // 103: nakama.api.ValidatePurchaseRequest + (*ValidatePurchaseAppleRequest)(nil), // 104: nakama.api.ValidatePurchaseAppleRequest + (*ValidateSubscriptionAppleRequest)(nil), // 105: nakama.api.ValidateSubscriptionAppleRequest + (*ValidatePurchaseGoogleRequest)(nil), // 106: nakama.api.ValidatePurchaseGoogleRequest + (*ValidateSubscriptionGoogleRequest)(nil), // 107: nakama.api.ValidateSubscriptionGoogleRequest + (*ValidatePurchaseHuaweiRequest)(nil), // 108: nakama.api.ValidatePurchaseHuaweiRequest + (*ValidatePurchaseFacebookInstantRequest)(nil), // 109: nakama.api.ValidatePurchaseFacebookInstantRequest + (*ValidatePurchaseXboxRequest)(nil), // 110: nakama.api.ValidatePurchaseXboxRequest + (*ValidatePurchasePlaystationRequest)(nil), // 111: nakama.api.ValidatePurchasePlaystationRequest + (*ValidatePurchaseEpicRequest)(nil), // 112: nakama.api.ValidatePurchaseEpicRequest + (*ValidatePurchaseSteamRequest)(nil), // 113: nakama.api.ValidatePurchaseSteamRequest + (*ValidatePurchaseDiscordRequest)(nil), // 114: nakama.api.ValidatePurchaseDiscordRequest + (*ValidatedPurchase)(nil), // 115: nakama.api.ValidatedPurchase + (*ValidatePurchaseResponse)(nil), // 116: nakama.api.ValidatePurchaseResponse + (*ValidateSubscriptionResponse)(nil), // 117: nakama.api.ValidateSubscriptionResponse + (*ValidatedSubscription)(nil), // 118: nakama.api.ValidatedSubscription + (*PurchaseList)(nil), // 119: nakama.api.PurchaseList + (*SubscriptionList)(nil), // 120: nakama.api.SubscriptionList + (*WriteLeaderboardRecordRequest)(nil), // 121: nakama.api.WriteLeaderboardRecordRequest + (*WriteStorageObject)(nil), // 122: nakama.api.WriteStorageObject + (*WriteStorageObjectsRequest)(nil), // 123: nakama.api.WriteStorageObjectsRequest + (*WriteTournamentRecordRequest)(nil), // 124: nakama.api.WriteTournamentRecordRequest + nil, // 125: nakama.api.AccountRefresh.VarsEntry + nil, // 126: nakama.api.AccountApple.VarsEntry + nil, // 127: nakama.api.AccountCustom.VarsEntry + nil, // 128: nakama.api.AccountDevice.VarsEntry + nil, // 129: nakama.api.AccountEmail.VarsEntry + nil, // 130: nakama.api.AccountFacebook.VarsEntry + nil, // 131: nakama.api.AccountFacebookInstantGame.VarsEntry + nil, // 132: nakama.api.AccountGameCenter.VarsEntry + nil, // 133: nakama.api.AccountGoogle.VarsEntry + nil, // 134: nakama.api.AccountSteam.VarsEntry + nil, // 135: nakama.api.SessionRefreshRequest.VarsEntry + nil, // 136: nakama.api.Event.PropertiesEntry + (*FriendsOfFriendsList_FriendOfFriend)(nil), // 137: nakama.api.FriendsOfFriendsList.FriendOfFriend + (*GroupUserList_GroupUser)(nil), // 138: nakama.api.GroupUserList.GroupUser + (*UserGroupList_UserGroup)(nil), // 139: nakama.api.UserGroupList.UserGroup + (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 140: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 141: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + (*timestamppb.Timestamp)(nil), // 142: google.protobuf.Timestamp + (*wrapperspb.BoolValue)(nil), // 143: google.protobuf.BoolValue + (*wrapperspb.Int32Value)(nil), // 144: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 145: google.protobuf.StringValue + (*wrapperspb.UInt32Value)(nil), // 146: google.protobuf.UInt32Value + (*wrapperspb.Int64Value)(nil), // 147: google.protobuf.Int64Value } var file_api_proto_depIdxs = []int32{ 100, // 0: nakama.api.Account.user:type_name -> nakama.api.User 10, // 1: nakama.api.Account.devices:type_name -> nakama.api.AccountDevice - 136, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp - 136, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp - 119, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry - 120, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry - 121, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry - 122, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry - 123, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry - 124, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry - 125, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry - 126, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry - 127, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry - 128, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry - 129, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry + 142, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp + 142, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp + 125, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry + 126, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry + 127, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry + 128, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry + 129, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry + 130, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry + 131, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry + 132, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry + 133, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry + 134, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry + 135, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry 8, // 15: nakama.api.AuthenticateAppleRequest.account:type_name -> nakama.api.AccountApple - 137, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue + 143, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue 9, // 17: nakama.api.AuthenticateCustomRequest.account:type_name -> nakama.api.AccountCustom - 137, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue + 143, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue 10, // 19: nakama.api.AuthenticateDeviceRequest.account:type_name -> nakama.api.AccountDevice - 137, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue + 143, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue 11, // 21: nakama.api.AuthenticateEmailRequest.account:type_name -> nakama.api.AccountEmail - 137, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue + 143, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue 12, // 23: nakama.api.AuthenticateFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 137, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue - 137, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 143, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue + 143, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue 13, // 26: nakama.api.AuthenticateFacebookInstantGameRequest.account:type_name -> nakama.api.AccountFacebookInstantGame - 137, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue + 143, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue 14, // 28: nakama.api.AuthenticateGameCenterRequest.account:type_name -> nakama.api.AccountGameCenter - 137, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue + 143, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue 15, // 30: nakama.api.AuthenticateGoogleRequest.account:type_name -> nakama.api.AccountGoogle - 137, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue + 143, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue 16, // 32: nakama.api.AuthenticateSteamRequest.account:type_name -> nakama.api.AccountSteam - 137, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue - 137, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue - 138, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value - 136, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp - 136, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp - 137, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue + 143, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue + 143, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue + 144, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value + 142, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp + 142, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp + 143, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue 32, // 39: nakama.api.ChannelMessageList.messages:type_name -> nakama.api.ChannelMessage 40, // 40: nakama.api.DeleteStorageObjectsRequest.object_ids:type_name -> nakama.api.DeleteStorageObjectId - 130, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry - 136, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp + 136, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry + 142, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp 100, // 43: nakama.api.Friend.user:type_name -> nakama.api.User - 138, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value - 136, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp + 144, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value + 142, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp 43, // 46: nakama.api.FriendList.friends:type_name -> nakama.api.Friend - 131, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend - 137, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue - 136, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp - 136, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp + 137, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend + 143, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue + 142, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp + 142, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp 48, // 51: nakama.api.GroupList.groups:type_name -> nakama.api.Group - 132, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser + 138, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser 12, // 53: nakama.api.ImportFacebookFriendsRequest.account:type_name -> nakama.api.AccountFacebook - 137, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 143, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue 16, // 55: nakama.api.ImportSteamFriendsRequest.account:type_name -> nakama.api.AccountSteam - 137, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 143, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue 2, // 57: nakama.api.Leaderboard.operator:type_name -> nakama.api.Operator - 136, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp + 142, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp 56, // 59: nakama.api.LeaderboardList.leaderboards:type_name -> nakama.api.Leaderboard - 139, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue - 136, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp - 136, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp - 136, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp + 145, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue + 142, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp + 142, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp + 142, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp 58, // 64: nakama.api.LeaderboardRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 65: nakama.api.LeaderboardRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord 12, // 66: nakama.api.LinkFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 137, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 143, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue 16, // 68: nakama.api.LinkSteamRequest.account:type_name -> nakama.api.AccountSteam - 137, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue - 138, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value - 137, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue - 138, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value - 138, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value - 137, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue - 138, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value - 140, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 141, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 138, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 141, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 138, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value - 137, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue - 139, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue - 138, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value - 138, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value - 139, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue - 138, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value - 140, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 141, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 138, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 141, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 140, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value - 140, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value - 140, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value - 140, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value - 138, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value - 139, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue + 143, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue + 144, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue + 144, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value + 144, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value + 143, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue + 144, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value + 146, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 147, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 144, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 147, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 144, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue + 145, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue + 144, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value + 144, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value + 145, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue + 144, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value + 146, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 147, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 144, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 147, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 146, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value + 146, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value + 146, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value + 146, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value + 144, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 144, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value + 145, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue 78, // 105: nakama.api.MatchList.matches:type_name -> nakama.api.Match - 136, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp - 136, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp - 136, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp + 142, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp + 142, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp + 142, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp 80, // 109: nakama.api.MatchmakerStats.completions:type_name -> nakama.api.MatchmakerCompletionStats - 136, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp + 142, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp 82, // 111: nakama.api.NotificationList.notifications:type_name -> nakama.api.Notification 86, // 112: nakama.api.ReadStorageObjectsRequest.object_ids:type_name -> nakama.api.ReadStorageObjectId - 136, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp - 136, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp - 136, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp - 136, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp + 142, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp + 142, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp + 142, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp + 142, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp 91, // 117: nakama.api.StorageObjectAcks.acks:type_name -> nakama.api.StorageObjectAck 90, // 118: nakama.api.StorageObjects.objects:type_name -> nakama.api.StorageObject 90, // 119: nakama.api.StorageObjectList.objects:type_name -> nakama.api.StorageObject - 136, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp - 136, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp - 136, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp + 142, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp + 142, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp + 142, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp 2, // 123: nakama.api.Tournament.operator:type_name -> nakama.api.Operator 95, // 124: nakama.api.TournamentList.tournaments:type_name -> nakama.api.Tournament 58, // 125: nakama.api.TournamentRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 126: nakama.api.TournamentRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord - 139, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue - 139, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue - 139, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue - 139, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue - 139, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue - 139, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue - 139, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue - 139, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue - 139, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue - 139, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue - 137, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue - 136, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp - 136, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp - 133, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup + 145, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue + 145, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue + 145, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue + 145, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue + 145, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue + 145, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue + 145, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue + 145, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue + 145, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue + 145, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue + 143, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue + 142, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp + 142, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp + 139, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup 100, // 141: nakama.api.Users.users:type_name -> nakama.api.User - 137, // 142: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 143: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 144: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 145: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 146: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue - 137, // 147: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue - 0, // 148: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider - 136, // 149: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp - 136, // 150: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp - 136, // 151: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp - 136, // 152: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp - 1, // 153: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment - 109, // 154: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 112, // 155: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription - 0, // 156: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider - 136, // 157: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp - 136, // 158: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp - 136, // 159: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp - 1, // 160: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment - 136, // 161: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp - 136, // 162: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp - 109, // 163: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 112, // 164: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription - 134, // 165: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - 138, // 166: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value - 138, // 167: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value - 116, // 168: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject - 135, // 169: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - 100, // 170: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User - 100, // 171: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User - 138, // 172: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value - 48, // 173: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group - 138, // 174: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value - 2, // 175: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator - 2, // 176: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator - 177, // [177:177] is the sub-list for method output_type - 177, // [177:177] is the sub-list for method input_type - 177, // [177:177] is the sub-list for extension type_name - 177, // [177:177] is the sub-list for extension extendee - 0, // [0:177] is the sub-list for field type_name + 143, // 142: nakama.api.ValidatePurchaseRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 143: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 144: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 145: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 146: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 147: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 148: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 149: nakama.api.ValidatePurchaseXboxRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 150: nakama.api.ValidatePurchasePlaystationRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 151: nakama.api.ValidatePurchaseEpicRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 152: nakama.api.ValidatePurchaseSteamRequest.persist:type_name -> google.protobuf.BoolValue + 143, // 153: nakama.api.ValidatePurchaseDiscordRequest.persist:type_name -> google.protobuf.BoolValue + 0, // 154: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider + 142, // 155: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp + 142, // 156: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp + 142, // 157: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp + 142, // 158: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp + 1, // 159: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment + 115, // 160: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 118, // 161: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription + 0, // 162: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider + 142, // 163: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp + 142, // 164: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp + 142, // 165: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp + 1, // 166: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment + 142, // 167: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp + 142, // 168: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp + 115, // 169: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 118, // 170: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription + 140, // 171: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + 144, // 172: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value + 144, // 173: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value + 122, // 174: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject + 141, // 175: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + 100, // 176: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User + 100, // 177: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User + 144, // 178: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value + 48, // 179: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group + 144, // 180: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value + 2, // 181: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator + 2, // 182: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator + 183, // [183:183] is the sub-list for method output_type + 183, // [183:183] is the sub-list for method input_type + 183, // [183:183] is the sub-list for extension type_name + 183, // [183:183] is the sub-list for extension extendee + 0, // [0:183] is the sub-list for field type_name } func init() { file_api_proto_init() } @@ -10629,1431 +10028,13 @@ func file_api_proto_init() { if File_api_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_api_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Account); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountRefresh); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountApple); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountCustom); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountDevice); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountEmail); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountFacebook); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountFacebookInstantGame); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountGameCenter); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountGoogle); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountSteam); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionRefreshRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionLogoutRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateAppleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateCustomRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateDeviceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateEmailRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateFacebookRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateFacebookInstantGameRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateGameCenterRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateGoogleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthenticateSteamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BanGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteLeaderboardRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNotificationsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTournamentRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageObjectId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Friend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendsOfFriendsList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSubscriptionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Group); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupUserList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportFacebookFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportSteamFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinTournamentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KickGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Leaderboard); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardRecord); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaderboardRecordList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeaveGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LinkFacebookRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LinkSteamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListChannelMessagesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFriendsOfFriendsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGroupsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLeaderboardRecordsAroundOwnerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLeaderboardRecordsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMatchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNotificationsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSubscriptionsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTournamentRecordsAroundOwnerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTournamentRecordsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTournamentsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListUserGroupsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Match); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerCompletionStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Notification); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NotificationList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PromoteGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DemoteGroupUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadStorageObjectId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Rpc); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjectAck); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjectAcks); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjects); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageObjectList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Tournament); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TournamentList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TournamentRecordList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAccountRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserGroupList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Users); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseAppleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSubscriptionAppleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseGoogleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSubscriptionGoogleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseHuaweiRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseFacebookInstantRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatedPurchase); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSubscriptionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatedSubscription); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PurchaseList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriptionList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteLeaderboardRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteStorageObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteStorageObjectsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteTournamentRecordRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendsOfFriendsList_FriendOfFriend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupUserList_GroupUser); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserGroupList_UserGroup); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteLeaderboardRecordRequest_LeaderboardRecordWrite); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteTournamentRecordRequest_TournamentRecordWrite); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_api_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc)), NumEnums: 6, - NumMessages: 130, + NumMessages: 136, NumExtensions: 0, NumServices: 0, }, @@ -12063,7 +10044,6 @@ func file_api_proto_init() { MessageInfos: file_api_proto_msgTypes, }.Build() File_api_proto = out.File - file_api_proto_rawDesc = nil file_api_proto_goTypes = nil file_api_proto_depIdxs = nil } diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index f6962a457f..9c4efddd3b 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1187,6 +1187,12 @@ message Users { repeated User users = 1; } +message ValidatePurchaseRequest { + string receipt = 1; + string platform = 2; + google.protobuf.BoolValue persist = 3; +} + // Apple IAP Purchases validation request message ValidatePurchaseAppleRequest { // Base64 encoded Apple receipt data payload. @@ -1237,6 +1243,33 @@ message ValidatePurchaseFacebookInstantRequest { google.protobuf.BoolValue persist = 2; } +// Xbox Purchase validation request +message ValidatePurchaseXboxRequest { + string productId = 1; + google.protobuf.BoolValue persist = 2; + string platform = 3; +} + +// Playstation validation request +message ValidatePurchasePlaystationRequest { + string entitlementLabel = 1; + google.protobuf.BoolValue persist = 2; +} + +message ValidatePurchaseEpicRequest { + string nsCatalogItemId = 1; + google.protobuf.BoolValue persist = 2; +} + +message ValidatePurchaseSteamRequest { + google.protobuf.BoolValue persist = 1; +} + +message ValidatePurchaseDiscordRequest { + string entitlementId = 1; + google.protobuf.BoolValue persist = 2; +} + // Validated Purchase stored by Nakama. message ValidatedPurchase { // Purchase User ID. @@ -1284,6 +1317,16 @@ enum StoreProvider { HUAWEI_APP_GALLERY = 2; // Facebook Instant Store FACEBOOK_INSTANT_STORE = 3; + // Xbox Store + XBOX_STORE = 4; + // Playstation Store + PLAYSTATION_STORE = 5; + // Epic Store + EPIC_STORE = 6; + // Steam Store + STEAM_STORE = 7; + // Discord Store + DISCORD_STORE = 8; } // Environment where a purchase/subscription took place, diff --git a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go index 974f671730..78425e8ac3 100644 --- a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.29.3 +// protoc-gen-go v1.36.6 +// protoc v4.24.3 // source: realtime.proto package rtapi @@ -31,6 +31,7 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -172,12 +173,9 @@ func (Error_Code) EnumDescriptor() ([]byte, []int) { // An envelope for a realtime message. type Envelope struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` - // Types that are assignable to Message: + state protoimpl.MessageState `protogen:"open.v1"` + Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` + // Types that are valid to be assigned to Message: // // *Envelope_Channel // *Envelope_ChannelJoin @@ -228,16 +226,16 @@ type Envelope struct { // *Envelope_PartyData // *Envelope_PartyDataSend // *Envelope_PartyPresenceEvent - Message isEnvelope_Message `protobuf_oneof:"message"` + Message isEnvelope_Message `protobuf_oneof:"message"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Envelope) Reset() { *x = Envelope{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Envelope) String() string { @@ -248,7 +246,7 @@ func (*Envelope) ProtoMessage() {} func (x *Envelope) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -270,352 +268,450 @@ func (x *Envelope) GetCid() string { return "" } -func (m *Envelope) GetMessage() isEnvelope_Message { - if m != nil { - return m.Message +func (x *Envelope) GetMessage() isEnvelope_Message { + if x != nil { + return x.Message } return nil } func (x *Envelope) GetChannel() *Channel { - if x, ok := x.GetMessage().(*Envelope_Channel); ok { - return x.Channel + if x != nil { + if x, ok := x.Message.(*Envelope_Channel); ok { + return x.Channel + } } return nil } func (x *Envelope) GetChannelJoin() *ChannelJoin { - if x, ok := x.GetMessage().(*Envelope_ChannelJoin); ok { - return x.ChannelJoin + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelJoin); ok { + return x.ChannelJoin + } } return nil } func (x *Envelope) GetChannelLeave() *ChannelLeave { - if x, ok := x.GetMessage().(*Envelope_ChannelLeave); ok { - return x.ChannelLeave + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelLeave); ok { + return x.ChannelLeave + } } return nil } func (x *Envelope) GetChannelMessage() *api.ChannelMessage { - if x, ok := x.GetMessage().(*Envelope_ChannelMessage); ok { - return x.ChannelMessage + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessage); ok { + return x.ChannelMessage + } } return nil } func (x *Envelope) GetChannelMessageAck() *ChannelMessageAck { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageAck); ok { - return x.ChannelMessageAck + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageAck); ok { + return x.ChannelMessageAck + } } return nil } func (x *Envelope) GetChannelMessageSend() *ChannelMessageSend { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageSend); ok { - return x.ChannelMessageSend + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageSend); ok { + return x.ChannelMessageSend + } } return nil } func (x *Envelope) GetChannelMessageUpdate() *ChannelMessageUpdate { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageUpdate); ok { - return x.ChannelMessageUpdate + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageUpdate); ok { + return x.ChannelMessageUpdate + } } return nil } func (x *Envelope) GetChannelMessageRemove() *ChannelMessageRemove { - if x, ok := x.GetMessage().(*Envelope_ChannelMessageRemove); ok { - return x.ChannelMessageRemove + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelMessageRemove); ok { + return x.ChannelMessageRemove + } } return nil } func (x *Envelope) GetChannelPresenceEvent() *ChannelPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_ChannelPresenceEvent); ok { - return x.ChannelPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_ChannelPresenceEvent); ok { + return x.ChannelPresenceEvent + } } return nil } func (x *Envelope) GetError() *Error { - if x, ok := x.GetMessage().(*Envelope_Error); ok { - return x.Error + if x != nil { + if x, ok := x.Message.(*Envelope_Error); ok { + return x.Error + } } return nil } func (x *Envelope) GetMatch() *Match { - if x, ok := x.GetMessage().(*Envelope_Match); ok { - return x.Match + if x != nil { + if x, ok := x.Message.(*Envelope_Match); ok { + return x.Match + } } return nil } func (x *Envelope) GetMatchCreate() *MatchCreate { - if x, ok := x.GetMessage().(*Envelope_MatchCreate); ok { - return x.MatchCreate + if x != nil { + if x, ok := x.Message.(*Envelope_MatchCreate); ok { + return x.MatchCreate + } } return nil } func (x *Envelope) GetMatchData() *MatchData { - if x, ok := x.GetMessage().(*Envelope_MatchData); ok { - return x.MatchData + if x != nil { + if x, ok := x.Message.(*Envelope_MatchData); ok { + return x.MatchData + } } return nil } func (x *Envelope) GetMatchDataSend() *MatchDataSend { - if x, ok := x.GetMessage().(*Envelope_MatchDataSend); ok { - return x.MatchDataSend + if x != nil { + if x, ok := x.Message.(*Envelope_MatchDataSend); ok { + return x.MatchDataSend + } } return nil } func (x *Envelope) GetMatchJoin() *MatchJoin { - if x, ok := x.GetMessage().(*Envelope_MatchJoin); ok { - return x.MatchJoin + if x != nil { + if x, ok := x.Message.(*Envelope_MatchJoin); ok { + return x.MatchJoin + } } return nil } func (x *Envelope) GetMatchLeave() *MatchLeave { - if x, ok := x.GetMessage().(*Envelope_MatchLeave); ok { - return x.MatchLeave + if x != nil { + if x, ok := x.Message.(*Envelope_MatchLeave); ok { + return x.MatchLeave + } } return nil } func (x *Envelope) GetMatchPresenceEvent() *MatchPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_MatchPresenceEvent); ok { - return x.MatchPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_MatchPresenceEvent); ok { + return x.MatchPresenceEvent + } } return nil } func (x *Envelope) GetMatchmakerAdd() *MatchmakerAdd { - if x, ok := x.GetMessage().(*Envelope_MatchmakerAdd); ok { - return x.MatchmakerAdd + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerAdd); ok { + return x.MatchmakerAdd + } } return nil } func (x *Envelope) GetMatchmakerMatched() *MatchmakerMatched { - if x, ok := x.GetMessage().(*Envelope_MatchmakerMatched); ok { - return x.MatchmakerMatched + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerMatched); ok { + return x.MatchmakerMatched + } } return nil } func (x *Envelope) GetMatchmakerRemove() *MatchmakerRemove { - if x, ok := x.GetMessage().(*Envelope_MatchmakerRemove); ok { - return x.MatchmakerRemove + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerRemove); ok { + return x.MatchmakerRemove + } } return nil } func (x *Envelope) GetMatchmakerTicket() *MatchmakerTicket { - if x, ok := x.GetMessage().(*Envelope_MatchmakerTicket); ok { - return x.MatchmakerTicket + if x != nil { + if x, ok := x.Message.(*Envelope_MatchmakerTicket); ok { + return x.MatchmakerTicket + } } return nil } func (x *Envelope) GetNotifications() *Notifications { - if x, ok := x.GetMessage().(*Envelope_Notifications); ok { - return x.Notifications + if x != nil { + if x, ok := x.Message.(*Envelope_Notifications); ok { + return x.Notifications + } } return nil } func (x *Envelope) GetRpc() *api.Rpc { - if x, ok := x.GetMessage().(*Envelope_Rpc); ok { - return x.Rpc + if x != nil { + if x, ok := x.Message.(*Envelope_Rpc); ok { + return x.Rpc + } } return nil } func (x *Envelope) GetStatus() *Status { - if x, ok := x.GetMessage().(*Envelope_Status); ok { - return x.Status + if x != nil { + if x, ok := x.Message.(*Envelope_Status); ok { + return x.Status + } } return nil } func (x *Envelope) GetStatusFollow() *StatusFollow { - if x, ok := x.GetMessage().(*Envelope_StatusFollow); ok { - return x.StatusFollow + if x != nil { + if x, ok := x.Message.(*Envelope_StatusFollow); ok { + return x.StatusFollow + } } return nil } func (x *Envelope) GetStatusPresenceEvent() *StatusPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_StatusPresenceEvent); ok { - return x.StatusPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_StatusPresenceEvent); ok { + return x.StatusPresenceEvent + } } return nil } func (x *Envelope) GetStatusUnfollow() *StatusUnfollow { - if x, ok := x.GetMessage().(*Envelope_StatusUnfollow); ok { - return x.StatusUnfollow + if x != nil { + if x, ok := x.Message.(*Envelope_StatusUnfollow); ok { + return x.StatusUnfollow + } } return nil } func (x *Envelope) GetStatusUpdate() *StatusUpdate { - if x, ok := x.GetMessage().(*Envelope_StatusUpdate); ok { - return x.StatusUpdate + if x != nil { + if x, ok := x.Message.(*Envelope_StatusUpdate); ok { + return x.StatusUpdate + } } return nil } func (x *Envelope) GetStreamData() *StreamData { - if x, ok := x.GetMessage().(*Envelope_StreamData); ok { - return x.StreamData + if x != nil { + if x, ok := x.Message.(*Envelope_StreamData); ok { + return x.StreamData + } } return nil } func (x *Envelope) GetStreamPresenceEvent() *StreamPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_StreamPresenceEvent); ok { - return x.StreamPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_StreamPresenceEvent); ok { + return x.StreamPresenceEvent + } } return nil } func (x *Envelope) GetPing() *Ping { - if x, ok := x.GetMessage().(*Envelope_Ping); ok { - return x.Ping + if x != nil { + if x, ok := x.Message.(*Envelope_Ping); ok { + return x.Ping + } } return nil } func (x *Envelope) GetPong() *Pong { - if x, ok := x.GetMessage().(*Envelope_Pong); ok { - return x.Pong + if x != nil { + if x, ok := x.Message.(*Envelope_Pong); ok { + return x.Pong + } } return nil } func (x *Envelope) GetParty() *Party { - if x, ok := x.GetMessage().(*Envelope_Party); ok { - return x.Party + if x != nil { + if x, ok := x.Message.(*Envelope_Party); ok { + return x.Party + } } return nil } func (x *Envelope) GetPartyCreate() *PartyCreate { - if x, ok := x.GetMessage().(*Envelope_PartyCreate); ok { - return x.PartyCreate + if x != nil { + if x, ok := x.Message.(*Envelope_PartyCreate); ok { + return x.PartyCreate + } } return nil } func (x *Envelope) GetPartyJoin() *PartyJoin { - if x, ok := x.GetMessage().(*Envelope_PartyJoin); ok { - return x.PartyJoin + if x != nil { + if x, ok := x.Message.(*Envelope_PartyJoin); ok { + return x.PartyJoin + } } return nil } func (x *Envelope) GetPartyLeave() *PartyLeave { - if x, ok := x.GetMessage().(*Envelope_PartyLeave); ok { - return x.PartyLeave + if x != nil { + if x, ok := x.Message.(*Envelope_PartyLeave); ok { + return x.PartyLeave + } } return nil } func (x *Envelope) GetPartyPromote() *PartyPromote { - if x, ok := x.GetMessage().(*Envelope_PartyPromote); ok { - return x.PartyPromote + if x != nil { + if x, ok := x.Message.(*Envelope_PartyPromote); ok { + return x.PartyPromote + } } return nil } func (x *Envelope) GetPartyLeader() *PartyLeader { - if x, ok := x.GetMessage().(*Envelope_PartyLeader); ok { - return x.PartyLeader + if x != nil { + if x, ok := x.Message.(*Envelope_PartyLeader); ok { + return x.PartyLeader + } } return nil } func (x *Envelope) GetPartyAccept() *PartyAccept { - if x, ok := x.GetMessage().(*Envelope_PartyAccept); ok { - return x.PartyAccept + if x != nil { + if x, ok := x.Message.(*Envelope_PartyAccept); ok { + return x.PartyAccept + } } return nil } func (x *Envelope) GetPartyRemove() *PartyRemove { - if x, ok := x.GetMessage().(*Envelope_PartyRemove); ok { - return x.PartyRemove + if x != nil { + if x, ok := x.Message.(*Envelope_PartyRemove); ok { + return x.PartyRemove + } } return nil } func (x *Envelope) GetPartyClose() *PartyClose { - if x, ok := x.GetMessage().(*Envelope_PartyClose); ok { - return x.PartyClose + if x != nil { + if x, ok := x.Message.(*Envelope_PartyClose); ok { + return x.PartyClose + } } return nil } func (x *Envelope) GetPartyJoinRequestList() *PartyJoinRequestList { - if x, ok := x.GetMessage().(*Envelope_PartyJoinRequestList); ok { - return x.PartyJoinRequestList + if x != nil { + if x, ok := x.Message.(*Envelope_PartyJoinRequestList); ok { + return x.PartyJoinRequestList + } } return nil } func (x *Envelope) GetPartyJoinRequest() *PartyJoinRequest { - if x, ok := x.GetMessage().(*Envelope_PartyJoinRequest); ok { - return x.PartyJoinRequest + if x != nil { + if x, ok := x.Message.(*Envelope_PartyJoinRequest); ok { + return x.PartyJoinRequest + } } return nil } func (x *Envelope) GetPartyMatchmakerAdd() *PartyMatchmakerAdd { - if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerAdd); ok { - return x.PartyMatchmakerAdd + if x != nil { + if x, ok := x.Message.(*Envelope_PartyMatchmakerAdd); ok { + return x.PartyMatchmakerAdd + } } return nil } func (x *Envelope) GetPartyMatchmakerRemove() *PartyMatchmakerRemove { - if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerRemove); ok { - return x.PartyMatchmakerRemove + if x != nil { + if x, ok := x.Message.(*Envelope_PartyMatchmakerRemove); ok { + return x.PartyMatchmakerRemove + } } return nil } func (x *Envelope) GetPartyMatchmakerTicket() *PartyMatchmakerTicket { - if x, ok := x.GetMessage().(*Envelope_PartyMatchmakerTicket); ok { - return x.PartyMatchmakerTicket + if x != nil { + if x, ok := x.Message.(*Envelope_PartyMatchmakerTicket); ok { + return x.PartyMatchmakerTicket + } } return nil } func (x *Envelope) GetPartyData() *PartyData { - if x, ok := x.GetMessage().(*Envelope_PartyData); ok { - return x.PartyData + if x != nil { + if x, ok := x.Message.(*Envelope_PartyData); ok { + return x.PartyData + } } return nil } func (x *Envelope) GetPartyDataSend() *PartyDataSend { - if x, ok := x.GetMessage().(*Envelope_PartyDataSend); ok { - return x.PartyDataSend + if x != nil { + if x, ok := x.Message.(*Envelope_PartyDataSend); ok { + return x.PartyDataSend + } } return nil } func (x *Envelope) GetPartyPresenceEvent() *PartyPresenceEvent { - if x, ok := x.GetMessage().(*Envelope_PartyPresenceEvent); ok { - return x.PartyPresenceEvent + if x != nil { + if x, ok := x.Message.(*Envelope_PartyPresenceEvent); ok { + return x.PartyPresenceEvent + } } return nil } @@ -969,10 +1065,7 @@ func (*Envelope_PartyPresenceEvent) isEnvelope_Message() {} // A realtime chat channel. type Channel struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the channel. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The users currently in the channel. @@ -986,16 +1079,16 @@ type Channel struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,6,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Channel) Reset() { *x = Channel{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Channel) String() string { @@ -1006,7 +1099,7 @@ func (*Channel) ProtoMessage() {} func (x *Channel) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1072,10 +1165,7 @@ func (x *Channel) GetUserIdTwo() string { // Join operation for a realtime chat channel. type ChannelJoin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user ID to DM with, group ID to chat with, or room channel name to join. Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` // The type of the chat channel. @@ -1083,16 +1173,16 @@ type ChannelJoin struct { // Whether messages sent on this channel should be persistent. Persistence *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persistence,proto3" json:"persistence,omitempty"` // Whether the user should appear in the channel's presence list and events. - Hidden *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=hidden,proto3" json:"hidden,omitempty"` + Hidden *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=hidden,proto3" json:"hidden,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelJoin) Reset() { *x = ChannelJoin{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelJoin) String() string { @@ -1103,7 +1193,7 @@ func (*ChannelJoin) ProtoMessage() {} func (x *ChannelJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1148,21 +1238,18 @@ func (x *ChannelJoin) GetHidden() *wrapperspb.BoolValue { // Leave a realtime channel. type ChannelLeave struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ID of the channel to leave. - ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` + ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelLeave) Reset() { *x = ChannelLeave{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelLeave) String() string { @@ -1173,7 +1260,7 @@ func (*ChannelLeave) ProtoMessage() {} func (x *ChannelLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1197,10 +1284,7 @@ func (x *ChannelLeave) GetChannelId() string { // A receipt reply from a channel message send operation. type ChannelMessageAck struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The unique ID assigned to the message. @@ -1222,16 +1306,16 @@ type ChannelMessageAck struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,10,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,11,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,11,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageAck) Reset() { *x = ChannelMessageAck{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageAck) String() string { @@ -1242,7 +1326,7 @@ func (*ChannelMessageAck) ProtoMessage() {} func (x *ChannelMessageAck) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1336,23 +1420,20 @@ func (x *ChannelMessageAck) GetUserIdTwo() string { // Send a message to a realtime channel. type ChannelMessageSend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel to sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Message content. - Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageSend) Reset() { *x = ChannelMessageSend{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageSend) String() string { @@ -1363,7 +1444,7 @@ func (*ChannelMessageSend) ProtoMessage() {} func (x *ChannelMessageSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1394,25 +1475,22 @@ func (x *ChannelMessageSend) GetContent() string { // Update a message previously sent to a realtime channel. type ChannelMessageUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The ID assigned to the message to update. MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` // New message content. - Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageUpdate) Reset() { *x = ChannelMessageUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageUpdate) String() string { @@ -1423,7 +1501,7 @@ func (*ChannelMessageUpdate) ProtoMessage() {} func (x *ChannelMessageUpdate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1461,23 +1539,20 @@ func (x *ChannelMessageUpdate) GetContent() string { // Remove a message previously sent to a realtime channel. type ChannelMessageRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel the message was sent to. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // The ID assigned to the message to update. - MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` + MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelMessageRemove) Reset() { *x = ChannelMessageRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelMessageRemove) String() string { @@ -1488,7 +1563,7 @@ func (*ChannelMessageRemove) ProtoMessage() {} func (x *ChannelMessageRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1519,10 +1594,7 @@ func (x *ChannelMessageRemove) GetMessageId() string { // A set of joins and leaves on a particular channel. type ChannelPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The channel identifier this event is for. ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` // Presences joining the channel as part of this event, if any. @@ -1536,16 +1608,16 @@ type ChannelPresenceEvent struct { // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. UserIdOne string `protobuf:"bytes,6,opt,name=user_id_one,json=userIdOne,proto3" json:"user_id_one,omitempty"` // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. - UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + UserIdTwo string `protobuf:"bytes,7,opt,name=user_id_two,json=userIdTwo,proto3" json:"user_id_two,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChannelPresenceEvent) Reset() { *x = ChannelPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChannelPresenceEvent) String() string { @@ -1556,7 +1628,7 @@ func (*ChannelPresenceEvent) ProtoMessage() {} func (x *ChannelPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1622,25 +1694,22 @@ func (x *ChannelPresenceEvent) GetUserIdTwo() string { // A logical error which may occur on the server. type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The error code which should be one of "Error.Code" enums. Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // A message in English to help developers debug the response. Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` // Additional error details which may be different for each response. - Context map[string]string `protobuf:"bytes,3,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Context map[string]string `protobuf:"bytes,3,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Error) Reset() { *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Error) String() string { @@ -1651,7 +1720,7 @@ func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1689,10 +1758,7 @@ func (x *Error) GetContext() map[string]string { // A realtime match. type Match struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // True if it's an server-managed authoritative match, false otherwise. @@ -1704,16 +1770,16 @@ type Match struct { // The users currently in the match. Presences []*UserPresence `protobuf:"bytes,5,rep,name=presences,proto3" json:"presences,omitempty"` // A reference to the current user's presence in the match. - Self *UserPresence `protobuf:"bytes,6,opt,name=self,proto3" json:"self,omitempty"` + Self *UserPresence `protobuf:"bytes,6,opt,name=self,proto3" json:"self,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Match) Reset() { *x = Match{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Match) String() string { @@ -1724,7 +1790,7 @@ func (*Match) ProtoMessage() {} func (x *Match) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1783,21 +1849,18 @@ func (x *Match) GetSelf() *UserPresence { // Create a new realtime match. type MatchCreate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Optional name to use when creating the match. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchCreate) Reset() { *x = MatchCreate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchCreate) String() string { @@ -1808,7 +1871,7 @@ func (*MatchCreate) ProtoMessage() {} func (x *MatchCreate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1832,10 +1895,7 @@ func (x *MatchCreate) GetName() string { // Realtime match data received from the server. type MatchData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // A reference to the user presence that sent this data, if any. @@ -1845,16 +1905,16 @@ type MatchData struct { // Data payload, if any. Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` // True if this data was delivered reliably, false otherwise. - Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchData) Reset() { *x = MatchData{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchData) String() string { @@ -1865,7 +1925,7 @@ func (*MatchData) ProtoMessage() {} func (x *MatchData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1917,10 +1977,7 @@ func (x *MatchData) GetReliable() bool { // Send realtime match data to the server. type MatchDataSend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // Op code value. @@ -1930,16 +1987,16 @@ type MatchDataSend struct { // List of presences in the match to deliver to, if filtering is required. Otherwise deliver to everyone in the match. Presences []*UserPresence `protobuf:"bytes,4,rep,name=presences,proto3" json:"presences,omitempty"` // True if the data should be sent reliably, false otherwise. - Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + Reliable bool `protobuf:"varint,5,opt,name=reliable,proto3" json:"reliable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchDataSend) Reset() { *x = MatchDataSend{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchDataSend) String() string { @@ -1950,7 +2007,7 @@ func (*MatchDataSend) ProtoMessage() {} func (x *MatchDataSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2002,26 +2059,23 @@ func (x *MatchDataSend) GetReliable() bool { // Join an existing realtime match. type MatchJoin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Id: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Id: // // *MatchJoin_MatchId // *MatchJoin_Token Id isMatchJoin_Id `protobuf_oneof:"id"` // An optional set of key-value metadata pairs to be passed to the match handler, if any. - Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchJoin) Reset() { *x = MatchJoin{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchJoin) String() string { @@ -2032,7 +2086,7 @@ func (*MatchJoin) ProtoMessage() {} func (x *MatchJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2047,23 +2101,27 @@ func (*MatchJoin) Descriptor() ([]byte, []int) { return file_realtime_proto_rawDescGZIP(), []int{14} } -func (m *MatchJoin) GetId() isMatchJoin_Id { - if m != nil { - return m.Id +func (x *MatchJoin) GetId() isMatchJoin_Id { + if x != nil { + return x.Id } return nil } func (x *MatchJoin) GetMatchId() string { - if x, ok := x.GetId().(*MatchJoin_MatchId); ok { - return x.MatchId + if x != nil { + if x, ok := x.Id.(*MatchJoin_MatchId); ok { + return x.MatchId + } } return "" } func (x *MatchJoin) GetToken() string { - if x, ok := x.GetId().(*MatchJoin_Token); ok { - return x.Token + if x != nil { + if x, ok := x.Id.(*MatchJoin_Token); ok { + return x.Token + } } return "" } @@ -2095,21 +2153,18 @@ func (*MatchJoin_Token) isMatchJoin_Id() {} // Leave a realtime match. type MatchLeave struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. - MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` + MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchLeave) Reset() { *x = MatchLeave{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchLeave) String() string { @@ -2120,7 +2175,7 @@ func (*MatchLeave) ProtoMessage() {} func (x *MatchLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2144,25 +2199,22 @@ func (x *MatchLeave) GetMatchId() string { // A set of joins and leaves on a particular realtime match. type MatchPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The match unique ID. MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"` // User presences that have just joined the match. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // User presences that have just left the match. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchPresenceEvent) Reset() { *x = MatchPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchPresenceEvent) String() string { @@ -2173,7 +2225,7 @@ func (*MatchPresenceEvent) ProtoMessage() {} func (x *MatchPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2211,10 +2263,7 @@ func (x *MatchPresenceEvent) GetLeaves() []*UserPresence { // Start a new matchmaking process. type MatchmakerAdd struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Minimum total user count to match together. MinCount int32 `protobuf:"varint,1,opt,name=min_count,json=minCount,proto3" json:"min_count,omitempty"` // Maximum total user count to match together. @@ -2222,20 +2271,20 @@ type MatchmakerAdd struct { // Filter query used to identify suitable users. Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,4,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StringProperties map[string]string `protobuf:"bytes,4,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,5,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + NumericProperties map[string]float64 `protobuf:"bytes,5,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` // Optional multiple of the count that must be satisfied. CountMultiple *wrapperspb.Int32Value `protobuf:"bytes,6,opt,name=count_multiple,json=countMultiple,proto3" json:"count_multiple,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerAdd) Reset() { *x = MatchmakerAdd{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerAdd) String() string { @@ -2246,7 +2295,7 @@ func (*MatchmakerAdd) ProtoMessage() {} func (x *MatchmakerAdd) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2305,15 +2354,12 @@ func (x *MatchmakerAdd) GetCountMultiple() *wrapperspb.Int32Value { // A successful matchmaking result. type MatchmakerMatched struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The matchmaking ticket that has completed. Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` // The match token or match ID to join. // - // Types that are assignable to Id: + // Types that are valid to be assigned to Id: // // *MatchmakerMatched_MatchId // *MatchmakerMatched_Token @@ -2321,16 +2367,16 @@ type MatchmakerMatched struct { // The users that have been matched together, and information about their matchmaking data. Users []*MatchmakerMatched_MatchmakerUser `protobuf:"bytes,4,rep,name=users,proto3" json:"users,omitempty"` // A reference to the current user and their properties. - Self *MatchmakerMatched_MatchmakerUser `protobuf:"bytes,5,opt,name=self,proto3" json:"self,omitempty"` + Self *MatchmakerMatched_MatchmakerUser `protobuf:"bytes,5,opt,name=self,proto3" json:"self,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerMatched) Reset() { *x = MatchmakerMatched{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerMatched) String() string { @@ -2341,7 +2387,7 @@ func (*MatchmakerMatched) ProtoMessage() {} func (x *MatchmakerMatched) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2363,23 +2409,27 @@ func (x *MatchmakerMatched) GetTicket() string { return "" } -func (m *MatchmakerMatched) GetId() isMatchmakerMatched_Id { - if m != nil { - return m.Id +func (x *MatchmakerMatched) GetId() isMatchmakerMatched_Id { + if x != nil { + return x.Id } return nil } func (x *MatchmakerMatched) GetMatchId() string { - if x, ok := x.GetId().(*MatchmakerMatched_MatchId); ok { - return x.MatchId + if x != nil { + if x, ok := x.Id.(*MatchmakerMatched_MatchId); ok { + return x.MatchId + } } return "" } func (x *MatchmakerMatched) GetToken() string { - if x, ok := x.GetId().(*MatchmakerMatched_Token); ok { - return x.Token + if x != nil { + if x, ok := x.Id.(*MatchmakerMatched_Token); ok { + return x.Token + } } return "" } @@ -2418,21 +2468,18 @@ func (*MatchmakerMatched_Token) isMatchmakerMatched_Id() {} // Cancel an existing ongoing matchmaking process. type MatchmakerRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ticket to cancel. - Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerRemove) Reset() { *x = MatchmakerRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerRemove) String() string { @@ -2443,7 +2490,7 @@ func (*MatchmakerRemove) ProtoMessage() {} func (x *MatchmakerRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2467,21 +2514,18 @@ func (x *MatchmakerRemove) GetTicket() string { // A ticket representing a new matchmaking process. type MatchmakerTicket struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The ticket that can be used to cancel matchmaking. - Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerTicket) Reset() { *x = MatchmakerTicket{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerTicket) String() string { @@ -2492,7 +2536,7 @@ func (*MatchmakerTicket) ProtoMessage() {} func (x *MatchmakerTicket) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2516,21 +2560,18 @@ func (x *MatchmakerTicket) GetTicket() string { // A collection of zero or more notifications. type Notifications struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Collection of notifications. Notifications []*api.Notification `protobuf:"bytes,1,rep,name=notifications,proto3" json:"notifications,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Notifications) Reset() { *x = Notifications{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Notifications) String() string { @@ -2541,7 +2582,7 @@ func (*Notifications) ProtoMessage() {} func (x *Notifications) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2565,10 +2606,7 @@ func (x *Notifications) GetNotifications() []*api.Notification { // Incoming information about a party. type Party struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Unique party identifier. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Open flag. @@ -2580,16 +2618,16 @@ type Party struct { // Leader. Leader *UserPresence `protobuf:"bytes,5,opt,name=leader,proto3" json:"leader,omitempty"` // All current party members. - Presences []*UserPresence `protobuf:"bytes,6,rep,name=presences,proto3" json:"presences,omitempty"` + Presences []*UserPresence `protobuf:"bytes,6,rep,name=presences,proto3" json:"presences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Party) Reset() { *x = Party{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Party) String() string { @@ -2600,7 +2638,7 @@ func (*Party) ProtoMessage() {} func (x *Party) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2659,23 +2697,20 @@ func (x *Party) GetPresences() []*UserPresence { // Create a party. type PartyCreate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Whether or not the party will require join requests to be approved by the party leader. Open bool `protobuf:"varint,1,opt,name=open,proto3" json:"open,omitempty"` // Maximum number of party members. - MaxSize int32 `protobuf:"varint,2,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` + MaxSize int32 `protobuf:"varint,2,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyCreate) Reset() { *x = PartyCreate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyCreate) String() string { @@ -2686,7 +2721,7 @@ func (*PartyCreate) ProtoMessage() {} func (x *PartyCreate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2717,21 +2752,18 @@ func (x *PartyCreate) GetMaxSize() int32 { // Join a party, or request to join if the party is not open. type PartyJoin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to join. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyJoin) Reset() { *x = PartyJoin{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyJoin) String() string { @@ -2742,7 +2774,7 @@ func (*PartyJoin) ProtoMessage() {} func (x *PartyJoin) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2766,21 +2798,18 @@ func (x *PartyJoin) GetPartyId() string { // Leave a party. type PartyLeave struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to leave. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyLeave) Reset() { *x = PartyLeave{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyLeave) String() string { @@ -2791,7 +2820,7 @@ func (*PartyLeave) ProtoMessage() {} func (x *PartyLeave) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2815,23 +2844,20 @@ func (x *PartyLeave) GetPartyId() string { // Promote a new party leader. type PartyPromote struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to promote a new leader for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence of an existing party member to promote as the new leader. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyPromote) Reset() { *x = PartyPromote{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyPromote) String() string { @@ -2842,7 +2868,7 @@ func (*PartyPromote) ProtoMessage() {} func (x *PartyPromote) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2873,23 +2899,20 @@ func (x *PartyPromote) GetPresence() *UserPresence { // Announcement of a new party leader. type PartyLeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to announce the new leader for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence of the new party leader. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyLeader) Reset() { *x = PartyLeader{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyLeader) String() string { @@ -2900,7 +2923,7 @@ func (*PartyLeader) ProtoMessage() {} func (x *PartyLeader) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2931,23 +2954,20 @@ func (x *PartyLeader) GetPresence() *UserPresence { // Accept a request to join. type PartyAccept struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to accept a join request for. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence to accept as a party member. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyAccept) Reset() { *x = PartyAccept{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyAccept) String() string { @@ -2958,7 +2978,7 @@ func (*PartyAccept) ProtoMessage() {} func (x *PartyAccept) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2989,23 +3009,20 @@ func (x *PartyAccept) GetPresence() *UserPresence { // Kick a party member, or decline a request to join. type PartyRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to remove/reject from. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The presence to remove or reject. - Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + Presence *UserPresence `protobuf:"bytes,2,opt,name=presence,proto3" json:"presence,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyRemove) Reset() { *x = PartyRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyRemove) String() string { @@ -3016,7 +3033,7 @@ func (*PartyRemove) ProtoMessage() {} func (x *PartyRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3047,21 +3064,18 @@ func (x *PartyRemove) GetPresence() *UserPresence { // End a party, kicking all party members and closing it. type PartyClose struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to close. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyClose) Reset() { *x = PartyClose{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyClose) String() string { @@ -3072,7 +3086,7 @@ func (*PartyClose) ProtoMessage() {} func (x *PartyClose) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3096,21 +3110,18 @@ func (x *PartyClose) GetPartyId() string { // Request a list of pending join requests for a party. type PartyJoinRequestList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to get a list of join requests for. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyJoinRequestList) Reset() { *x = PartyJoinRequestList{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyJoinRequestList) String() string { @@ -3121,7 +3132,7 @@ func (*PartyJoinRequestList) ProtoMessage() {} func (x *PartyJoinRequestList) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3145,23 +3156,20 @@ func (x *PartyJoinRequestList) GetPartyId() string { // Incoming notification for one or more new presences attempting to join the party. type PartyJoinRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID these presences are attempting to join. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Presences attempting to join. - Presences []*UserPresence `protobuf:"bytes,2,rep,name=presences,proto3" json:"presences,omitempty"` + Presences []*UserPresence `protobuf:"bytes,2,rep,name=presences,proto3" json:"presences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyJoinRequest) Reset() { *x = PartyJoinRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyJoinRequest) String() string { @@ -3172,7 +3180,7 @@ func (*PartyJoinRequest) ProtoMessage() {} func (x *PartyJoinRequest) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3203,10 +3211,7 @@ func (x *PartyJoinRequest) GetPresences() []*UserPresence { // Begin matchmaking as a party. type PartyMatchmakerAdd struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Minimum total user count to match together. @@ -3216,20 +3221,20 @@ type PartyMatchmakerAdd struct { // Filter query used to identify suitable users. Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` // Optional multiple of the count that must be satisfied. CountMultiple *wrapperspb.Int32Value `protobuf:"bytes,7,opt,name=count_multiple,json=countMultiple,proto3" json:"count_multiple,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyMatchmakerAdd) Reset() { *x = PartyMatchmakerAdd{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyMatchmakerAdd) String() string { @@ -3240,7 +3245,7 @@ func (*PartyMatchmakerAdd) ProtoMessage() {} func (x *PartyMatchmakerAdd) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3306,23 +3311,20 @@ func (x *PartyMatchmakerAdd) GetCountMultiple() *wrapperspb.Int32Value { // Cancel a party matchmaking process using a ticket. type PartyMatchmakerRemove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The ticket to cancel. - Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyMatchmakerRemove) Reset() { *x = PartyMatchmakerRemove{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyMatchmakerRemove) String() string { @@ -3333,7 +3335,7 @@ func (*PartyMatchmakerRemove) ProtoMessage() {} func (x *PartyMatchmakerRemove) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3364,23 +3366,20 @@ func (x *PartyMatchmakerRemove) GetTicket() string { // A response from starting a new party matchmaking process. type PartyMatchmakerTicket struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // The ticket that can be used to cancel matchmaking. - Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + Ticket string `protobuf:"bytes,2,opt,name=ticket,proto3" json:"ticket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyMatchmakerTicket) Reset() { *x = PartyMatchmakerTicket{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyMatchmakerTicket) String() string { @@ -3391,7 +3390,7 @@ func (*PartyMatchmakerTicket) ProtoMessage() {} func (x *PartyMatchmakerTicket) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3422,10 +3421,7 @@ func (x *PartyMatchmakerTicket) GetTicket() string { // Incoming party data delivered from the server. type PartyData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // A reference to the user presence that sent this data, if any. @@ -3433,16 +3429,16 @@ type PartyData struct { // Op code value. OpCode int64 `protobuf:"varint,3,opt,name=op_code,json=opCode,proto3" json:"op_code,omitempty"` // Data payload, if any. - Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyData) Reset() { *x = PartyData{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyData) String() string { @@ -3453,7 +3449,7 @@ func (*PartyData) ProtoMessage() {} func (x *PartyData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3498,25 +3494,22 @@ func (x *PartyData) GetData() []byte { // Send data to a party. type PartyDataSend struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Party ID to send to. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // Op code value. OpCode int64 `protobuf:"varint,2,opt,name=op_code,json=opCode,proto3" json:"op_code,omitempty"` // Data payload, if any. - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyDataSend) Reset() { *x = PartyDataSend{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyDataSend) String() string { @@ -3527,7 +3520,7 @@ func (*PartyDataSend) ProtoMessage() {} func (x *PartyDataSend) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3565,25 +3558,22 @@ func (x *PartyDataSend) GetData() []byte { // Presence update for a particular party. type PartyPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The party ID. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // User presences that have just joined the party. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // User presences that have just left the party. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PartyPresenceEvent) Reset() { *x = PartyPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PartyPresenceEvent) String() string { @@ -3594,7 +3584,7 @@ func (*PartyPresenceEvent) ProtoMessage() {} func (x *PartyPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3632,18 +3622,16 @@ func (x *PartyPresenceEvent) GetLeaves() []*UserPresence { // Application-level heartbeat and connection check. type Ping struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Ping) Reset() { *x = Ping{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Ping) String() string { @@ -3654,7 +3642,7 @@ func (*Ping) ProtoMessage() {} func (x *Ping) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3671,18 +3659,16 @@ func (*Ping) Descriptor() ([]byte, []int) { // Application-level heartbeat and connection check response. type Pong struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Pong) Reset() { *x = Pong{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Pong) String() string { @@ -3693,7 +3679,7 @@ func (*Pong) ProtoMessage() {} func (x *Pong) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3710,21 +3696,18 @@ func (*Pong) Descriptor() ([]byte, []int) { // A snapshot of statuses for some set of users. type Status struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User statuses. - Presences []*UserPresence `protobuf:"bytes,1,rep,name=presences,proto3" json:"presences,omitempty"` + Presences []*UserPresence `protobuf:"bytes,1,rep,name=presences,proto3" json:"presences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Status) Reset() { *x = Status{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Status) String() string { @@ -3735,7 +3718,7 @@ func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3759,23 +3742,20 @@ func (x *Status) GetPresences() []*UserPresence { // Start receiving status updates for some set of users. type StatusFollow struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User IDs to follow. UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` // Usernames to follow. - Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + Usernames []string `protobuf:"bytes,2,rep,name=usernames,proto3" json:"usernames,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusFollow) Reset() { *x = StatusFollow{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusFollow) String() string { @@ -3786,7 +3766,7 @@ func (*StatusFollow) ProtoMessage() {} func (x *StatusFollow) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3817,23 +3797,20 @@ func (x *StatusFollow) GetUsernames() []string { // A batch of status updates for a given user. type StatusPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // New statuses for the user. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // Previous statuses for the user. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusPresenceEvent) Reset() { *x = StatusPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusPresenceEvent) String() string { @@ -3844,7 +3821,7 @@ func (*StatusPresenceEvent) ProtoMessage() {} func (x *StatusPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3875,21 +3852,18 @@ func (x *StatusPresenceEvent) GetLeaves() []*UserPresence { // Stop receiving status updates for some set of users. type StatusUnfollow struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Users to unfollow. - UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + UserIds []string `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusUnfollow) Reset() { *x = StatusUnfollow{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusUnfollow) String() string { @@ -3900,7 +3874,7 @@ func (*StatusUnfollow) ProtoMessage() {} func (x *StatusUnfollow) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3924,21 +3898,18 @@ func (x *StatusUnfollow) GetUserIds() []string { // Set the user's own status. type StatusUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Status string to set, if not present the user will appear offline. - Status *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Status *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StatusUpdate) Reset() { *x = StatusUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusUpdate) String() string { @@ -3949,7 +3920,7 @@ func (*StatusUpdate) ProtoMessage() {} func (x *StatusUpdate) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3973,10 +3944,7 @@ func (x *StatusUpdate) GetStatus() *wrapperspb.StringValue { // Represents identifying information for a stream. type Stream struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Mode identifies the type of stream. Mode int32 `protobuf:"varint,1,opt,name=mode,proto3" json:"mode,omitempty"` // Subject is the primary identifier, if any. @@ -3984,16 +3952,16 @@ type Stream struct { // Subcontext is a secondary identifier, if any. Subcontext string `protobuf:"bytes,3,opt,name=subcontext,proto3" json:"subcontext,omitempty"` // The label is an arbitrary identifying string, if the stream has one. - Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"` + Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Stream) Reset() { *x = Stream{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Stream) String() string { @@ -4004,7 +3972,7 @@ func (*Stream) ProtoMessage() {} func (x *Stream) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4049,10 +4017,7 @@ func (x *Stream) GetLabel() string { // A data message delivered over a stream. type StreamData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The stream this data message relates to. Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` // The sender, if any. @@ -4060,16 +4025,16 @@ type StreamData struct { // Arbitrary contents of the data message. Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // True if this data was delivered reliably, false otherwise. - Reliable bool `protobuf:"varint,4,opt,name=reliable,proto3" json:"reliable,omitempty"` + Reliable bool `protobuf:"varint,4,opt,name=reliable,proto3" json:"reliable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StreamData) Reset() { *x = StreamData{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StreamData) String() string { @@ -4080,7 +4045,7 @@ func (*StreamData) ProtoMessage() {} func (x *StreamData) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4125,25 +4090,22 @@ func (x *StreamData) GetReliable() bool { // A set of joins and leaves on a particular stream. type StreamPresenceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The stream this event relates to. Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` // Presences joining the stream as part of this event, if any. Joins []*UserPresence `protobuf:"bytes,2,rep,name=joins,proto3" json:"joins,omitempty"` // Presences leaving the stream as part of this event, if any. - Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + Leaves []*UserPresence `protobuf:"bytes,3,rep,name=leaves,proto3" json:"leaves,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StreamPresenceEvent) Reset() { *x = StreamPresenceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StreamPresenceEvent) String() string { @@ -4154,7 +4116,7 @@ func (*StreamPresenceEvent) ProtoMessage() {} func (x *StreamPresenceEvent) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4192,10 +4154,7 @@ func (x *StreamPresenceEvent) GetLeaves() []*UserPresence { // A user session associated to a stream, usually through a list operation or a join/leave event. type UserPresence struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The user this presence belongs to. UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // A unique session ID identifying the particular connection, because the user may have many. @@ -4205,16 +4164,16 @@ type UserPresence struct { // Whether this presence generates persistent data/messages, if applicable for the stream type. Persistence bool `protobuf:"varint,4,opt,name=persistence,proto3" json:"persistence,omitempty"` // A user-set status message for this stream, if applicable. - Status *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + Status *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserPresence) Reset() { *x = UserPresence{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserPresence) String() string { @@ -4225,7 +4184,7 @@ func (*UserPresence) ProtoMessage() {} func (x *UserPresence) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4276,27 +4235,24 @@ func (x *UserPresence) GetStatus() *wrapperspb.StringValue { } type MatchmakerMatched_MatchmakerUser struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User info. Presence *UserPresence `protobuf:"bytes,1,opt,name=presence,proto3" json:"presence,omitempty"` // Party identifier, if this user was matched as a party member. PartyId string `protobuf:"bytes,2,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` // String properties. - StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StringProperties map[string]string `protobuf:"bytes,5,rep,name=string_properties,json=stringProperties,proto3" json:"string_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Numeric properties. - NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + NumericProperties map[string]float64 `protobuf:"bytes,6,rep,name=numeric_properties,json=numericProperties,proto3" json:"numeric_properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MatchmakerMatched_MatchmakerUser) Reset() { *x = MatchmakerMatched_MatchmakerUser{} - if protoimpl.UnsafeEnabled { - mi := &file_realtime_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_realtime_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MatchmakerMatched_MatchmakerUser) String() string { @@ -4307,7 +4263,7 @@ func (*MatchmakerMatched_MatchmakerUser) ProtoMessage() {} func (x *MatchmakerMatched_MatchmakerUser) ProtoReflect() protoreflect.Message { mi := &file_realtime_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4352,735 +4308,346 @@ func (x *MatchmakerMatched_MatchmakerUser) GetNumericProperties() map[string]flo var File_realtime_proto protoreflect.FileDescriptor -var file_realtime_proto_rawDesc = []byte{ - 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x0f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x0d, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xf4, 0x1b, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x69, 0x64, - 0x12, 0x34, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x41, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x48, - 0x00, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, - 0x45, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x57, 0x0a, 0x14, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x48, - 0x00, 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x14, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, 0x52, 0x14, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x3b, 0x0a, 0x0a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x09, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x3e, 0x0a, 0x0b, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x12, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, - 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x12, 0x50, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, - 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, - 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x48, 0x00, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x03, - 0x72, 0x70, 0x63, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x70, 0x63, 0x48, 0x00, 0x52, 0x03, 0x72, 0x70, - 0x63, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x66, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x5a, 0x0a, 0x15, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x13, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x5f, 0x75, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, - 0x48, 0x00, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x5a, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x20, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, - 0x67, 0x12, 0x2b, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x2e, - 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x41, - 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x23, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, - 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, - 0x6e, 0x48, 0x00, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x3e, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x25, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, - 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x44, - 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, - 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, - 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x3e, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x2a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x5e, 0x0a, - 0x17, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x51, 0x0a, - 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x57, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, - 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x60, 0x0a, 0x17, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x48, 0x00, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x60, 0x0a, 0x17, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, - 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, - 0x63, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, - 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x30, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, - 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0f, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x31, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x65, 0x6e, 0x64, 0x12, 0x57, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x32, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x07, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, - 0x73, 0x65, 0x6c, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, 0xf2, 0x01, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x45, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4f, 0x4d, - 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x45, 0x53, - 0x53, 0x41, 0x47, 0x45, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, - 0x03, 0x22, 0x2d, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, - 0x22, 0xcc, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x70, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, - 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, 0x12, - 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, 0x22, - 0x4d, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x6e, - 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x54, - 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x22, 0x99, 0x02, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, - 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, - 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x4f, 0x6e, 0x65, - 0x12, 0x1e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x77, 0x6f, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x54, 0x77, 0x6f, - 0x22, 0xfc, 0x02, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x11, - 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x4e, 0x52, 0x45, 0x43, 0x4f, 0x47, 0x4e, 0x49, - 0x5a, 0x45, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, - 0x0f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x41, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, - 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, - 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, - 0x1e, 0x0a, 0x1a, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x06, 0x12, - 0x1e, 0x0a, 0x1a, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x22, - 0x80, 0x02, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, - 0x31, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x73, 0x65, - 0x6c, 0x66, 0x22, 0x21, 0x0a, 0x0b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x39, - 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x65, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4a, - 0x6f, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x44, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4a, 0x6f, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, - 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x04, 0x0a, 0x02, 0x69, - 0x64, 0x22, 0x27, 0x0a, 0x0a, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, - 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, - 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0xf7, 0x03, 0x0a, 0x0d, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, - 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, - 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x61, 0x0a, 0x11, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x64, 0x0a, - 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xd9, 0x05, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, - 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x12, 0x1b, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x47, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, - 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x45, - 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x04, 0x73, 0x65, 0x6c, 0x66, 0x1a, 0xe0, 0x03, 0x0a, 0x0e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, - 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x74, - 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x48, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x64, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, - 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x43, 0x0a, - 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x04, 0x0a, 0x02, 0x69, 0x64, 0x22, 0x2a, - 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x2a, 0x0a, 0x10, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x4f, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf8, 0x01, 0x0a, 0x05, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x73, - 0x65, 0x6c, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x12, 0x35, - 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, - 0x22, 0x26, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x19, 0x0a, - 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0x27, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x22, 0x64, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x0b, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x27, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, - 0x31, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x49, 0x64, 0x22, 0x6a, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xa1, - 0x04, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x66, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x65, - 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x41, 0x64, 0x64, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x4a, - 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x57, 0x0a, 0x0d, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6c, - 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, - 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, - 0x65, 0x73, 0x22, 0x06, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x22, 0x06, 0x0a, 0x04, 0x50, 0x6f, - 0x6e, 0x67, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, - 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, - 0x35, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, - 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x55, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x06, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa4, 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xb2, - 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, - 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6a, 0x6f, 0x69, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x06, - 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x6c, 0x65, 0x61, - 0x76, 0x65, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x42, 0x6c, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, - 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x72, 0x74, 0x61, 0x70, 0x69, 0x42, - 0x0e, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x50, - 0x01, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, - 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x72, 0x74, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0f, 0x4e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_realtime_proto_rawDesc = "" + + "\n" + + "\x0erealtime.proto\x12\x0fnakama.realtime\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\rapi/api.proto\"\xf4\x1b\n" + + "\bEnvelope\x12\x10\n" + + "\x03cid\x18\x01 \x01(\tR\x03cid\x124\n" + + "\achannel\x18\x02 \x01(\v2\x18.nakama.realtime.ChannelH\x00R\achannel\x12A\n" + + "\fchannel_join\x18\x03 \x01(\v2\x1c.nakama.realtime.ChannelJoinH\x00R\vchannelJoin\x12D\n" + + "\rchannel_leave\x18\x04 \x01(\v2\x1d.nakama.realtime.ChannelLeaveH\x00R\fchannelLeave\x12E\n" + + "\x0fchannel_message\x18\x05 \x01(\v2\x1a.nakama.api.ChannelMessageH\x00R\x0echannelMessage\x12T\n" + + "\x13channel_message_ack\x18\x06 \x01(\v2\".nakama.realtime.ChannelMessageAckH\x00R\x11channelMessageAck\x12W\n" + + "\x14channel_message_send\x18\a \x01(\v2#.nakama.realtime.ChannelMessageSendH\x00R\x12channelMessageSend\x12]\n" + + "\x16channel_message_update\x18\b \x01(\v2%.nakama.realtime.ChannelMessageUpdateH\x00R\x14channelMessageUpdate\x12]\n" + + "\x16channel_message_remove\x18\t \x01(\v2%.nakama.realtime.ChannelMessageRemoveH\x00R\x14channelMessageRemove\x12]\n" + + "\x16channel_presence_event\x18\n" + + " \x01(\v2%.nakama.realtime.ChannelPresenceEventH\x00R\x14channelPresenceEvent\x12.\n" + + "\x05error\x18\v \x01(\v2\x16.nakama.realtime.ErrorH\x00R\x05error\x12.\n" + + "\x05match\x18\f \x01(\v2\x16.nakama.realtime.MatchH\x00R\x05match\x12A\n" + + "\fmatch_create\x18\r \x01(\v2\x1c.nakama.realtime.MatchCreateH\x00R\vmatchCreate\x12;\n" + + "\n" + + "match_data\x18\x0e \x01(\v2\x1a.nakama.realtime.MatchDataH\x00R\tmatchData\x12H\n" + + "\x0fmatch_data_send\x18\x0f \x01(\v2\x1e.nakama.realtime.MatchDataSendH\x00R\rmatchDataSend\x12;\n" + + "\n" + + "match_join\x18\x10 \x01(\v2\x1a.nakama.realtime.MatchJoinH\x00R\tmatchJoin\x12>\n" + + "\vmatch_leave\x18\x11 \x01(\v2\x1b.nakama.realtime.MatchLeaveH\x00R\n" + + "matchLeave\x12W\n" + + "\x14match_presence_event\x18\x12 \x01(\v2#.nakama.realtime.MatchPresenceEventH\x00R\x12matchPresenceEvent\x12G\n" + + "\x0ematchmaker_add\x18\x13 \x01(\v2\x1e.nakama.realtime.MatchmakerAddH\x00R\rmatchmakerAdd\x12S\n" + + "\x12matchmaker_matched\x18\x14 \x01(\v2\".nakama.realtime.MatchmakerMatchedH\x00R\x11matchmakerMatched\x12P\n" + + "\x11matchmaker_remove\x18\x15 \x01(\v2!.nakama.realtime.MatchmakerRemoveH\x00R\x10matchmakerRemove\x12P\n" + + "\x11matchmaker_ticket\x18\x16 \x01(\v2!.nakama.realtime.MatchmakerTicketH\x00R\x10matchmakerTicket\x12F\n" + + "\rnotifications\x18\x17 \x01(\v2\x1e.nakama.realtime.NotificationsH\x00R\rnotifications\x12#\n" + + "\x03rpc\x18\x18 \x01(\v2\x0f.nakama.api.RpcH\x00R\x03rpc\x121\n" + + "\x06status\x18\x19 \x01(\v2\x17.nakama.realtime.StatusH\x00R\x06status\x12D\n" + + "\rstatus_follow\x18\x1a \x01(\v2\x1d.nakama.realtime.StatusFollowH\x00R\fstatusFollow\x12Z\n" + + "\x15status_presence_event\x18\x1b \x01(\v2$.nakama.realtime.StatusPresenceEventH\x00R\x13statusPresenceEvent\x12J\n" + + "\x0fstatus_unfollow\x18\x1c \x01(\v2\x1f.nakama.realtime.StatusUnfollowH\x00R\x0estatusUnfollow\x12D\n" + + "\rstatus_update\x18\x1d \x01(\v2\x1d.nakama.realtime.StatusUpdateH\x00R\fstatusUpdate\x12>\n" + + "\vstream_data\x18\x1e \x01(\v2\x1b.nakama.realtime.StreamDataH\x00R\n" + + "streamData\x12Z\n" + + "\x15stream_presence_event\x18\x1f \x01(\v2$.nakama.realtime.StreamPresenceEventH\x00R\x13streamPresenceEvent\x12+\n" + + "\x04ping\x18 \x01(\v2\x15.nakama.realtime.PingH\x00R\x04ping\x12+\n" + + "\x04pong\x18! \x01(\v2\x15.nakama.realtime.PongH\x00R\x04pong\x12.\n" + + "\x05party\x18\" \x01(\v2\x16.nakama.realtime.PartyH\x00R\x05party\x12A\n" + + "\fparty_create\x18# \x01(\v2\x1c.nakama.realtime.PartyCreateH\x00R\vpartyCreate\x12;\n" + + "\n" + + "party_join\x18$ \x01(\v2\x1a.nakama.realtime.PartyJoinH\x00R\tpartyJoin\x12>\n" + + "\vparty_leave\x18% \x01(\v2\x1b.nakama.realtime.PartyLeaveH\x00R\n" + + "partyLeave\x12D\n" + + "\rparty_promote\x18& \x01(\v2\x1d.nakama.realtime.PartyPromoteH\x00R\fpartyPromote\x12A\n" + + "\fparty_leader\x18' \x01(\v2\x1c.nakama.realtime.PartyLeaderH\x00R\vpartyLeader\x12A\n" + + "\fparty_accept\x18( \x01(\v2\x1c.nakama.realtime.PartyAcceptH\x00R\vpartyAccept\x12A\n" + + "\fparty_remove\x18) \x01(\v2\x1c.nakama.realtime.PartyRemoveH\x00R\vpartyRemove\x12>\n" + + "\vparty_close\x18* \x01(\v2\x1b.nakama.realtime.PartyCloseH\x00R\n" + + "partyClose\x12^\n" + + "\x17party_join_request_list\x18+ \x01(\v2%.nakama.realtime.PartyJoinRequestListH\x00R\x14partyJoinRequestList\x12Q\n" + + "\x12party_join_request\x18, \x01(\v2!.nakama.realtime.PartyJoinRequestH\x00R\x10partyJoinRequest\x12W\n" + + "\x14party_matchmaker_add\x18- \x01(\v2#.nakama.realtime.PartyMatchmakerAddH\x00R\x12partyMatchmakerAdd\x12`\n" + + "\x17party_matchmaker_remove\x18. \x01(\v2&.nakama.realtime.PartyMatchmakerRemoveH\x00R\x15partyMatchmakerRemove\x12`\n" + + "\x17party_matchmaker_ticket\x18/ \x01(\v2&.nakama.realtime.PartyMatchmakerTicketH\x00R\x15partyMatchmakerTicket\x12;\n" + + "\n" + + "party_data\x180 \x01(\v2\x1a.nakama.realtime.PartyDataH\x00R\tpartyData\x12H\n" + + "\x0fparty_data_send\x181 \x01(\v2\x1e.nakama.realtime.PartyDataSendH\x00R\rpartyDataSend\x12W\n" + + "\x14party_presence_event\x182 \x01(\v2#.nakama.realtime.PartyPresenceEventH\x00R\x12partyPresenceEventB\t\n" + + "\amessage\"\x81\x02\n" + + "\aChannel\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12;\n" + + "\tpresences\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x121\n" + + "\x04self\x18\x03 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\x12\x1b\n" + + "\troom_name\x18\x04 \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\x05 \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\x06 \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\a \x01(\tR\tuserIdTwo\"\xf2\x01\n" + + "\vChannelJoin\x12\x16\n" + + "\x06target\x18\x01 \x01(\tR\x06target\x12\x12\n" + + "\x04type\x18\x02 \x01(\x05R\x04type\x12<\n" + + "\vpersistence\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\vpersistence\x122\n" + + "\x06hidden\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\x06hidden\"E\n" + + "\x04Type\x12\x14\n" + + "\x10TYPE_UNSPECIFIED\x10\x00\x12\b\n" + + "\x04ROOM\x10\x01\x12\x12\n" + + "\x0eDIRECT_MESSAGE\x10\x02\x12\t\n" + + "\x05GROUP\x10\x03\"-\n" + + "\fChannelLeave\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\"\xcc\x03\n" + + "\x11ChannelMessageAck\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\x12/\n" + + "\x04code\x18\x03 \x01(\v2\x1b.google.protobuf.Int32ValueR\x04code\x12\x1a\n" + + "\busername\x18\x04 \x01(\tR\busername\x12;\n" + + "\vcreate_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12:\n" + + "\n" + + "persistent\x18\a \x01(\v2\x1a.google.protobuf.BoolValueR\n" + + "persistent\x12\x1b\n" + + "\troom_name\x18\b \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\t \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\n" + + " \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\v \x01(\tR\tuserIdTwo\"M\n" + + "\x12ChannelMessageSend\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x18\n" + + "\acontent\x18\x02 \x01(\tR\acontent\"n\n" + + "\x14ChannelMessageUpdate\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\x12\x18\n" + + "\acontent\x18\x03 \x01(\tR\acontent\"T\n" + + "\x14ChannelMessageRemove\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" + + "\n" + + "message_id\x18\x02 \x01(\tR\tmessageId\"\x99\x02\n" + + "\x14ChannelPresenceEvent\x12\x1d\n" + + "\n" + + "channel_id\x18\x01 \x01(\tR\tchannelId\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\x12\x1b\n" + + "\troom_name\x18\x04 \x01(\tR\broomName\x12\x19\n" + + "\bgroup_id\x18\x05 \x01(\tR\agroupId\x12\x1e\n" + + "\vuser_id_one\x18\x06 \x01(\tR\tuserIdOne\x12\x1e\n" + + "\vuser_id_two\x18\a \x01(\tR\tuserIdTwo\"\xfc\x02\n" + + "\x05Error\x12\x12\n" + + "\x04code\x18\x01 \x01(\x05R\x04code\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\x12=\n" + + "\acontext\x18\x03 \x03(\v2#.nakama.realtime.Error.ContextEntryR\acontext\x1a:\n" + + "\fContextEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc9\x01\n" + + "\x04Code\x12\x15\n" + + "\x11RUNTIME_EXCEPTION\x10\x00\x12\x18\n" + + "\x14UNRECOGNIZED_PAYLOAD\x10\x01\x12\x13\n" + + "\x0fMISSING_PAYLOAD\x10\x02\x12\r\n" + + "\tBAD_INPUT\x10\x03\x12\x13\n" + + "\x0fMATCH_NOT_FOUND\x10\x04\x12\x17\n" + + "\x13MATCH_JOIN_REJECTED\x10\x05\x12\x1e\n" + + "\x1aRUNTIME_FUNCTION_NOT_FOUND\x10\x06\x12\x1e\n" + + "\x1aRUNTIME_FUNCTION_EXCEPTION\x10\a\"\x80\x02\n" + + "\x05Match\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12$\n" + + "\rauthoritative\x18\x02 \x01(\bR\rauthoritative\x122\n" + + "\x05label\x18\x03 \x01(\v2\x1c.google.protobuf.StringValueR\x05label\x12\x12\n" + + "\x04size\x18\x04 \x01(\x05R\x04size\x12;\n" + + "\tpresences\x18\x05 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x121\n" + + "\x04self\x18\x06 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\"!\n" + + "\vMatchCreate\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"\xaa\x01\n" + + "\tMatchData\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x17\n" + + "\aop_code\x18\x03 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x04 \x01(\fR\x04data\x12\x1a\n" + + "\breliable\x18\x05 \x01(\bR\breliable\"\xb0\x01\n" + + "\rMatchDataSend\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x12\x17\n" + + "\aop_code\x18\x02 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x03 \x01(\fR\x04data\x12;\n" + + "\tpresences\x18\x04 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\x12\x1a\n" + + "\breliable\x18\x05 \x01(\bR\breliable\"\xc9\x01\n" + + "\tMatchJoin\x12\x1b\n" + + "\bmatch_id\x18\x01 \x01(\tH\x00R\amatchId\x12\x16\n" + + "\x05token\x18\x02 \x01(\tH\x00R\x05token\x12D\n" + + "\bmetadata\x18\x03 \x03(\v2(.nakama.realtime.MatchJoin.MetadataEntryR\bmetadata\x1a;\n" + + "\rMetadataEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x04\n" + + "\x02id\"'\n" + + "\n" + + "MatchLeave\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\"\x9b\x01\n" + + "\x12MatchPresenceEvent\x12\x19\n" + + "\bmatch_id\x18\x01 \x01(\tR\amatchId\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\xf7\x03\n" + + "\rMatchmakerAdd\x12\x1b\n" + + "\tmin_count\x18\x01 \x01(\x05R\bminCount\x12\x1b\n" + + "\tmax_count\x18\x02 \x01(\x05R\bmaxCount\x12\x14\n" + + "\x05query\x18\x03 \x01(\tR\x05query\x12a\n" + + "\x11string_properties\x18\x04 \x03(\v24.nakama.realtime.MatchmakerAdd.StringPropertiesEntryR\x10stringProperties\x12d\n" + + "\x12numeric_properties\x18\x05 \x03(\v25.nakama.realtime.MatchmakerAdd.NumericPropertiesEntryR\x11numericProperties\x12B\n" + + "\x0ecount_multiple\x18\x06 \x01(\v2\x1b.google.protobuf.Int32ValueR\rcountMultiple\x1aC\n" + + "\x15StringPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + + "\x16NumericPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01\"\xd9\x05\n" + + "\x11MatchmakerMatched\x12\x16\n" + + "\x06ticket\x18\x01 \x01(\tR\x06ticket\x12\x1b\n" + + "\bmatch_id\x18\x02 \x01(\tH\x00R\amatchId\x12\x16\n" + + "\x05token\x18\x03 \x01(\tH\x00R\x05token\x12G\n" + + "\x05users\x18\x04 \x03(\v21.nakama.realtime.MatchmakerMatched.MatchmakerUserR\x05users\x12E\n" + + "\x04self\x18\x05 \x01(\v21.nakama.realtime.MatchmakerMatched.MatchmakerUserR\x04self\x1a\xe0\x03\n" + + "\x0eMatchmakerUser\x129\n" + + "\bpresence\x18\x01 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x19\n" + + "\bparty_id\x18\x02 \x01(\tR\apartyId\x12t\n" + + "\x11string_properties\x18\x05 \x03(\v2G.nakama.realtime.MatchmakerMatched.MatchmakerUser.StringPropertiesEntryR\x10stringProperties\x12w\n" + + "\x12numeric_properties\x18\x06 \x03(\v2H.nakama.realtime.MatchmakerMatched.MatchmakerUser.NumericPropertiesEntryR\x11numericProperties\x1aC\n" + + "\x15StringPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + + "\x16NumericPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01B\x04\n" + + "\x02id\"*\n" + + "\x10MatchmakerRemove\x12\x16\n" + + "\x06ticket\x18\x01 \x01(\tR\x06ticket\"*\n" + + "\x10MatchmakerTicket\x12\x16\n" + + "\x06ticket\x18\x01 \x01(\tR\x06ticket\"O\n" + + "\rNotifications\x12>\n" + + "\rnotifications\x18\x01 \x03(\v2\x18.nakama.api.NotificationR\rnotifications\"\xf8\x01\n" + + "\x05Party\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x12\n" + + "\x04open\x18\x02 \x01(\bR\x04open\x12\x19\n" + + "\bmax_size\x18\x03 \x01(\x05R\amaxSize\x121\n" + + "\x04self\x18\x04 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x04self\x125\n" + + "\x06leader\x18\x05 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x06leader\x12;\n" + + "\tpresences\x18\x06 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"<\n" + + "\vPartyCreate\x12\x12\n" + + "\x04open\x18\x01 \x01(\bR\x04open\x12\x19\n" + + "\bmax_size\x18\x02 \x01(\x05R\amaxSize\"&\n" + + "\tPartyJoin\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"'\n" + + "\n" + + "PartyLeave\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"d\n" + + "\fPartyPromote\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + + "\vPartyLeader\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + + "\vPartyAccept\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"c\n" + + "\vPartyRemove\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\"'\n" + + "\n" + + "PartyClose\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"1\n" + + "\x14PartyJoinRequestList\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\"j\n" + + "\x10PartyJoinRequest\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12;\n" + + "\tpresences\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"\xa1\x04\n" + + "\x12PartyMatchmakerAdd\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x1b\n" + + "\tmin_count\x18\x02 \x01(\x05R\bminCount\x12\x1b\n" + + "\tmax_count\x18\x03 \x01(\x05R\bmaxCount\x12\x14\n" + + "\x05query\x18\x04 \x01(\tR\x05query\x12f\n" + + "\x11string_properties\x18\x05 \x03(\v29.nakama.realtime.PartyMatchmakerAdd.StringPropertiesEntryR\x10stringProperties\x12i\n" + + "\x12numeric_properties\x18\x06 \x03(\v2:.nakama.realtime.PartyMatchmakerAdd.NumericPropertiesEntryR\x11numericProperties\x12B\n" + + "\x0ecount_multiple\x18\a \x01(\v2\x1b.google.protobuf.Int32ValueR\rcountMultiple\x1aC\n" + + "\x15StringPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + + "\x16NumericPropertiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\x01R\x05value:\x028\x01\"J\n" + + "\x15PartyMatchmakerRemove\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x16\n" + + "\x06ticket\x18\x02 \x01(\tR\x06ticket\"J\n" + + "\x15PartyMatchmakerTicket\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x16\n" + + "\x06ticket\x18\x02 \x01(\tR\x06ticket\"\x8e\x01\n" + + "\tPartyData\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x129\n" + + "\bpresence\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\bpresence\x12\x17\n" + + "\aop_code\x18\x03 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x04 \x01(\fR\x04data\"W\n" + + "\rPartyDataSend\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x12\x17\n" + + "\aop_code\x18\x02 \x01(\x03R\x06opCode\x12\x12\n" + + "\x04data\x18\x03 \x01(\fR\x04data\"\x9b\x01\n" + + "\x12PartyPresenceEvent\x12\x19\n" + + "\bparty_id\x18\x01 \x01(\tR\apartyId\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\x06\n" + + "\x04Ping\"\x06\n" + + "\x04Pong\"E\n" + + "\x06Status\x12;\n" + + "\tpresences\x18\x01 \x03(\v2\x1d.nakama.realtime.UserPresenceR\tpresences\"G\n" + + "\fStatusFollow\x12\x19\n" + + "\buser_ids\x18\x01 \x03(\tR\auserIds\x12\x1c\n" + + "\tusernames\x18\x02 \x03(\tR\tusernames\"\x81\x01\n" + + "\x13StatusPresenceEvent\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"+\n" + + "\x0eStatusUnfollow\x12\x19\n" + + "\buser_ids\x18\x01 \x03(\tR\auserIds\"D\n" + + "\fStatusUpdate\x124\n" + + "\x06status\x18\x01 \x01(\v2\x1c.google.protobuf.StringValueR\x06status\"l\n" + + "\x06Stream\x12\x12\n" + + "\x04mode\x18\x01 \x01(\x05R\x04mode\x12\x18\n" + + "\asubject\x18\x02 \x01(\tR\asubject\x12\x1e\n" + + "\n" + + "subcontext\x18\x03 \x01(\tR\n" + + "subcontext\x12\x14\n" + + "\x05label\x18\x04 \x01(\tR\x05label\"\xa4\x01\n" + + "\n" + + "StreamData\x12/\n" + + "\x06stream\x18\x01 \x01(\v2\x17.nakama.realtime.StreamR\x06stream\x125\n" + + "\x06sender\x18\x02 \x01(\v2\x1d.nakama.realtime.UserPresenceR\x06sender\x12\x12\n" + + "\x04data\x18\x03 \x01(\tR\x04data\x12\x1a\n" + + "\breliable\x18\x04 \x01(\bR\breliable\"\xb2\x01\n" + + "\x13StreamPresenceEvent\x12/\n" + + "\x06stream\x18\x01 \x01(\v2\x17.nakama.realtime.StreamR\x06stream\x123\n" + + "\x05joins\x18\x02 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x05joins\x125\n" + + "\x06leaves\x18\x03 \x03(\v2\x1d.nakama.realtime.UserPresenceR\x06leaves\"\xba\x01\n" + + "\fUserPresence\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + + "\n" + + "session_id\x18\x02 \x01(\tR\tsessionId\x12\x1a\n" + + "\busername\x18\x03 \x01(\tR\busername\x12 \n" + + "\vpersistence\x18\x04 \x01(\bR\vpersistence\x124\n" + + "\x06status\x18\x05 \x01(\v2\x1c.google.protobuf.StringValueR\x06statusBl\n" + + "\x1bcom.heroiclabs.nakama.rtapiB\x0eNakamaRealtimeP\x01Z)github.com/heroiclabs/nakama-common/rtapi\xaa\x02\x0fNakama.Protobufb\x06proto3" var ( file_realtime_proto_rawDescOnce sync.Once - file_realtime_proto_rawDescData = file_realtime_proto_rawDesc + file_realtime_proto_rawDescData []byte ) func file_realtime_proto_rawDescGZIP() []byte { file_realtime_proto_rawDescOnce.Do(func() { - file_realtime_proto_rawDescData = protoimpl.X.CompressGZIP(file_realtime_proto_rawDescData) + file_realtime_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_realtime_proto_rawDesc), len(file_realtime_proto_rawDesc))) }) return file_realtime_proto_rawDescData } var file_realtime_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_realtime_proto_msgTypes = make([]protoimpl.MessageInfo, 59) -var file_realtime_proto_goTypes = []interface{}{ +var file_realtime_proto_goTypes = []any{ (ChannelJoin_Type)(0), // 0: nakama.realtime.ChannelJoin.Type (Error_Code)(0), // 1: nakama.realtime.Error.Code (*Envelope)(nil), // 2: nakama.realtime.Envelope @@ -5264,621 +4831,7 @@ func file_realtime_proto_init() { if File_realtime_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_realtime_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Envelope); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Channel); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelJoin); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelLeave); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageAck); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageSend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelMessageRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Match); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchCreate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchDataSend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchJoin); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchLeave); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerAdd); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerMatched); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerTicket); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Notifications); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Party); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyCreate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyJoin); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyLeave); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyPromote); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyLeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyAccept); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyClose); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyJoinRequestList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyJoinRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMatchmakerAdd); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMatchmakerRemove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMatchmakerTicket); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyDataSend); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ping); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pong); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Status); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusFollow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUnfollow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Stream); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamPresenceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserPresence); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_realtime_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchmakerMatched_MatchmakerUser); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_realtime_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_realtime_proto_msgTypes[0].OneofWrappers = []any{ (*Envelope_Channel)(nil), (*Envelope_ChannelJoin)(nil), (*Envelope_ChannelLeave)(nil), @@ -5929,11 +4882,11 @@ func file_realtime_proto_init() { (*Envelope_PartyDataSend)(nil), (*Envelope_PartyPresenceEvent)(nil), } - file_realtime_proto_msgTypes[14].OneofWrappers = []interface{}{ + file_realtime_proto_msgTypes[14].OneofWrappers = []any{ (*MatchJoin_MatchId)(nil), (*MatchJoin_Token)(nil), } - file_realtime_proto_msgTypes[18].OneofWrappers = []interface{}{ + file_realtime_proto_msgTypes[18].OneofWrappers = []any{ (*MatchmakerMatched_MatchId)(nil), (*MatchmakerMatched_Token)(nil), } @@ -5941,7 +4894,7 @@ func file_realtime_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_realtime_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_realtime_proto_rawDesc), len(file_realtime_proto_rawDesc)), NumEnums: 2, NumMessages: 59, NumExtensions: 0, @@ -5953,7 +4906,6 @@ func file_realtime_proto_init() { MessageInfos: file_realtime_proto_msgTypes, }.Build() File_realtime_proto = out.File - file_realtime_proto_rawDesc = nil file_realtime_proto_goTypes = nil file_realtime_proto_depIdxs = nil } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go index 6784eaffab..ebdc0b00e2 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go @@ -93,6 +93,7 @@ type IAPConfig interface { GetGoogle() IAPGoogleConfig GetHuawei() IAPHuaweiConfig GetFacebookInstant() IAPFacebookInstantConfig + GetXbox() IAPXboxConfig } type IAPAppleConfig interface { @@ -125,6 +126,26 @@ type IAPFacebookInstantConfig interface { GetAppSecret() string } +type IAPXboxConfig interface { + GetToken() string +} + +type IAPPlaystationConfig interface { + GetToken() string +} + +type IAPEpicConfig interface { + GetToken() string +} + +type IAPSteamConfig interface { + GetAppId() string +} + +type IAPDiscordConfig interface { + GetToken() string +} + type GoogleAuthConfig interface { GetCredentialsJSON() string } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 6e8342b304..ebde10d04e 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -90,12 +90,14 @@ import ( "database/sql" "errors" "fmt" + "github.com/gofrs/uuid/v5" "net/http" "os" "time" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama-common/rtapi" + "go.uber.org/zap" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -309,6 +311,14 @@ type Logger interface { Fields() map[string]interface{} } +type PurchaseRefundFn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error +type SubscriptionRefundFn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, subscription *api.ValidatedSubscription, providerPayload string) error + +type RefundFns struct { + Purchase PurchaseRefundFn + Subscription SubscriptionRefundFn +} + /* Initializer is used to register various callback functions with the server. It is made available to the InitModule function as an input parameter when the function is invoked by the server when loading the module on server start. @@ -320,12 +330,7 @@ type Initializer interface { GetConfig returns a read only subset of the Nakama configuration values. */ GetConfig() (Config, error) - /* - RegisterRpc registers a function with the given ID. This ID can be used within client code to send an RPC message to - execute the function and return the result. Results are always returned as a JSON string (or optionally empty string). - If there is an issue with the RPC call, return an empty string and the associated error which will be returned to the client. - */ RegisterRpc(id string, fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, payload string) (string, error)) error /* @@ -376,6 +381,9 @@ type Initializer interface { // RegisterSubscriptionNotificationGoogle RegisterSubscriptionNotificationGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, subscription *api.ValidatedSubscription, providerPayload string) error) error + // RegisterPurchaseNotification + RegisterRefundHandler(platform string, purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) error + // RegisterBeforeGetAccount is used to register a function invoked when the server receives the relevant request. RegisterBeforeGetAccount(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule) error) error @@ -786,6 +794,36 @@ type Initializer interface { // RegisterAfterValidatePurchaseFacebookInstant can be used to perform additional logic after validating an Facebook Instant IAP receipt. RegisterAfterValidatePurchaseFacebookInstant(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error) error + // RegisterBeforeValidatePurchaseXbox can be used to perform additional logic before validating a Xbox Store receipt + RegisterBeforeValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error)) error + + // RegisterAfterValidatePurchaseXbox can be used to perform additional logic after validating a Xbox Store receipt + RegisterAfterValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error) error + + // RegisterBeforeValidatePurchasePlaystation can be used to perform additonal logic before validating a Playstation Store receipt + RegisterBeforeValidatePurchasePlaystation(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error)) error + + // RegisterAfterValidatePurchasePlaystation can be used to perform additional logic after validating a Playstation Store receipt + RegisterAfterValidatePurchasePlaystation(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error) error + // + //// RegisterBeforeValidatePurchaseEpic can be used to perform additonal logic before validating a Epic Store receipt + //RegisterBeforeValidatePurchaseEpic(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseEpicRequest) (*api.ValidatePurchaseEpicRequest, error)) error + // + //// RegisterAfterValidatePurchaseEpic can be used to perform additional logic after validating a Epic Store receipt + //RegisterAfterValidatePurchaseEpic(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseEpicRequest) error) error + // + //// RegisterBeforeValidatePurchaseSteam can be used to perform additonal logic before validating a Steam Store receipt + //RegisterBeforeValidatePurchaseSteam(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseSteamRequest) (*api.ValidatePurchaseSteamRequest, error)) error + // + //// RegisterAfterValidatePurchaseSteam can be used to perform additional logic after validating a Steam Store receipt + //RegisterAfterValidatePurchaseSteam(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseSteamRequest) error) error + // + //// RegisterBeforeValidatePurchaseDiscord can be used to perform additonal logic before validating a Discord Store receipt + //RegisterBeforeValidatePurchaseDiscord(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseDiscordRequest) (*api.ValidatePurchaseDiscordRequest, error)) error + // + //// RegisterAfterValidatePurchaseDiscord can be used to perform additional logic after validating a Discord Store receipt + //RegisterAfterValidatePurchaseDiscord(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseDiscordRequest) error) error + // RegisterBeforeListSubscriptions can be used to perform additional logic before listing subscriptions. RegisterBeforeListSubscriptions(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ListSubscriptionsRequest) (*api.ListSubscriptionsRequest, error)) error @@ -876,6 +914,9 @@ type Initializer interface { // RegisterFleetManager can be used to register a FleetManager implementation that can be retrieved from the runtime using GetFleetManager(). RegisterFleetManager(fleetManagerInit FleetManagerInitializer) error + // RegisterPurchaseProvider adds the purchaseProvider to the in the runtime map + RegisterPurchaseProvider(platform string, purchaseProvider PurchaseProvider) error + // RegisterShutdown can be used to register a function that is executed once the server receives a termination signal. // This function only fires if shutdown_grace_sec > 0 and will be terminated early if its execution takes longer than the configured grace seconds. RegisterShutdown(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule)) error @@ -1329,6 +1370,18 @@ type FleetManagerInitializer interface { Delete(ctx context.Context, id string) error } +type XboxRefundHookFn func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error +type ApplePurchaseHookFn func(ctx context.Context, purchase *api.ValidatedPurchase, providerPayload string) error +type AppleSubscriptionFn func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error + +type PurchaseProvider interface { + Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) + // token and environment is config + PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, receipt string, userID uuid.UUID, persist bool, config IAPConfig) (*api.ValidatePurchaseResponse, error) + SubscriptionValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) + HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) (http.HandlerFunc, error) +} + /* Satori runtime integration definitions. */ diff --git a/vendor/modules.txt b/vendor/modules.txt index f774becfe2..ed8f65f398 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -139,7 +139,7 @@ github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/internal/genopena github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options github.com/grpc-ecosystem/grpc-gateway/v2/runtime github.com/grpc-ecosystem/grpc-gateway/v2/utilities -# github.com/heroiclabs/nakama-common v1.37.0 +# github.com/heroiclabs/nakama-common v1.37.0 => ../nakama-common-master/nakama-common ## explicit; go 1.24.3 github.com/heroiclabs/nakama-common/api github.com/heroiclabs/nakama-common/rtapi From 5d72b90e39fa61a86b255f69026b2624e64826a8 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Wed, 16 Jul 2025 16:39:32 +0100 Subject: [PATCH 07/28] struct pointer issue for apple interal adapter fixed, fixed issue around looping through platforms enum and generic validatePurchase functioniality added --- iap/apple.go | 60 +++++----- iap/iap.go | 15 +-- server/api_purchase.go | 111 ++++++++++-------- server/console.go | 64 ++++------ server/runtime.go | 34 ++++++ server/runtime_go.go | 63 +++++++++- server/xbox_refund_poller.go | 2 - .../nakama-common/runtime/runtime.go | 6 + 8 files changed, 223 insertions(+), 132 deletions(-) diff --git a/iap/apple.go b/iap/apple.go index 34c8d83c58..cfab597b62 100644 --- a/iap/apple.go +++ b/iap/apple.go @@ -26,19 +26,17 @@ import ( type ApplePurchaseProvider struct { nk runtime.NakamaModule - logger *zap.Logger + logger runtime.Logger purchaseFn runtime.PurchaseRefundFn subscriptionFn runtime.SubscriptionRefundFn } -func (a ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) { - a.logger.Info("Initializing internal apple purchase provider") +func (a *ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) { a.purchaseFn = purchaseRefundFn a.subscriptionFn = subscriptionRefundFn } -func (a ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, receipt string, userID uuid.UUID, persist bool, config runtime.IAPConfig) (*api.ValidatePurchaseResponse, error) { - a.logger.Info("purcahse validate on apple internal purchase provider hit") +func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, receipt string, userID uuid.UUID, persist bool, config runtime.IAPConfig) (*api.ValidatePurchaseResponse, error) { validation, raw, err := ValidateReceiptApple(ctx, Httpc, receipt, config.GetApple().GetSharedPassword()) if err != nil { if err != context.Canceled { @@ -171,7 +169,7 @@ func (a ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *zap }, nil } -func (a ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { +func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { validation, rawResponse, err := ValidateReceiptApple(ctx, Httpc, receipt, password) if err != nil { if err != context.Canceled { @@ -276,11 +274,11 @@ func (a ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil } -func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) (http.HandlerFunc, error) { +func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) (http.HandlerFunc, error) { return func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) if err != nil { - logger.Error("Failed to decode App Store notification body", zap.Error(err)) + a.logger.Error("Failed to decode App Store notification body", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -288,14 +286,14 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log var applePayload *AppleNotificationSignedPayload if err := json.Unmarshal(body, &applePayload); err != nil { - logger.Error("Failed to unmarshal App Store notification", zap.Error(err)) + a.logger.Error("Failed to unmarshal App Store notification", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } tokens := strings.Split(applePayload.SignedPayload, ".") if len(tokens) < 3 { - logger.Error("Unexpected App Store notification JWS token length") + a.logger.Error("Unexpected App Store notification JWS token length") w.WriteHeader(http.StatusInternalServerError) return } @@ -307,7 +305,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log headerByte, err := base64.StdEncoding.DecodeString(seg) if err != nil { - logger.Error("Failed to decode Apple notification JWS header", zap.Error(err)) + a.logger.Error("Failed to decode Apple notification JWS header", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -319,7 +317,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log var header Header if err = json.Unmarshal(headerByte, &header); err != nil { - logger.Error("Failed to unmarshal Apple notification JWS header", zap.Error(err)) + a.logger.Error("Failed to unmarshal Apple notification JWS header", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -328,7 +326,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log for _, encodedCert := range header.X5c { cert, err := base64.StdEncoding.DecodeString(encodedCert) if err != nil { - logger.Error("Failed to decode Apple notification JWS header certificate", zap.Error(err)) + a.logger.Error("Failed to decode Apple notification JWS header certificate", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -338,14 +336,14 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log rootCert := x509.NewCertPool() ok := rootCert.AppendCertsFromPEM([]byte(AppleRootPEM)) if !ok { - logger.Error("Failed to parse Apple root certificate", zap.Error(err)) + a.logger.Error("Failed to parse Apple root certificate", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } interCert, err := x509.ParseCertificate(certs[1]) if err != nil { - logger.Error("Failed to parse Apple notification intermediate certificate", zap.Error(err)) + a.logger.Error("Failed to parse Apple notification intermediate certificate", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -354,7 +352,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log cert, err := x509.ParseCertificate(certs[2]) if err != nil { - logger.Error("Failed to parse Apple notification certificate", zap.Error(err)) + a.logger.Error("Failed to parse Apple notification certificate", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -366,7 +364,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log _, err = cert.Verify(opts) if err != nil { - logger.Error("Failed to validate Apple notification signature", zap.Error(err)) + a.logger.Error("Failed to validate Apple notification signature", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -378,21 +376,21 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log jsonPayload, err := base64.StdEncoding.DecodeString(seg) if err != nil { - logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) + a.logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } var notificationPayload *AppleNotificationPayload if err = json.Unmarshal(jsonPayload, ¬ificationPayload); err != nil { - logger.Error("Failed to json unmarshal App Store notification payload", zap.Error(err)) + a.logger.Error("Failed to json unmarshal App Store notification payload", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } tokens = strings.Split(notificationPayload.Data.SignedTransactionInfo, ".") if len(tokens) < 3 { - logger.Error("Unexpected App Store notification SignedTransactionInfo JWS token length") + a.logger.Error("Unexpected App Store notification SignedTransactionInfo JWS token length") w.WriteHeader(http.StatusInternalServerError) return } @@ -404,25 +402,25 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log jsonPayload, err = base64.StdEncoding.DecodeString(seg) if err != nil { - logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) + a.logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } var signedTransactionInfo *AppleNotificationTransactionInfo if err = json.Unmarshal(jsonPayload, &signedTransactionInfo); err != nil { - logger.Error("Failed to json unmarshal App Store notification SignedTransactionInfo JWS token", zap.Error(err)) + a.logger.Error("Failed to json unmarshal App Store notification SignedTransactionInfo JWS token", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } - logger.Debug("Apple IAP notification received", zap.Any("notification_payload", signedTransactionInfo)) + a.logger.Debug("Apple IAP notification received", zap.Any("notification_payload", signedTransactionInfo)) uid := uuid.Nil if signedTransactionInfo.AppAccountToken != "" { tokenUID, err := uuid.FromString(signedTransactionInfo.AppAccountToken) if err != nil { - logger.Warn("App Store subscription notification AppAccountToken is an invalid uuid", zap.String("app_account_token", signedTransactionInfo.AppAccountToken), zap.Error(err), zap.String("payload", string(body))) + a.logger.Warn("App Store subscription notification AppAccountToken is an invalid uuid", zap.String("app_account_token", signedTransactionInfo.AppAccountToken), zap.Error(err), zap.String("payload", string(body))) } else { uid = tokenUID } @@ -464,7 +462,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log w.WriteHeader(http.StatusOK) return } - logger.Error("Failed to store App Store notification subscription data", zap.Error(err)) + a.logger.Error("Failed to store App Store notification subscription data", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) return } @@ -497,8 +495,8 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log } if a.subscriptionFn != nil { - if err = a.subscriptionFn(r.Context(), logger, db, a.nk, validatedSub, string(body)); err != nil { - logger.Error("Error invoking Apple subscription refund runtime function", zap.Error(err)) + if err = a.subscriptionFn(r.Context(), a.logger, db, a.nk, validatedSub, string(body)); err != nil { + a.logger.Error("Error invoking Apple subscription refund runtime function", zap.Error(err)) w.WriteHeader(http.StatusOK) return } @@ -531,7 +529,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log dbPurchases, err := UpsertPurchases(r.Context(), db, []*StoragePurchase{purchase}) if err != nil { - logger.Error("Failed to store App Store notification purchase data") + a.logger.Error("Failed to store App Store notification purchase data") w.WriteHeader(http.StatusInternalServerError) return } @@ -556,8 +554,8 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log SeenBefore: dbPurchase.SeenBefore, } - if err = a.purchaseFn(r.Context(), logger, db, a.nk, validatedPurchase, string(body)); err != nil { - logger.Error("Error invoking Apple purchase refund runtime function", zap.Error(err)) + if err = a.purchaseFn(r.Context(), a.logger, db, a.nk, validatedPurchase, string(body)); err != nil { + a.logger.Error("Error invoking Apple purchase refund runtime function", zap.Error(err)) w.WriteHeader(http.StatusOK) return } @@ -569,7 +567,7 @@ func (a ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Log }, nil } -func NewApplePurchaseProvider(nk runtime.NakamaModule, logger *zap.Logger) runtime.PurchaseProvider { +func NewApplePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger) runtime.PurchaseProvider { purchaseProvider := &ApplePurchaseProvider{ nk: nk, logger: logger, diff --git a/iap/iap.go b/iap/iap.go index e1b419e968..324e048f69 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -166,13 +166,14 @@ const ( ) func (enum Platform) String() string { - return [...]string{"apple", "google", "facebook", "huawei"}[enum] + return [...]string{"unknown", "apple", "google", "facebook", "huawei", "xbox", "playstation", "steam", "epic", "discord"}[enum] } -var AllPlatforms = []Platform{Apple, Google, Facebook, Huawei, Xbox, Playstation, Steam, Epic, Discord} +var AllPlatforms = []Platform{Unknown, Apple, Google, Facebook, Huawei, Xbox, Playstation, Steam, Epic, Discord} func FromString(s string) Platform { return map[string]Platform{ + "unknown": Unknown, "apple": Apple, "google": Google, "facebook": Facebook, @@ -188,19 +189,19 @@ func FromString(s string) Platform { func GetPurchaseProvider(platform string, purchaseProviders map[string]runtime.PurchaseProvider) (runtime.PurchaseProvider, error) { purchaseProvider, exists := purchaseProviders[platform] if !exists || purchaseProvider == nil { - return nil, errors.New("purchase provider doesn't exist") + return nil, errors.New(fmt.Sprintf("purchase provider not set for platform %s", platform)) } return purchaseProvider, nil } -func GetRefundFn(platform string, refundFns map[string]runtime.RefundFns) (runtime.RefundFns, error) { +func GetRefundFn(platform string, refundFns map[string]runtime.RefundFns) (*runtime.RefundFns, error) { refundFn, exists := refundFns[platform] - if !exists || refundFn == nil { - return nil, errors.New("refund fn doesn't exist") + if !exists || &refundFn == nil { + return &refundFn, errors.New(fmt.Sprintf("refund fn not set for platform %s ", platform)) } - return refundFn, nil + return &refundFn, nil } type googleTokenCache struct { diff --git a/server/api_purchase.go b/server/api_purchase.go index bae4bf6b3f..79886a08b8 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -25,42 +25,44 @@ import ( "google.golang.org/grpc/status" ) -// // hit from validatepurchase rpc - should i just include the paramters for each platform in the validate purchase request struct func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + platform := iap.FromString(in.Platform) + purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) + if err != nil { + s.logger.Warn("Purchase provider not found", zap.Error(err)) + return nil, status.Error(codes.Internal, "failed to get purchase provider") + } - // Before hook. - // should i just use one before hook for all the validate purchase calls - //if fn := s.runtime.BeforeValidatePurchase(); fn != nil { - // beforeFn := func(clientIP, clientPort string) error { - // result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) - // if err != nil { - // return status.Error(code, err.Error()) - // } - // if result == nil { - // // If result is nil, requested resource is disabled. - // s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) - // return status.Error(codes.NotFound, "Requested resource was not found.") - // } - // in = result - // return nil - // } - // - // // Execute the before function lambda wrapped in a trace for stats measurement. - // err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) - // if err != nil { - // return nil, err - // } - //} - - // still need to handle this for every platform - // create a validate inputs based on platform func - //if s.config.GetIAP().Apple.SharedPassword == "" { - // return nil, status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") - //} - - // receipt can be empty for steam - if len(in.Receipt) < 1 { + err = validatePurchaseRequest(ctx, in, platform, s.config.GetIAP()) + if err != nil { + s.logger.Warn("Purchase request validation failed", zap.Error(err)) + return nil, status.Error(codes.Internal, err.Error()) + } + + if fn := s.runtime.BeforeValidatePurchase(); fn != nil { + beforeFn := func(clientIP, clientPort string) error { + result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + if err != nil { + return status.Error(code, err.Error()) + } + if result == nil { + // If result is nil, requested resource is disabled. + s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) + return status.Error(codes.NotFound, "Requested resource was not found.") + } + in = result + return nil + } + + // Execute the before function lambda wrapped in a trace for stats measurement. + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + if err != nil { + return nil, err + } + } + + if iap.FromString(in.Platform) != iap.Steam && len(in.Receipt) < 1 { return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") } @@ -69,31 +71,42 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha persist = in.Persist.GetValue() } - purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) - if err != nil { - return nil, status.Error(codes.Internal, "failed to get purchase provider") - } - validation, err := purchaseProvider.PurchaseValidate(ctx, s.logger, s.db, in.Receipt, userID, persist, s.config.GetIAP()) if err != nil { return nil, err } - // After hook. - // should i just use one after hook for all the validate purchase calls - // - //if fn := s.runtime.AfterValidatePurchaseApple(); fn != nil { - // afterFn := func(clientIP, clientPort string) error { - // return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) - // } - // - // // Execute the after function lambda wrapped in a trace for stats measurement. - // traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) - //} + if fn := s.runtime.AfterValidatePurchase(); fn != nil { + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, nil, in) + } + + // Execute the after function lambda wrapped in a trace for stats measurement. + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + } return validation, err } +func validatePurchaseRequest(ctx context.Context, in *api.ValidatePurchaseRequest, platform iap.Platform, config *IAPConfig) error { + switch platform { + case iap.Apple: + if config.Apple.SharedPassword == "" { + return status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") + } + case iap.Xbox: + if config.Xbox.Token == "" { + return status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") + } + } + + if iap.FromString(in.Platform) != iap.Steam && len(in.Receipt) < 1 { + return status.Error(codes.InvalidArgument, "Receipt cannot be empty.") + } + + return nil +} + func (s *ApiServer) ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) diff --git a/server/console.go b/server/console.go index 35de585071..7c2d6d8b76 100644 --- a/server/console.go +++ b/server/console.go @@ -20,6 +20,7 @@ import ( "database/sql" "errors" "fmt" + "github.com/heroiclabs/nakama-common/runtime" "github.com/heroiclabs/nakama/v3/iap" "io" "math" @@ -282,18 +283,19 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D // Register public subscription callback endpoints if config.GetIAP().Apple.NotificationsEndpointId != "" { endpoint := fmt.Sprintf("/v2/console/apple/subscriptions/%s", config.GetIAP().Apple.NotificationsEndpointId) - provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) - if err != nil && provider == nil { - startupLogger.Error("Console registration failed", zap.Error(err)) - } else { - handler, err := provider.HandleRefund(ctx, logger, db) - if err != nil { - startupLogger.Error("Console registration failed", zap.Error(err)) - } - grpcGatewayRouter.HandleFunc(endpoint, handler) - } - - //grpcGatewayRouter.HandleFunc(endpoint, appleNotificationHandler(logger, db, runtime.PurchaseNotificationApple(), runtime.SubscriptionNotificationApple())) + // uncomment when built in iap are switched to new purchaseprovider flow + //provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) + //if err != nil && provider == nil { + // startupLogger.Error("Console registration failed", zap.Error(err)) + //} else { + // handler, err := provider.HandleRefund(ctx, logger, db) + // if err != nil { + // startupLogger.Error("Console registration failed", zap.Error(err)) + // } + // grpcGatewayRouter.HandleFunc(endpoint, handler) + //} + + grpcGatewayRouter.HandleFunc(endpoint, appleNotificationHandler(logger, db, runtime.PurchaseNotificationApple(), runtime.SubscriptionNotificationApple())) logger.Info("Registered endpoint for Apple subscription notifications callback", zap.String("endpoint", endpoint)) } @@ -303,7 +305,7 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D logger.Info("Registered endpoint for Google subscription notifications callback", zap.String("endpoint", endpoint)) } - initPurchaseProviderRefundHooks(logger, config, runtime) + initPurchaseProviderRefundHooks(logger, config, runtime.refundFns, runtime.purchaseProviders) // TODO: Register Huawei callbacks @@ -422,46 +424,30 @@ SELECT collection FROM t WHERE collection IS NOT NULL` return s } -func initPurchaseProviderRefundHooks(logger *zap.Logger, config Config, runtime *Runtime) error { - if runtime.refundFns == nil { +func initPurchaseProviderRefundHooks(logger *zap.Logger, config Config, refundFns map[string]runtime.RefundFns, purchaseProviders map[string]runtime.PurchaseProvider) error { + if refundFns == nil { logger.Error("refundsFn map is nil") return nil } for _, platform := range iap.AllPlatforms { - refundFn, err := iap.GetRefundFn(platform.String(), runtime.refundFns) + refundFn, err := iap.GetRefundFn(platform.String(), refundFns) if err != nil { - return err + logger.Error("error getting refund function", zap.Error(err)) + continue } - provider, err := iap.GetPurchaseProvider(platform.String(), runtime.purchaseProviders) + provider, err := iap.GetPurchaseProvider(platform.String(), purchaseProviders) + if err != nil { - logger.Error("Error getting Xbox provider", zap.Error(err)) - return err + logger.Error("Error getting provider", zap.Error(err)) + continue } provider.Init(refundFn.Purchase, refundFn.Subscription) } - + return nil - - //if config.GetIAP().Xbox.RefundCheckPeriodMin > 0 { - // provider, err := iap.GetPurchaseProvider("xbox", runtime.purchaseProviders) - // if err != nil { - // logger.Error("Error getting Xbox provider", zap.Error(err)) - // } - // - // provider.Init(runtime.purchaseNotificationXboxFunction, nil, nil) - //} - // - //if config.GetIAP().Apple.NotificationsEndpointId != "" { - // provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) - // if err != nil { - // logger.Error("Error getting Apple provider", zap.Error(err)) - // } - // - // provider.Init(nil, runtime.purchaseNotificationAppleFunction, runtime.subscriptionNotificationAppleFunction) - //} } func registerDashboardHandlers(logger *zap.Logger, router *mux.Router) { diff --git a/server/runtime.go b/server/runtime.go index 9a4b18ea01..d4f76db38d 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -197,6 +197,8 @@ type ( RuntimeAfterGetUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.Users, in *api.GetUsersRequest) error RuntimeBeforeEventFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.Event) (*api.Event, error, codes.Code) RuntimeAfterEventFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.Event) error + RuntimeBeforeValidatePurchaseFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error, codes.Code) + RuntimeAfterValidatePurchaseFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error RuntimeBeforeValidatePurchaseAppleFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error, codes.Code) RuntimeAfterValidatePurchaseAppleFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseAppleRequest) error RuntimeBeforeValidateSubscriptionAppleFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) @@ -432,6 +434,7 @@ type RuntimeBeforeReqFunctions struct { beforeUnlinkSteamFunction RuntimeBeforeUnlinkSteamFunction beforeGetUsersFunction RuntimeBeforeGetUsersFunction beforeEventFunction RuntimeBeforeEventFunction + beforeValidatePurchaseFunction RuntimeBeforeValidatePurchaseFunction beforeValidatePurchaseAppleFunction RuntimeBeforeValidatePurchaseAppleFunction beforeValidateSubscriptionAppleFunction RuntimeBeforeValidateSubscriptionAppleFunction beforeValidatePurchaseGoogleFunction RuntimeBeforeValidatePurchaseGoogleFunction @@ -518,6 +521,7 @@ type RuntimeAfterReqFunctions struct { afterUnlinkSteamFunction RuntimeAfterUnlinkSteamFunction afterGetUsersFunction RuntimeAfterGetUsersFunction afterEventFunction RuntimeAfterEventFunction + afterValidatePurchaseFunction RuntimeAfterValidatePurchaseFunction afterValidatePurchaseAppleFunction RuntimeAfterValidatePurchaseAppleFunction afterValidateSubscriptionAppleFunction RuntimeAfterValidateSubscriptionAppleFunction afterValidatePurchaseGoogleFunction RuntimeAfterValidatePurchaseGoogleFunction @@ -996,6 +1000,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allBeforeReqFunctions.beforeGetUsersFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "getusers")) } + if allBeforeReqFunctions.beforeValidatePurchaseFunction != nil { + startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchase")) + } if allBeforeReqFunctions.beforeValidatePurchaseAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchaseapple")) } @@ -1315,6 +1322,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeGetUsersFunction = luaBeforeReqFns.beforeGetUsersFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "getusers")) } + if luaBeforeReqFns.beforeValidatePurchaseFunction != nil { + allBeforeReqFunctions.beforeValidatePurchaseFunction = luaBeforeReqFns.beforeValidatePurchaseFunction + startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchase")) + } if luaBeforeReqFns.beforeValidatePurchaseAppleFunction != nil { allBeforeReqFunctions.beforeValidatePurchaseAppleFunction = luaBeforeReqFns.beforeValidatePurchaseAppleFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchaseapple")) @@ -1645,6 +1656,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeGetUsersFunction = goBeforeReqFns.beforeGetUsersFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "getusers")) } + if goBeforeReqFns.beforeValidatePurchaseFunction != nil { + allBeforeReqFunctions.beforeValidatePurchaseFunction = goBeforeReqFns.beforeValidatePurchaseFunction + startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchase")) + } if goBeforeReqFns.beforeValidatePurchaseAppleFunction != nil { allBeforeReqFunctions.beforeValidatePurchaseAppleFunction = goBeforeReqFns.beforeValidatePurchaseAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validateapple")) @@ -1905,6 +1920,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allAfterReqFunctions.afterGetUsersFunction != nil { startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "getusers")) } + if allAfterReqFunctions.afterValidatePurchaseFunction != nil { + startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchase")) + } if allAfterReqFunctions.afterValidatePurchaseAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchaseapple")) } @@ -2220,6 +2238,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterGetUsersFunction = luaAfterReqFns.afterGetUsersFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "getusers")) } + if luaAfterReqFns.afterValidatePurchaseFunction != nil { + allAfterReqFunctions.afterValidatePurchaseFunction = luaAfterReqFns.afterValidatePurchaseFunction + startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchase")) + } if luaAfterReqFns.afterValidatePurchaseAppleFunction != nil { allAfterReqFunctions.afterValidatePurchaseAppleFunction = luaAfterReqFns.afterValidatePurchaseAppleFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchaseapple")) @@ -2550,6 +2572,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterGetUsersFunction = goAfterReqFns.afterGetUsersFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "getusers")) } + if goAfterReqFns.afterValidatePurchaseFunction != nil { + allAfterReqFunctions.afterValidatePurchaseFunction = goAfterReqFns.afterValidatePurchaseFunction + startupLogger.Info("Registerd Go runtime after function invocation", zap.String("id", "validatepurchase")) + } if goAfterReqFns.afterValidatePurchaseAppleFunction != nil { allAfterReqFunctions.afterValidatePurchaseAppleFunction = goAfterReqFns.afterValidatePurchaseAppleFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchaseapple")) @@ -3450,6 +3476,14 @@ func (r *Runtime) AfterGetUsers() RuntimeAfterGetUsersFunction { return r.afterReqFunctions.afterGetUsersFunction } +func (r *Runtime) BeforeValidatePurchase() RuntimeBeforeValidatePurchaseFunction { + return r.beforeReqFunctions.beforeValidatePurchaseFunction +} + +func (r *Runtime) AfterValidatePurchase() RuntimeAfterValidatePurchaseFunction { + return r.afterReqFunctions.afterValidatePurchaseFunction +} + func (r *Runtime) BeforeValidatePurchaseApple() RuntimeBeforeValidatePurchaseAppleFunction { return r.beforeReqFunctions.beforeValidatePurchaseAppleFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index ce960ea8bf..e8d0c9eaa6 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -19,6 +19,7 @@ import ( "database/sql" "errors" "fmt" + "github.com/heroiclabs/nakama/v3/iap" "net/http" "path/filepath" "plugin" @@ -2352,6 +2353,37 @@ func (ri *RuntimeGoInitializer) RegisterAfterGetUsers(fn func(ctx context.Contex return nil } +func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchase(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error)) error { + ri.beforeReq.beforeValidatePurchaseFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error, codes.Code) { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchase", "mode": RuntimeExecutionModeBefore.String()} + result, fnErr := fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, in) + if fnErr != nil { + var runtimeErr *runtime.Error + if errors.As(fnErr, &runtimeErr) { + if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { + // If error is present but code is invalid then default to 13 (Internal) as the error code. + return result, runtimeErr, codes.Internal + } + return result, runtimeErr, codes.Code(runtimeErr.Code) + } + // Not a runtime error that contains a code. + return result, fnErr, codes.Internal + } + return result, nil, codes.OK + } + return nil +} + +func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchase(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error) error { + ri.afterReq.afterValidatePurchaseFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchase", "mode": RuntimeExecutionModeAfter.String()} + return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) + } + return nil +} + func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchaseApple(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error)) error { ri.beforeReq.beforeValidatePurchaseAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") @@ -3116,14 +3148,37 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger } } - //provider := iap.NewApplePurchaseProvider(nk, logger) - //if provider != nil { - // initializer.RegisterPurchaseProvider("apple", provider) - //} + RegisterBuiltInIAPPurchaseProviders(nk, runtimeLogger, initializer) return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.purchaseNotificationXbox, initializer.storageIndexFunctions, initializer.fleetManager, initializer.purchaseProviders, initializer.refundFns, initializer.httpHandlers, events, matchNamesListFn, nil } +func RegisterBuiltInIAPPurchaseProviders(nk runtime.NakamaModule, logger runtime.Logger, initializer runtime.Initializer) { + // Apple + provider := iap.NewApplePurchaseProvider(nk, logger) + if provider != nil { + initializer.RegisterPurchaseProvider("apple", provider) + } + + //// Google + //provider = iap.NewGooglePurchaseProvider(nk, logger) + //if provider != nil { + // initializer.RegisterPurchaseProvider("google", provider) + //} + // + //// Facebook + //provider = iap.NewFacebookPurchaseProvider(nk, logger) + //if provider != nil { + // initializer.RegisterPurchaseProvider("facebook", provider) + //} + // + //// Huawei + //provider = iap.NewHuaweiPurchaseProvider(nk, logger) + //if provider != nil { + // initializer.RegisterPurchaseProvider("huawei", provider) + //} +} + func CheckRuntimeProviderGo(logger *zap.Logger, rootPath string, paths []string) error { for _, path := range paths { // Skip everything except shared object files. diff --git a/server/xbox_refund_poller.go b/server/xbox_refund_poller.go index 1343ccdc17..86a1735254 100644 --- a/server/xbox_refund_poller.go +++ b/server/xbox_refund_poller.go @@ -41,11 +41,9 @@ func NewXboxRefundPoller(logger *zap.Logger, db *sql.DB, config Config) *LocalXb func (x *LocalXboxRefundPoller) Start(runtime *Runtime) { period := x.config.GetIAP().Xbox.RefundCheckPeriodMin if period != 0 { - if runtime.purchaseNotificationXboxFunction != nil && period != 0 { go func() { ticker := time.NewTicker(1 * time.Minute) defer ticker.Stop() - for { select { case <-x.ctx.Done(): diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index ebde10d04e..cb727d5ef2 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -758,6 +758,12 @@ type Initializer interface { // RegisterAfterListTournamentRecordsAroundOwner can be used to perform additional logic after listing tournament records. RegisterAfterListTournamentRecordsAroundOwner(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.TournamentRecordList, in *api.ListTournamentRecordsAroundOwnerRequest) error) error + // RegisterBeforeValidatePurchase can be used to perform additional logic before generic validate purchase call + RegisterBeforeValidatePurchase(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error)) error + + // RegisterAfterValidatePurchase can be used to perform additional logic after generic validate purchase call + RegisterAfterValidatePurchase(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error) error + // RegisterBeforeValidatePurchaseApple can be used to perform additional logic before validating an Apple Store IAP receipt. RegisterBeforeValidatePurchaseApple(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error)) error From 4f24c6027b2334a09f403d10e828c681666f8a51 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Thu, 17 Jul 2025 11:26:54 +0100 Subject: [PATCH 08/28] removed unused rpc, before and after funcs now that the generic validatepurchase is in --- apigrpc/apigrpc.pb.go | 240 +++++++++--------- apigrpc/apigrpc.pb.gw.go | 63 ----- apigrpc/apigrpc.proto | 8 - apigrpc/apigrpc.swagger.json | 48 ---- apigrpc/apigrpc_grpc.pb.go | 40 --- server/api_purchase.go | 183 ------------- server/core_subscription.go | 3 +- server/runtime.go | 99 +------- server/runtime_go.go | 102 +------- server/runtime_javascript.go | 6 +- server/runtime_lua.go | 6 +- server/xbox_refund_poller.go | 37 ++- .../nakama-common/runtime/runtime.go | 16 -- 13 files changed, 158 insertions(+), 693 deletions(-) diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index faf4bc99d5..9a6983b7ab 100644 --- a/apigrpc/apigrpc.pb.go +++ b/apigrpc/apigrpc.pb.go @@ -46,7 +46,7 @@ var File_apigrpc_proto protoreflect.FileDescriptor const file_apigrpc_proto_rawDesc = "" + "\n" + "\rapigrpc.proto\x12\n" + - "nakama.api\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\x1a1github.com/heroiclabs/nakama-common/api/api.proto2\xa5Q\n" + + "nakama.api\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\x1a1github.com/heroiclabs/nakama-common/api/api.proto2\x9bP\n" + "\x06Nakama\x12W\n" + "\n" + "AddFriends\x12\x1d.nakama.api.AddFriendsRequest\x1a\x16.google.protobuf.Empty\"\x12\x82\xd3\xe4\x93\x02\f\"\n" + @@ -163,8 +163,7 @@ const file_apigrpc_proto_rawDesc = "" + "\x16ValidatePurchaseGoogle\x12).nakama.api.ValidatePurchaseGoogleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/iap/purchase/google\x12\x9d\x01\n" + "\x1aValidateSubscriptionGoogle\x12-.nakama.api.ValidateSubscriptionGoogleRequest\x1a(.nakama.api.ValidateSubscriptionResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v2/iap/subscription/google\x12\x8d\x01\n" + "\x16ValidatePurchaseHuawei\x12).nakama.api.ValidatePurchaseHuaweiRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/iap/purchase/huawei\x12\xa8\x01\n" + - "\x1fValidatePurchaseFacebookInstant\x122.nakama.api.ValidatePurchaseFacebookInstantRequest\x1a$.nakama.api.ValidatePurchaseResponse\"+\x82\xd3\xe4\x93\x02%:\x01*\" /v2/iap/purchase/facebookinstant\x12\x87\x01\n" + - "\x14ValidatePurchaseXbox\x12'.nakama.api.ValidatePurchaseXboxRequest\x1a$.nakama.api.ValidatePurchaseResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/v2/iap/purchase/xbox\x12\x94\x01\n" + + "\x1fValidatePurchaseFacebookInstant\x122.nakama.api.ValidatePurchaseFacebookInstantRequest\x1a$.nakama.api.ValidatePurchaseResponse\"+\x82\xd3\xe4\x93\x02%:\x01*\" /v2/iap/purchase/facebookinstant\x12\x94\x01\n" + "\x16WriteLeaderboardRecord\x12).nakama.api.WriteLeaderboardRecordRequest\x1a\x1d.nakama.api.LeaderboardRecord\"0\x82\xd3\xe4\x93\x02*:\x06record\" /v2/leaderboard/{leaderboard_id}\x12t\n" + "\x13WriteStorageObjects\x12&.nakama.api.WriteStorageObjectsRequest\x1a\x1d.nakama.api.StorageObjectAcks\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\x1a\v/v2/storage\x12\xba\x01\n" + "\x15WriteTournamentRecord\x12(.nakama.api.WriteTournamentRecordRequest\x1a\x1d.nakama.api.LeaderboardRecord\"X\x82\xd3\xe4\x93\x02R:\x06recordZ(:\x06record\"\x1e/v2/tournament/{tournament_id}\x1a\x1e/v2/tournament/{tournament_id}B\xba\x03\x92A\xcf\x02\x12u\n" + @@ -253,34 +252,33 @@ var file_apigrpc_proto_goTypes = []any{ (*api.ValidateSubscriptionGoogleRequest)(nil), // 68: nakama.api.ValidateSubscriptionGoogleRequest (*api.ValidatePurchaseHuaweiRequest)(nil), // 69: nakama.api.ValidatePurchaseHuaweiRequest (*api.ValidatePurchaseFacebookInstantRequest)(nil), // 70: nakama.api.ValidatePurchaseFacebookInstantRequest - (*api.ValidatePurchaseXboxRequest)(nil), // 71: nakama.api.ValidatePurchaseXboxRequest - (*api.WriteLeaderboardRecordRequest)(nil), // 72: nakama.api.WriteLeaderboardRecordRequest - (*api.WriteStorageObjectsRequest)(nil), // 73: nakama.api.WriteStorageObjectsRequest - (*api.WriteTournamentRecordRequest)(nil), // 74: nakama.api.WriteTournamentRecordRequest - (*api.Session)(nil), // 75: nakama.api.Session - (*api.Group)(nil), // 76: nakama.api.Group - (*api.Account)(nil), // 77: nakama.api.Account - (*api.Users)(nil), // 78: nakama.api.Users - (*api.ValidatedSubscription)(nil), // 79: nakama.api.ValidatedSubscription - (*api.MatchmakerStats)(nil), // 80: nakama.api.MatchmakerStats - (*api.ChannelMessageList)(nil), // 81: nakama.api.ChannelMessageList - (*api.FriendList)(nil), // 82: nakama.api.FriendList - (*api.FriendsOfFriendsList)(nil), // 83: nakama.api.FriendsOfFriendsList - (*api.GroupList)(nil), // 84: nakama.api.GroupList - (*api.GroupUserList)(nil), // 85: nakama.api.GroupUserList - (*api.LeaderboardRecordList)(nil), // 86: nakama.api.LeaderboardRecordList - (*api.MatchList)(nil), // 87: nakama.api.MatchList - (*api.NotificationList)(nil), // 88: nakama.api.NotificationList - (*api.StorageObjectList)(nil), // 89: nakama.api.StorageObjectList - (*api.SubscriptionList)(nil), // 90: nakama.api.SubscriptionList - (*api.TournamentList)(nil), // 91: nakama.api.TournamentList - (*api.TournamentRecordList)(nil), // 92: nakama.api.TournamentRecordList - (*api.UserGroupList)(nil), // 93: nakama.api.UserGroupList - (*api.StorageObjects)(nil), // 94: nakama.api.StorageObjects - (*api.ValidatePurchaseResponse)(nil), // 95: nakama.api.ValidatePurchaseResponse - (*api.ValidateSubscriptionResponse)(nil), // 96: nakama.api.ValidateSubscriptionResponse - (*api.LeaderboardRecord)(nil), // 97: nakama.api.LeaderboardRecord - (*api.StorageObjectAcks)(nil), // 98: nakama.api.StorageObjectAcks + (*api.WriteLeaderboardRecordRequest)(nil), // 71: nakama.api.WriteLeaderboardRecordRequest + (*api.WriteStorageObjectsRequest)(nil), // 72: nakama.api.WriteStorageObjectsRequest + (*api.WriteTournamentRecordRequest)(nil), // 73: nakama.api.WriteTournamentRecordRequest + (*api.Session)(nil), // 74: nakama.api.Session + (*api.Group)(nil), // 75: nakama.api.Group + (*api.Account)(nil), // 76: nakama.api.Account + (*api.Users)(nil), // 77: nakama.api.Users + (*api.ValidatedSubscription)(nil), // 78: nakama.api.ValidatedSubscription + (*api.MatchmakerStats)(nil), // 79: nakama.api.MatchmakerStats + (*api.ChannelMessageList)(nil), // 80: nakama.api.ChannelMessageList + (*api.FriendList)(nil), // 81: nakama.api.FriendList + (*api.FriendsOfFriendsList)(nil), // 82: nakama.api.FriendsOfFriendsList + (*api.GroupList)(nil), // 83: nakama.api.GroupList + (*api.GroupUserList)(nil), // 84: nakama.api.GroupUserList + (*api.LeaderboardRecordList)(nil), // 85: nakama.api.LeaderboardRecordList + (*api.MatchList)(nil), // 86: nakama.api.MatchList + (*api.NotificationList)(nil), // 87: nakama.api.NotificationList + (*api.StorageObjectList)(nil), // 88: nakama.api.StorageObjectList + (*api.SubscriptionList)(nil), // 89: nakama.api.SubscriptionList + (*api.TournamentList)(nil), // 90: nakama.api.TournamentList + (*api.TournamentRecordList)(nil), // 91: nakama.api.TournamentRecordList + (*api.UserGroupList)(nil), // 92: nakama.api.UserGroupList + (*api.StorageObjects)(nil), // 93: nakama.api.StorageObjects + (*api.ValidatePurchaseResponse)(nil), // 94: nakama.api.ValidatePurchaseResponse + (*api.ValidateSubscriptionResponse)(nil), // 95: nakama.api.ValidateSubscriptionResponse + (*api.LeaderboardRecord)(nil), // 96: nakama.api.LeaderboardRecord + (*api.StorageObjectAcks)(nil), // 97: nakama.api.StorageObjectAcks } var file_apigrpc_proto_depIdxs = []int32{ 0, // 0: nakama.api.Nakama.AddFriends:input_type -> nakama.api.AddFriendsRequest @@ -364,97 +362,95 @@ var file_apigrpc_proto_depIdxs = []int32{ 68, // 78: nakama.api.Nakama.ValidateSubscriptionGoogle:input_type -> nakama.api.ValidateSubscriptionGoogleRequest 69, // 79: nakama.api.Nakama.ValidatePurchaseHuawei:input_type -> nakama.api.ValidatePurchaseHuaweiRequest 70, // 80: nakama.api.Nakama.ValidatePurchaseFacebookInstant:input_type -> nakama.api.ValidatePurchaseFacebookInstantRequest - 71, // 81: nakama.api.Nakama.ValidatePurchaseXbox:input_type -> nakama.api.ValidatePurchaseXboxRequest - 72, // 82: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest - 73, // 83: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest - 74, // 84: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest - 16, // 85: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty - 16, // 86: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty - 75, // 87: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session - 16, // 88: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty - 75, // 89: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session - 75, // 90: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session - 75, // 91: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session - 75, // 92: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session - 75, // 93: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session - 75, // 94: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session - 75, // 95: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session - 75, // 96: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session - 75, // 97: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session - 16, // 98: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty - 16, // 99: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty - 76, // 100: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group - 16, // 101: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty - 16, // 102: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty - 16, // 103: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty - 16, // 104: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty - 16, // 105: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty - 16, // 106: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty - 16, // 107: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty - 16, // 108: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty - 77, // 109: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account - 78, // 110: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users - 79, // 111: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription - 80, // 112: nakama.api.Nakama.GetMatchmakerStats:output_type -> nakama.api.MatchmakerStats - 16, // 113: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty - 16, // 114: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty - 16, // 115: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty - 16, // 116: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty - 16, // 117: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty - 16, // 118: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty - 16, // 119: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty - 16, // 120: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty - 16, // 121: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty - 16, // 122: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty - 16, // 123: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty - 16, // 124: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty - 16, // 125: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 126: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty - 16, // 127: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty - 16, // 128: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty - 81, // 129: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList - 82, // 130: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList - 83, // 131: nakama.api.Nakama.ListFriendsOfFriends:output_type -> nakama.api.FriendsOfFriendsList - 84, // 132: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList - 85, // 133: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList - 86, // 134: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList - 86, // 135: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList - 87, // 136: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList - 88, // 137: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList - 89, // 138: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList - 90, // 139: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList - 91, // 140: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList - 92, // 141: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList - 92, // 142: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList - 93, // 143: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList - 16, // 144: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty - 16, // 145: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty - 94, // 146: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects - 59, // 147: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc - 16, // 148: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty - 16, // 149: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty - 16, // 150: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty - 16, // 151: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty - 16, // 152: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty - 16, // 153: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 154: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty - 16, // 155: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty - 16, // 156: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty - 16, // 157: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty - 16, // 158: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty - 95, // 159: nakama.api.Nakama.ValidatePurchase:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 160: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse - 96, // 161: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse - 95, // 162: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse - 96, // 163: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse - 95, // 164: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 165: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 166: nakama.api.Nakama.ValidatePurchaseXbox:output_type -> nakama.api.ValidatePurchaseResponse - 97, // 167: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord - 98, // 168: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks - 97, // 169: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord - 85, // [85:170] is the sub-list for method output_type - 0, // [0:85] is the sub-list for method input_type + 71, // 81: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest + 72, // 82: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest + 73, // 83: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest + 16, // 84: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty + 16, // 85: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty + 74, // 86: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session + 16, // 87: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty + 74, // 88: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session + 74, // 89: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session + 74, // 90: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session + 74, // 91: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session + 74, // 92: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session + 74, // 93: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session + 74, // 94: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session + 74, // 95: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session + 74, // 96: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session + 16, // 97: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty + 16, // 98: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty + 75, // 99: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group + 16, // 100: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty + 16, // 101: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty + 16, // 102: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty + 16, // 103: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty + 16, // 104: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty + 16, // 105: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty + 16, // 106: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty + 16, // 107: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty + 76, // 108: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account + 77, // 109: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users + 78, // 110: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription + 79, // 111: nakama.api.Nakama.GetMatchmakerStats:output_type -> nakama.api.MatchmakerStats + 16, // 112: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty + 16, // 113: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty + 16, // 114: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty + 16, // 115: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty + 16, // 116: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty + 16, // 117: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty + 16, // 118: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty + 16, // 119: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty + 16, // 120: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty + 16, // 121: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty + 16, // 122: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty + 16, // 123: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty + 16, // 124: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 125: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty + 16, // 126: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty + 16, // 127: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty + 80, // 128: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList + 81, // 129: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList + 82, // 130: nakama.api.Nakama.ListFriendsOfFriends:output_type -> nakama.api.FriendsOfFriendsList + 83, // 131: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList + 84, // 132: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList + 85, // 133: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList + 85, // 134: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList + 86, // 135: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList + 87, // 136: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList + 88, // 137: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList + 89, // 138: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList + 90, // 139: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList + 91, // 140: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList + 91, // 141: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList + 92, // 142: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList + 16, // 143: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty + 16, // 144: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty + 93, // 145: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects + 59, // 146: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc + 16, // 147: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty + 16, // 148: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty + 16, // 149: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty + 16, // 150: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty + 16, // 151: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty + 16, // 152: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 153: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty + 16, // 154: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty + 16, // 155: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty + 16, // 156: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty + 16, // 157: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty + 94, // 158: nakama.api.Nakama.ValidatePurchase:output_type -> nakama.api.ValidatePurchaseResponse + 94, // 159: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 160: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse + 94, // 161: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 162: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse + 94, // 163: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse + 94, // 164: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse + 96, // 165: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord + 97, // 166: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks + 96, // 167: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord + 84, // [84:168] is the sub-list for method output_type + 0, // [0:84] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/apigrpc/apigrpc.pb.gw.go b/apigrpc/apigrpc.pb.gw.go index 51f125362a..ae2721b4eb 100644 --- a/apigrpc/apigrpc.pb.gw.go +++ b/apigrpc/apigrpc.pb.gw.go @@ -2870,30 +2870,6 @@ func local_request_Nakama_ValidatePurchaseFacebookInstant_0(ctx context.Context, return msg, metadata, err } -func request_Nakama_ValidatePurchaseXbox_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq api.ValidatePurchaseXboxRequest - metadata runtime.ServerMetadata - ) - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.ValidatePurchaseXbox(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err -} - -func local_request_Nakama_ValidatePurchaseXbox_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq api.ValidatePurchaseXboxRequest - metadata runtime.ServerMetadata - ) - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.ValidatePurchaseXbox(ctx, &protoReq) - return msg, metadata, err -} - func request_Nakama_WriteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq api.WriteLeaderboardRecordRequest @@ -4710,26 +4686,6 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseXbox_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseXbox", runtime.WithHTTPPathPattern("/v2/iap/purchase/xbox")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Nakama_ValidatePurchaseXbox_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Nakama_ValidatePurchaseXbox_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle(http.MethodPost, pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -6261,23 +6217,6 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchaseXbox_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseXbox", runtime.WithHTTPPathPattern("/v2/iap/purchase/xbox")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Nakama_ValidatePurchaseXbox_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Nakama_ValidatePurchaseXbox_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle(http.MethodPost, pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -6433,7 +6372,6 @@ var ( pattern_Nakama_ValidateSubscriptionGoogle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "subscription", "google"}, "")) pattern_Nakama_ValidatePurchaseHuawei_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "huawei"}, "")) pattern_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "facebookinstant"}, "")) - pattern_Nakama_ValidatePurchaseXbox_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "xbox"}, "")) pattern_Nakama_WriteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) pattern_Nakama_WriteStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, "")) pattern_Nakama_WriteTournamentRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "tournament", "tournament_id"}, "")) @@ -6524,7 +6462,6 @@ var ( forward_Nakama_ValidateSubscriptionGoogle_0 = runtime.ForwardResponseMessage forward_Nakama_ValidatePurchaseHuawei_0 = runtime.ForwardResponseMessage forward_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.ForwardResponseMessage - forward_Nakama_ValidatePurchaseXbox_0 = runtime.ForwardResponseMessage forward_Nakama_WriteLeaderboardRecord_0 = runtime.ForwardResponseMessage forward_Nakama_WriteStorageObjects_0 = runtime.ForwardResponseMessage forward_Nakama_WriteTournamentRecord_0 = runtime.ForwardResponseMessage diff --git a/apigrpc/apigrpc.proto b/apigrpc/apigrpc.proto index c7f0337451..9350cb029c 100644 --- a/apigrpc/apigrpc.proto +++ b/apigrpc/apigrpc.proto @@ -733,14 +733,6 @@ service Nakama { }; } - // Validate Xbox Receipt - rpc ValidatePurchaseXbox (api.ValidatePurchaseXboxRequest) returns (api.ValidatePurchaseResponse) { - option (google.api.http) = { - post: "/v2/iap/purchase/xbox", - body: "*" - }; - } - // Write a record to a leaderboard. rpc WriteLeaderboardRecord (api.WriteLeaderboardRecordRequest) returns (api.LeaderboardRecord) { option (google.api.http) = { diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index 5fef79c222..65b09dec59 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -2381,39 +2381,6 @@ ] } }, - "/v2/iap/purchase/xbox": { - "post": { - "summary": "Validate Xbox Receipt", - "operationId": "Nakama_ValidatePurchaseXbox", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/apiValidatePurchaseResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/rpcStatus" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/apiValidatePurchaseXboxRequest" - } - } - ], - "tags": [ - "Nakama" - ] - } - }, "/v2/iap/subscription": { "post": { "summary": "List user's subscriptions.", @@ -5286,21 +5253,6 @@ }, "description": "Validate IAP response." }, - "apiValidatePurchaseXboxRequest": { - "type": "object", - "properties": { - "productId": { - "type": "string" - }, - "persist": { - "type": "boolean" - }, - "platform": { - "type": "string" - } - }, - "title": "Xbox Purchase validation request" - }, "apiValidateSubscriptionAppleRequest": { "type": "object", "properties": { diff --git a/apigrpc/apigrpc_grpc.pb.go b/apigrpc/apigrpc_grpc.pb.go index a6dfaa3134..d2a67e4f70 100644 --- a/apigrpc/apigrpc_grpc.pb.go +++ b/apigrpc/apigrpc_grpc.pb.go @@ -119,7 +119,6 @@ const ( Nakama_ValidateSubscriptionGoogle_FullMethodName = "/nakama.api.Nakama/ValidateSubscriptionGoogle" Nakama_ValidatePurchaseHuawei_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseHuawei" Nakama_ValidatePurchaseFacebookInstant_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseFacebookInstant" - Nakama_ValidatePurchaseXbox_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseXbox" Nakama_WriteLeaderboardRecord_FullMethodName = "/nakama.api.Nakama/WriteLeaderboardRecord" Nakama_WriteStorageObjects_FullMethodName = "/nakama.api.Nakama/WriteStorageObjects" Nakama_WriteTournamentRecord_FullMethodName = "/nakama.api.Nakama/WriteTournamentRecord" @@ -294,8 +293,6 @@ type NakamaClient interface { ValidatePurchaseHuawei(ctx context.Context, in *api.ValidatePurchaseHuaweiRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Validate FB Instant IAP Receipt ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) - // Validate Xbox Receipt - ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePurchaseXboxRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Write a record to a leaderboard. WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) // Write objects into the storage engine. @@ -1122,16 +1119,6 @@ func (c *nakamaClient) ValidatePurchaseFacebookInstant(ctx context.Context, in * return out, nil } -func (c *nakamaClient) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePurchaseXboxRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(api.ValidatePurchaseResponse) - err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseXbox_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *nakamaClient) WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(api.LeaderboardRecord) @@ -1331,8 +1318,6 @@ type NakamaServer interface { ValidatePurchaseHuawei(context.Context, *api.ValidatePurchaseHuaweiRequest) (*api.ValidatePurchaseResponse, error) // Validate FB Instant IAP Receipt ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) - // Validate Xbox Receipt - ValidatePurchaseXbox(context.Context, *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseResponse, error) // Write a record to a leaderboard. WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error) // Write objects into the storage engine. @@ -1592,9 +1577,6 @@ func (UnimplementedNakamaServer) ValidatePurchaseHuawei(context.Context, *api.Va func (UnimplementedNakamaServer) ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseFacebookInstant not implemented") } -func (UnimplementedNakamaServer) ValidatePurchaseXbox(context.Context, *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseXbox not implemented") -} func (UnimplementedNakamaServer) WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error) { return nil, status.Errorf(codes.Unimplemented, "method WriteLeaderboardRecord not implemented") } @@ -3083,24 +3065,6 @@ func _Nakama_ValidatePurchaseFacebookInstant_Handler(srv interface{}, ctx contex return interceptor(ctx, in, info, handler) } -func _Nakama_ValidatePurchaseXbox_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(api.ValidatePurchaseXboxRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NakamaServer).ValidatePurchaseXbox(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Nakama_ValidatePurchaseXbox_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NakamaServer).ValidatePurchaseXbox(ctx, req.(*api.ValidatePurchaseXboxRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Nakama_WriteLeaderboardRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(api.WriteLeaderboardRecordRequest) if err := dec(in); err != nil { @@ -3486,10 +3450,6 @@ var Nakama_ServiceDesc = grpc.ServiceDesc{ MethodName: "ValidatePurchaseFacebookInstant", Handler: _Nakama_ValidatePurchaseFacebookInstant_Handler, }, - { - MethodName: "ValidatePurchaseXbox", - Handler: _Nakama_ValidatePurchaseXbox_Handler, - }, { MethodName: "WriteLeaderboardRecord", Handler: _Nakama_WriteLeaderboardRecord_Handler, diff --git a/server/api_purchase.go b/server/api_purchase.go index 79886a08b8..a846165e5b 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -16,7 +16,6 @@ package server import ( "context" - "fmt" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama/v3/iap" @@ -340,185 +339,3 @@ func (s *ApiServer) ValidatePurchaseFacebookInstant(ctx context.Context, in *api return validation, err } - -func (s *ApiServer) ValidatePurchaseXbox(ctx context.Context, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseResponse, error) { - userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) - - // Before hook. - if fn := s.runtime.BeforeValidatePurchaseXbox(); fn != nil { - beforeFn := func(clientIP, clientPort string) error { - result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) - if err != nil { - return status.Error(code, err.Error()) - } - if result == nil { - // If result is nil, requested resource is disabled. - s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) - return status.Error(codes.NotFound, "Requested resource was not found.") - } - in = result - return nil - } - - // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) - if err != nil { - return nil, err - } - } - - if s.config.GetIAP().Xbox.Token == "" { - return nil, status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") - } - - if len(in.ProductId) < 1 { - return nil, status.Error(codes.InvalidArgument, "ProductId required.") - } - - persist := true - if in.Persist != nil { - persist = in.Persist.GetValue() - } - - provider, err := iap.GetPurchaseProvider("xbox", s.runtime.purchaseProviders) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - if provider == nil { - s.logger.Info(fmt.Sprintf("Xbox provider not found for purchase provider")) - return nil, status.Error(codes.NotFound, "Purchase provider not found.") - } - - validation, err := provider.PurchaseValidate(ctx, s.logger, s.db, in.ProductId, userID, persist, s.config.GetIAP()) - if err != nil { - return nil, err - } - - // After hook. - if fn := s.runtime.AfterValidatePurchaseXbox(); fn != nil { - afterFn := func(clientIP, clientPort string) error { - return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) - } - - // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) - } - - return validation, err -} - -func (s *ApiServer) ValidatePurchasePlaystation(ctx context.Context, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchaseResponse, error) { - userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) - - // Before hook. - if fn := s.runtime.BeforeValidatePurchasePlaystation(); fn != nil { - beforeFn := func(clientIP, clientPort string) error { - result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) - if err != nil { - return status.Error(code, err.Error()) - } - if result == nil { - // If result is nil, requested resource is disabled. - s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) - return status.Error(codes.NotFound, "Requested resource was not found.") - } - in = result - return nil - } - - // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) - if err != nil { - return nil, err - } - } - - if s.config.GetIAP().Playstation.Token == "" { - return nil, status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") - } - - if len(in.EntitlementLabel) < 1 { - return nil, status.Error(codes.InvalidArgument, "EntitlementLabel required.") - } - - persist := true - if in.Persist != nil { - persist = in.Persist.GetValue() - } - - validation, err := s.runtime.purchaseProviders["playstation"].PurchaseValidate(ctx, s.logger, s.db, in.EntitlementLabel, userID, persist, s.config.GetIAP()) - if err != nil { - return nil, err - } - - // After hook. - if fn := s.runtime.AfterValidatePurchasePlaystation(); fn != nil { - afterFn := func(clientIP, clientPort string) error { - return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) - } - - // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) - } - - return validation, err -} - -//func (s *ApiServer) ValidatePurchaseEpic(ctx context.Context, in *api.ValidatePurchaseEpicRequest) (*api.ValidatePurchaseResponse, error) { -// userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) -// -// // Before hook. -// if fn := s.runtime.BeforeValidatePurchaseEpic(); fn != nil { -// beforeFn := func(clientIP, clientPort string) error { -// result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) -// if err != nil { -// return status.Error(code, err.Error()) -// } -// if result == nil { -// // If result is nil, requested resource is disabled. -// s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) -// return status.Error(codes.NotFound, "Requested resource was not found.") -// } -// in = result -// return nil -// } -// -// // Execute the before function lambda wrapped in a trace for stats measurement. -// err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) -// if err != nil { -// return nil, err -// } -// } -// -// if s.config.GetIAP().Xbox.Token == "" { -// return nil, status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") -// } -// -// if len(in.NsCatalogItemId) < 1 { -// return nil, status.Error(codes.InvalidArgument, "NsCatalogItemId required.") -// } -// -// persist := true -// if in.Persist != nil { -// persist = in.Persist.GetValue() -// } -// -// epicConfig := s.config.GetIAP().Playstation -// validation, err := s.runtime.iapPlaystationManager.PurchaseValidate(ctx, s.logger, s.db, "", "", "", "", in.NsCatalogItemId, "", userID, persist) -// if err != nil { -// return nil, err -// } -// -// // After hook. -// if fn := s.runtime.AfterValidatePurchasePlaystation(); fn != nil { -// afterFn := func(clientIP, clientPort string) error { -// return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) -// } -// -// // Execute the after function lambda wrapped in a trace for stats measurement. -// traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) -// } -// -// return validation, err -//} diff --git a/server/core_subscription.go b/server/core_subscription.go index cccbe54b7e..feca19a41c 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -24,7 +24,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/heroiclabs/nakama-common/runtime" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "io" @@ -497,7 +496,7 @@ WHERE } // Store providers notification callback handler functions -func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificationCallback runtime.ApplePurchaseHookFn, subscriptionNotificationCallback runtime.AppleSubscriptionFn) http.HandlerFunc { +func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificationCallback RuntimePurchaseNotificationAppleFunction, subscriptionNotificationCallback RuntimeSubscriptionNotificationAppleFunction) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) if err != nil { diff --git a/server/runtime.go b/server/runtime.go index d4f76db38d..c13b6bbd11 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -211,10 +211,6 @@ type ( RuntimeAfterValidatePurchaseHuaweiFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseHuaweiRequest) error RuntimeBeforeValidatePurchaseFacebookInstantFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error, codes.Code) RuntimeAfterValidatePurchaseFacebookInstantFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error - RuntimeBeforeValidatePurchaseXboxFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error, codes.Code) - RuntimeAfterValidatePurchaseXboxFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error - RuntimeBeforeValidatePurchasePlaystationFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error, codes.Code) - RuntimeAfterValidatePurchasePlaystationFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error RuntimeBeforeListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListSubscriptionsRequest) (*api.ListSubscriptionsRequest, error, codes.Code) RuntimeAfterListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.SubscriptionList, in *api.ListSubscriptionsRequest) error RuntimeBeforeGetSubscriptionFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.GetSubscriptionRequest) (*api.GetSubscriptionRequest, error, codes.Code) @@ -233,11 +229,10 @@ type ( RuntimeLeaderboardResetFunction func(ctx context.Context, leaderboard *api.Leaderboard, reset int64) error - RuntimePurchaseNotificationAppleFunction runtime.ApplePurchaseHookFn - RuntimeSubscriptionNotificationAppleFunction runtime.AppleSubscriptionFn + RuntimePurchaseNotificationAppleFunction func(ctx context.Context, purchase *api.ValidatedPurchase, providerPayload string) error + RuntimeSubscriptionNotificationAppleFunction func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error RuntimePurchaseNotificationGoogleFunction func(ctx context.Context, purchase *api.ValidatedPurchase, providerPayload string) error RuntimeSubscriptionNotificationGoogleFunction func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error - RuntimePurchaseNotificationXboxFunction runtime.XboxRefundHookFn RuntimeStorageIndexFilterFunction func(ctx context.Context, write *StorageOpWrite) (bool, error) @@ -441,8 +436,6 @@ type RuntimeBeforeReqFunctions struct { beforeValidateSubscriptionGoogleFunction RuntimeBeforeValidateSubscriptionGoogleFunction beforeValidatePurchaseHuaweiFunction RuntimeBeforeValidatePurchaseHuaweiFunction beforeValidatePurchaseFacebookInstantFunction RuntimeBeforeValidatePurchaseFacebookInstantFunction - beforeValidatePurchaseXboxFunction RuntimeBeforeValidatePurchaseXboxFunction - beforeValidatePurchasePlaystationFunction RuntimeBeforeValidatePurchasePlaystationFunction beforeListSubscriptionsFunction RuntimeBeforeListSubscriptionsFunction beforeGetSubscriptionFunction RuntimeBeforeGetSubscriptionFunction beforeGetMatchmakerStatsFunction RuntimeBeforeGetMatchmakerStatsFunction @@ -528,8 +521,6 @@ type RuntimeAfterReqFunctions struct { afterValidateSubscriptionGoogleFunction RuntimeAfterValidateSubscriptionGoogleFunction afterValidatePurchaseHuaweiFunction RuntimeAfterValidatePurchaseHuaweiFunction afterValidatePurchaseFacebookInstantFunction RuntimeAfterValidatePurchaseFacebookInstantFunction - afterValidatePurchaseXboxFunction RuntimeAfterValidatePurchaseXboxFunction - afterValidatePurchasePlaystationFunction RuntimeAfterValidatePurchasePlaystationFunction afterListSubscriptionsFunction RuntimeAfterListSubscriptionsFunction afterGetSubscriptionFunction RuntimeAfterGetSubscriptionFunction afterGetMatchmakerStatsFunction RuntimeAfterGetMatchmakerStatsFunction @@ -551,11 +542,10 @@ type Runtime struct { tournamentEndFunction RuntimeTournamentEndFunction tournamentResetFunction RuntimeTournamentResetFunction - purchaseNotificationAppleFunction runtime.ApplePurchaseHookFn - subscriptionNotificationAppleFunction runtime.AppleSubscriptionFn + purchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction + subscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction purchaseNotificationGoogleFunction RuntimePurchaseNotificationGoogleFunction subscriptionNotificationGoogleFunction RuntimeSubscriptionNotificationGoogleFunction - purchaseNotificationXboxFunction runtime.XboxRefundHookFn storageIndexFilterFunctions map[string]RuntimeStorageIndexFilterFunction @@ -697,7 +687,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. config.GetSatori().CacheEnabled, ) - goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goPurchaseNotificationXboxFn, goIndexFilterFns, fleetManager, purchaseProviders, refundFns, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) + goModules, goRPCFns, goBeforeRtFns, goAfterRtFns, goBeforeReqFns, goAfterReqFns, goMatchmakerMatchedFn, goMatchmakerCustomMatchingFn, goTournamentEndFn, goTournamentResetFn, goLeaderboardResetFn, goShutdownFn, goPurchaseNotificationAppleFn, goSubscriptionNotificationAppleFn, goPurchaseNotificationGoogleFn, goSubscriptionNotificationGoogleFn, goIndexFilterFns, fleetManager, purchaseProviders, refundFns, httpHandlers, allEventFns, goMatchNamesListFn, err := NewRuntimeProviderGo(ctx, logger, startupLogger, db, protojsonMarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, tracker, metrics, streamManager, router, storageIndex, satoriClient, runtimeConfig.Path, paths, eventQueue, matchProvider, fmCallbackHandler) if err != nil { startupLogger.Error("Error initialising Go runtime provider", zap.Error(err)) return nil, nil, err @@ -1015,12 +1005,6 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } - if allBeforeReqFunctions.beforeValidatePurchaseXboxFunction != nil { - startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasexbox")) - } - if allBeforeReqFunctions.beforeValidatePurchasePlaystationFunction != nil { - startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchaseplaystation")) - } if allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -1342,14 +1326,6 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = luaBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } - if luaBeforeReqFns.beforeValidatePurchaseXboxFunction != nil { - allBeforeReqFunctions.beforeValidatePurchaseXboxFunction = luaBeforeReqFns.beforeValidatePurchaseXboxFunction - startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasexbox")) - } - if luaBeforeReqFns.beforeValidatePurchasePlaystationFunction != nil { - allBeforeReqFunctions.beforeValidatePurchasePlaystationFunction = luaBeforeReqFns.beforeValidatePurchasePlaystationFunction - startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchaseplaystation")) - } if luaBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = luaBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1676,14 +1652,6 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = goBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } - if goBeforeReqFns.beforeValidatePurchaseXboxFunction != nil { - allBeforeReqFunctions.beforeValidatePurchaseXboxFunction = goBeforeReqFns.beforeValidatePurchaseXboxFunction - startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasexbox")) - } - if goBeforeReqFns.beforeValidatePurchasePlaystationFunction != nil { - allBeforeReqFunctions.beforeValidatePurchasePlaystationFunction = goBeforeReqFns.beforeValidatePurchasePlaystationFunction - startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchaseplaystation")) - } if goBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = goBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1935,12 +1903,6 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction != nil { startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } - if allAfterReqFunctions.afterValidatePurchaseXboxFunction != nil { - startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasexbox")) - } - if allAfterReqFunctions.afterValidatePurchasePlaystationFunction != nil { - startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchaseplaystation")) - } if allAfterReqFunctions.afterValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -2258,14 +2220,6 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = luaAfterReqFns.afterValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } - if luaAfterReqFns.afterValidatePurchaseXboxFunction != nil { - allAfterReqFunctions.afterValidatePurchaseXboxFunction = luaAfterReqFns.afterValidatePurchaseXboxFunction - startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasexbox")) - } - if luaAfterReqFns.afterValidatePurchasePlaystationFunction != nil { - allAfterReqFunctions.afterValidatePurchasePlaystationFunction = luaAfterReqFns.afterValidatePurchasePlaystationFunction - startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchaseplaystation")) - } if luaAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = luaAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2592,14 +2546,6 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = goAfterReqFns.afterValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } - if goAfterReqFns.afterValidatePurchaseXboxFunction != nil { - allAfterReqFunctions.afterValidatePurchaseXboxFunction = goAfterReqFns.afterValidatePurchaseXboxFunction - startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasexbox")) - } - if goAfterReqFns.afterValidatePurchasePlaystationFunction != nil { - allAfterReqFunctions.afterValidatePurchasePlaystationFunction = goAfterReqFns.afterValidatePurchasePlaystationFunction - startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchaseplaystation")) - } if goAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = goAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2680,7 +2626,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. startupLogger.Info("Registered JavaScript runtime Leaderboard Reset function invocation") } - var allPurchaseNotificationAppleFunction runtime.ApplePurchaseHookFn + var allPurchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction switch { case goPurchaseNotificationAppleFn != nil: allPurchaseNotificationAppleFunction = goPurchaseNotificationAppleFn @@ -2693,14 +2639,7 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. startupLogger.Info("Registered JavaScript runtime Purchase Notification Apple function invocation") } - var allPurchaseNotificationXboxFunction runtime.XboxRefundHookFn - switch { - case goPurchaseNotificationXboxFn != nil: - allPurchaseNotificationXboxFunction = goPurchaseNotificationXboxFn - startupLogger.Info("Registered Go runtime Purchase Notification Xbox function invocation") - } - - var allSubscriptionNotificationAppleFunction runtime.AppleSubscriptionFn + var allSubscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction switch { case goSubscriptionNotificationAppleFn != nil: allSubscriptionNotificationAppleFunction = goSubscriptionNotificationAppleFn @@ -2802,7 +2741,6 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. subscriptionNotificationAppleFunction: allSubscriptionNotificationAppleFunction, purchaseNotificationGoogleFunction: allPurchaseNotificationGoogleFunction, subscriptionNotificationGoogleFunction: allSubscriptionNotificationGoogleFunction, - purchaseNotificationXboxFunction: allPurchaseNotificationXboxFunction, storageIndexFilterFunctions: allStorageIndexFilterFunctions, httpHandlers: httpHandlers, @@ -3548,21 +3486,6 @@ func (r *Runtime) AfterValidatePurchaseFacebookInstant() RuntimeAfterValidatePur return r.afterReqFunctions.afterValidatePurchaseFacebookInstantFunction } -func (r *Runtime) BeforeValidatePurchaseXbox() RuntimeBeforeValidatePurchaseXboxFunction { - return r.beforeReqFunctions.beforeValidatePurchaseXboxFunction -} - -func (r *Runtime) AfterValidatePurchaseXbox() RuntimeAfterValidatePurchaseXboxFunction { - return r.afterReqFunctions.afterValidatePurchaseXboxFunction -} - -func (r *Runtime) BeforeValidatePurchasePlaystation() RuntimeBeforeValidatePurchasePlaystationFunction { - return r.beforeReqFunctions.beforeValidatePurchasePlaystationFunction -} - -func (r *Runtime) AfterValidatePurchasePlaystation() RuntimeAfterValidatePurchasePlaystationFunction { - return r.afterReqFunctions.afterValidatePurchasePlaystationFunction -} func (r *Runtime) BeforeEvent() RuntimeBeforeEventFunction { return r.beforeReqFunctions.beforeEventFunction } @@ -3587,11 +3510,11 @@ func (r *Runtime) Shutdown() RuntimeShutdownFunction { return r.shutdownFunction } -func (r *Runtime) PurchaseNotificationApple() runtime.ApplePurchaseHookFn { +func (r *Runtime) PurchaseNotificationApple() RuntimePurchaseNotificationAppleFunction { return r.purchaseNotificationAppleFunction } -func (r *Runtime) SubscriptionNotificationApple() runtime.AppleSubscriptionFn { +func (r *Runtime) SubscriptionNotificationApple() RuntimeSubscriptionNotificationAppleFunction { return r.subscriptionNotificationAppleFunction } @@ -3607,10 +3530,6 @@ func (r *Runtime) SubscriptionNotificationGoogle() RuntimeSubscriptionNotificati return r.subscriptionNotificationGoogleFunction } -func (r *Runtime) PurchaseNotificationXbox() runtime.XboxRefundHookFn { - return r.purchaseNotificationXboxFunction -} - func (r *Runtime) LeaderboardReset() RuntimeLeaderboardResetFunction { return r.leaderboardResetFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index e8d0c9eaa6..4a725817e2 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -59,11 +59,10 @@ type RuntimeGoInitializer struct { tournamentReset RuntimeTournamentResetFunction leaderboardReset RuntimeLeaderboardResetFunction shutdownFunction RuntimeShutdownFunction - purchaseNotificationApple runtime.ApplePurchaseHookFn - subscriptionNotificationApple runtime.AppleSubscriptionFn + purchaseNotificationApple RuntimePurchaseNotificationAppleFunction + subscriptionNotificationApple RuntimeSubscriptionNotificationAppleFunction purchaseNotificationGoogle RuntimePurchaseNotificationGoogleFunction subscriptionNotificationGoogle RuntimeSubscriptionNotificationGoogleFunction - purchaseNotificationXbox runtime.XboxRefundHookFn matchmakerOverride RuntimeMatchmakerOverrideFunction storageIndexFunctions map[string]RuntimeStorageIndexFilterFunction httpHandlers []*RuntimeHttpHandler @@ -2415,70 +2414,6 @@ func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseApple(fn func(ctx c return nil } -func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchaseXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error)) error { - ri.beforeReq.beforeValidatePurchaseXboxFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error, codes.Code) { - ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") - loggerFields := map[string]interface{}{"api_id": "validatepurchasexbox", "mode": RuntimeExecutionModeBefore.String()} - result, fnErr := fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, in) - if fnErr != nil { - var runtimeErr *runtime.Error - if errors.As(fnErr, &runtimeErr) { - if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { - // If error is present but code is invalid then default to 13 (Internal) as the error code. - return result, runtimeErr, codes.Internal - } - return result, runtimeErr, codes.Code(runtimeErr.Code) - } - // Not a runtime error that contains a code. - return result, fnErr, codes.Internal - } - return result, nil, codes.OK - } - - return nil -} - -func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error) error { - ri.afterReq.afterValidatePurchaseXboxFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error { - ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") - loggerFields := map[string]interface{}{"api_id": "validatepurchasexbox", "mode": RuntimeExecutionModeAfter.String()} - return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) - } - return nil -} - -func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchasePlaystation(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error)) error { - ri.beforeReq.beforeValidatePurchasePlaystationFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error, codes.Code) { - ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") - loggerFields := map[string]interface{}{"api_id": "validatepurchaseplaystation", "mode": RuntimeExecutionModeBefore.String()} - result, fnErr := fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, in) - if fnErr != nil { - var runtimeErr *runtime.Error - if errors.As(fnErr, &runtimeErr) { - if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { - // If error is present but code is invalid then default to 13 (Internal) as the error code. - return result, runtimeErr, codes.Internal - } - return result, runtimeErr, codes.Code(runtimeErr.Code) - } - // Not a runtime error that contains a code. - return result, fnErr, codes.Internal - } - return result, nil, codes.OK - } - - return nil -} - -func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchasePlaystation(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error) error { - ri.afterReq.afterValidatePurchasePlaystationFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error { - ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") - loggerFields := map[string]interface{}{"api_id": "validatepurchaseplaystation", "mode": RuntimeExecutionModeAfter.String()} - return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) - } - return nil -} - func (ri *RuntimeGoInitializer) RegisterBeforeValidateSubscriptionApple(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error)) error { ri.beforeReq.beforeValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") @@ -2857,14 +2792,6 @@ func (ri *RuntimeGoInitializer) RegisterSubscriptionNotificationGoogle(fn func(c return nil } -//func (ri *RuntimeGoInitializer) RegisterPurchaseNotificationXbox(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error) error { -// ri.purchaseNotificationXbox = func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error { -// ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModePurchaseNotificationXbox, nil, nil, 0, "", "", nil, "", "", "", "") -// return fn(ctx, ri.logger.WithField("mode", RuntimeExecutionModePurchaseNotificationXbox.String()), ri.db, ri.nk, purchase, providerPayload) -// } -// return nil -//} - func (ri *RuntimeGoInitializer) RegisterStorageIndex(name, collection, key string, fields []string, sortableFields []string, maxEntries int, indexOnly bool) error { return ri.storageIndex.CreateIndex(context.Background(), name, collection, key, fields, sortableFields, maxEntries, indexOnly) } @@ -2928,23 +2855,6 @@ func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purcha nk.purchaseProviders[platform] = purchaseProvider } - //switch p { - //case iap.Xbox: - // if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - // ri.iapXboxManager = iapManager - // nk.IAPXboxManager = iapManager - // ri.registeredIAPs = append(ri.registeredIAPs, platform) - // } - //case iap.Playstation: - // if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - // ri.iapPlaystationManager = iapManager - // nk.IAPPlaystationManager = iapManager - // ri.registeredIAPs = append(ri.registeredIAPs, platform) - // } - //default: - // return errors.New("platform not valid") - //} - return nil } @@ -3005,7 +2915,7 @@ func (ri *RuntimeGoInitializer) RegisterMatch(name string, fn func(ctx context.C return nil } -func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, runtime.ApplePurchaseHookFn, runtime.AppleSubscriptionFn, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, runtime.XboxRefundHookFn, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, map[string]runtime.PurchaseProvider, map[string]runtime.RefundFns, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { +func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, storageIndex StorageIndex, satoriClient runtime.Satori, rootPath string, paths []string, eventQueue *RuntimeEventQueue, matchProvider *MatchProvider, fmCallbackHandler runtime.FmCallbackHandler) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchmakerOverrideFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, runtime.FleetManager, map[string]runtime.PurchaseProvider, map[string]runtime.RefundFns, []*RuntimeHttpHandler, *RuntimeEventFunctions, func() []string, error) { runtimeLogger := NewRuntimeGoLogger(logger) node := config.GetName() env := config.GetRuntime().Environment @@ -3094,13 +3004,13 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger relPath, name, fn, err := openGoModule(startupLogger, rootPath, path) if err != nil { // Errors are already logged in the function above. - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, err } // Run the initialisation. if err = fn(ctx, runtimeLogger, db, nk, initializer); err != nil { startupLogger.Fatal("Error returned by InitModule function in Go module", zap.String("name", name), zap.Error(err)) - return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") + return nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, errors.New("error returned by InitModule function in Go module") } modulePaths = append(modulePaths, relPath) } @@ -3150,7 +3060,7 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger RegisterBuiltInIAPPurchaseProviders(nk, runtimeLogger, initializer) - return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.purchaseNotificationXbox, initializer.storageIndexFunctions, initializer.fleetManager, initializer.purchaseProviders, initializer.refundFns, initializer.httpHandlers, events, matchNamesListFn, nil + return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.storageIndexFunctions, initializer.fleetManager, initializer.purchaseProviders, initializer.refundFns, initializer.httpHandlers, events, matchNamesListFn, nil } func RegisterBuiltInIAPPurchaseProviders(nk runtime.NakamaModule, logger runtime.Logger, initializer runtime.Initializer) { diff --git a/server/runtime_javascript.go b/server/runtime_javascript.go index 4d04ec98fa..94cfaf0dd8 100644 --- a/server/runtime_javascript.go +++ b/server/runtime_javascript.go @@ -645,7 +645,7 @@ func (rp *RuntimeProviderJS) Put(r *RuntimeJS) { } } -func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, path, entrypoint string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, runtime.ApplePurchaseHookFn, runtime.AppleSubscriptionFn, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { +func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, path, entrypoint string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { startupLogger.Info("Initialising JavaScript runtime provider", zap.String("path", path), zap.String("entrypoint", entrypoint)) modCache, err := cacheJavascriptModules(startupLogger, path, entrypoint) @@ -699,8 +699,8 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger var tournamentResetFunction RuntimeTournamentResetFunction var leaderboardResetFunction RuntimeLeaderboardResetFunction var shutdownFunction RuntimeShutdownFunction - var purchaseNotificationAppleFunction runtime.ApplePurchaseHookFn - var subscriptionNotificationAppleFunction runtime.AppleSubscriptionFn + var purchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction + var subscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction var purchaseNotificationGoogleFunction RuntimePurchaseNotificationGoogleFunction var subscriptionNotificationGoogleFunction RuntimeSubscriptionNotificationGoogleFunction storageIndexFilterFunctions := make(map[string]RuntimeStorageIndexFilterFunction, 0) diff --git a/server/runtime_lua.go b/server/runtime_lua.go index 5c2eddc732..a733fbff1f 100644 --- a/server/runtime_lua.go +++ b/server/runtime_lua.go @@ -113,7 +113,7 @@ type RuntimeProviderLua struct { statsCtx context.Context } -func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, rootPath string, paths []string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, runtime.ApplePurchaseHookFn, runtime.AppleSubscriptionFn, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { +func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, rootPath string, paths []string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { startupLogger.Info("Initialising Lua runtime provider", zap.String("path", rootPath)) // Load Lua modules into memory by reading the file contents. No evaluation/execution at this stage. @@ -135,8 +135,8 @@ func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logge var tournamentResetFunction RuntimeTournamentResetFunction var leaderboardResetFunction RuntimeLeaderboardResetFunction var shutdownFunction RuntimeShutdownFunction - var purchaseNotificationAppleFunction runtime.ApplePurchaseHookFn - var subscriptionNotificationAppleFunction runtime.AppleSubscriptionFn + var purchaseNotificationAppleFunction RuntimePurchaseNotificationAppleFunction + var subscriptionNotificationAppleFunction RuntimeSubscriptionNotificationAppleFunction var purchaseNotificationGoogleFunction RuntimePurchaseNotificationGoogleFunction var subscriptionNotificationGoogleFunction RuntimeSubscriptionNotificationGoogleFunction storageIndexFilterFunctions := make(map[string]RuntimeStorageIndexFilterFunction, 0) diff --git a/server/xbox_refund_poller.go b/server/xbox_refund_poller.go index 86a1735254..f144d48025 100644 --- a/server/xbox_refund_poller.go +++ b/server/xbox_refund_poller.go @@ -41,27 +41,26 @@ func NewXboxRefundPoller(logger *zap.Logger, db *sql.DB, config Config) *LocalXb func (x *LocalXboxRefundPoller) Start(runtime *Runtime) { period := x.config.GetIAP().Xbox.RefundCheckPeriodMin if period != 0 { - go func() { - ticker := time.NewTicker(1 * time.Minute) - defer ticker.Stop() - for { - select { - case <-x.ctx.Done(): - return - case <-ticker.C: - provider, err := iap.GetPurchaseProvider("xbox", runtime.purchaseProviders) - if err != nil { - x.logger.Error("failed to get purchase provider on xbox refund poller", zap.Error(err)) - } - _, err = provider.HandleRefund(x.ctx, x.logger, x.db) - if err != nil { - x.logger.Error("xbox refund poller failed", zap.Error(err)) - continue - } + go func() { + ticker := time.NewTicker(1 * time.Minute) + defer ticker.Stop() + for { + select { + case <-x.ctx.Done(): + return + case <-ticker.C: + provider, err := iap.GetPurchaseProvider("xbox", runtime.purchaseProviders) + if err != nil { + x.logger.Error("failed to get purchase provider on xbox refund poller", zap.Error(err)) + } + _, err = provider.HandleRefund(x.ctx, x.logger, x.db) + if err != nil { + x.logger.Error("xbox refund poller failed", zap.Error(err)) + continue } } - }() - } + } + }() } } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index cb727d5ef2..8dd6ea89ea 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -800,18 +800,6 @@ type Initializer interface { // RegisterAfterValidatePurchaseFacebookInstant can be used to perform additional logic after validating an Facebook Instant IAP receipt. RegisterAfterValidatePurchaseFacebookInstant(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error) error - // RegisterBeforeValidatePurchaseXbox can be used to perform additional logic before validating a Xbox Store receipt - RegisterBeforeValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseXboxRequest) (*api.ValidatePurchaseXboxRequest, error)) error - - // RegisterAfterValidatePurchaseXbox can be used to perform additional logic after validating a Xbox Store receipt - RegisterAfterValidatePurchaseXbox(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseXboxRequest) error) error - - // RegisterBeforeValidatePurchasePlaystation can be used to perform additonal logic before validating a Playstation Store receipt - RegisterBeforeValidatePurchasePlaystation(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchasePlaystationRequest) (*api.ValidatePurchasePlaystationRequest, error)) error - - // RegisterAfterValidatePurchasePlaystation can be used to perform additional logic after validating a Playstation Store receipt - RegisterAfterValidatePurchasePlaystation(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchasePlaystationRequest) error) error - // //// RegisterBeforeValidatePurchaseEpic can be used to perform additonal logic before validating a Epic Store receipt //RegisterBeforeValidatePurchaseEpic(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseEpicRequest) (*api.ValidatePurchaseEpicRequest, error)) error // @@ -1376,10 +1364,6 @@ type FleetManagerInitializer interface { Delete(ctx context.Context, id string) error } -type XboxRefundHookFn func(ctx context.Context, logger *zap.Logger, db *sql.DB, nk NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error -type ApplePurchaseHookFn func(ctx context.Context, purchase *api.ValidatedPurchase, providerPayload string) error -type AppleSubscriptionFn func(ctx context.Context, subscription *api.ValidatedSubscription, providerPayload string) error - type PurchaseProvider interface { Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) // token and environment is config From 1daa4343c1deb963c2fec9883212284f36aa7bdf Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Thu, 17 Jul 2025 11:37:46 +0100 Subject: [PATCH 09/28] remove test logs --- server/runtime_go.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/server/runtime_go.go b/server/runtime_go.go index 4a725817e2..630a65d1f5 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -2837,17 +2837,12 @@ func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purcha return errors.New("platform already registered") } - ri.logger.Info("platform not registered") - if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - ri.logger.Info("platform registered") if ri.purchaseProviders == nil { - ri.logger.Info("ri purchase providers created") ri.purchaseProviders = make(map[string]runtime.PurchaseProvider) } if nk.purchaseProviders == nil { - ri.logger.Info("nk purchase providers created") nk.purchaseProviders = make(map[string]runtime.PurchaseProvider) } From f5604af7b4f6282143325537d4632b943e4df75b Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 22 Jul 2025 16:05:02 +0100 Subject: [PATCH 10/28] revert dockerfile changes --- build/Dockerfile | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index f702194881..3d090cc681 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,40 +1,61 @@ +## Copyright 2018 The Nakama Authors +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +# docker build . --build-arg commit="$(git rev-parse --short HEAD)" --build-arg version=v2.1.1 -t heroiclabs/nakama:2.1.1 +# docker build . --build-arg commit="$(git rev-parse --short HEAD)" --build-arg version="$(git rev-parse --short HEAD)" -t heroiclabs/nakama-prerelease:"$(git rev-parse --short HEAD)" + FROM golang:1.24.3-bookworm AS builder -ENV GOOS linux -ENV CGO_ENABLED 1 +ARG COMMIT +ARG VERSION +ARG TARGETOS +ARG TARGETARCH + +ENV GOOS=$TARGETOS +ENV GOARCH=$TARGETARCH +ENV CGO_ENABLED=1 +ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get -y upgrade && \ apt-get install -y --no-install-recommends ca-certificates gcc libc6-dev WORKDIR /go/build/nakama - COPY . . - -RUN go build -o /go/build-out/nakama -trimpath -mod=vendor -gcflags "-trimpath $PWD" -asmflags "-trimpath $PWD" -ldflags "-s -w -X main.version=local" +RUN go build -o /go/build-out/nakama -trimpath -mod=vendor -gcflags "-trimpath $PWD" -asmflags "-trimpath $PWD" -ldflags "-s -w -X main.version=$VERSION -X main.commitID=$COMMIT" FROM debian:bookworm-slim -MAINTAINER Heroic Labs - -ARG version +ARG VERSION -LABEL version=$version +LABEL maintainer="Heroic Labs" +LABEL contact="support@heroiclabs.com" +LABEL version=$VERSION LABEL variant=nakama LABEL description="Distributed server for social and realtime games and apps." +ENV DEBIAN_FRONTEND=noninteractive + RUN mkdir -p /nakama/data/modules && \ apt-get update && \ apt-get -y upgrade && \ apt-get install -y --no-install-recommends ca-certificates tzdata iproute2 tini && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* - WORKDIR /nakama/ COPY --from=builder "/go/build-out/nakama" /nakama/ EXPOSE 7349 7350 7351 - ENTRYPOINT ["tini", "--", "/nakama/nakama"] - HEALTHCHECK --interval=30s --timeout=10s \ CMD /nakama/nakama healthcheck || exit 1 From a2d1df0436862a66adc0cf9d5cce3b0185f910b2 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 22 Jul 2025 16:06:07 +0100 Subject: [PATCH 11/28] white space added back in dockerfile --- build/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build/Dockerfile b/build/Dockerfile index 3d090cc681..1504ed9414 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -52,10 +52,13 @@ RUN mkdir -p /nakama/data/modules && \ apt-get -y upgrade && \ apt-get install -y --no-install-recommends ca-certificates tzdata iproute2 tini && \ apt-get clean && \ - rm -rf /var/lib/apt/lists/* + rm -rf /var/lib/apt/lists/* \ + WORKDIR /nakama/ COPY --from=builder "/go/build-out/nakama" /nakama/ EXPOSE 7349 7350 7351 + ENTRYPOINT ["tini", "--", "/nakama/nakama"] + HEALTHCHECK --interval=30s --timeout=10s \ CMD /nakama/nakama healthcheck || exit 1 From 7206953f2a8e4f89fabffe8c64b6ffee99cf7522 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 22 Jul 2025 16:06:46 +0100 Subject: [PATCH 12/28] dockerfile revert --- build/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile b/build/Dockerfile index 1504ed9414..40b9690f1e 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -52,7 +52,7 @@ RUN mkdir -p /nakama/data/modules && \ apt-get -y upgrade && \ apt-get install -y --no-install-recommends ca-certificates tzdata iproute2 tini && \ apt-get clean && \ - rm -rf /var/lib/apt/lists/* \ + rm -rf /var/lib/apt/lists/* WORKDIR /nakama/ COPY --from=builder "/go/build-out/nakama" /nakama/ From c632479041ebfe752ac111ee48668b620082cd0f Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 22 Jul 2025 19:37:17 +0100 Subject: [PATCH 13/28] started address PR comments --- apigrpc/apigrpc.pb.go | 2 +- apigrpc/apigrpc.pb.gw.go | 4 +- apigrpc/apigrpc.proto | 2 +- apigrpc/apigrpc.swagger.json | 2 +- iap/apple.go | 60 +- main.go | 2 - server/api_purchase.go | 2 +- server/runtime_go.go | 6 +- server/xbox_refund_poller.go | 77 -- .../heroiclabs/nakama-common/api/api.pb.go | 735 ++++++------------ .../heroiclabs/nakama-common/api/api.proto | 27 - .../nakama-common/runtime/config.go | 12 + .../nakama-common/runtime/runtime.go | 35 +- 13 files changed, 293 insertions(+), 673 deletions(-) delete mode 100644 server/xbox_refund_poller.go diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index 9a6983b7ab..d10354e991 100644 --- a/apigrpc/apigrpc.pb.go +++ b/apigrpc/apigrpc.pb.go @@ -157,7 +157,7 @@ const file_apigrpc_proto_rawDesc = "" + "\vUnlinkSteam\x12\x18.nakama.api.AccountSteam\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/account/unlink/steam\x12a\n" + "\rUpdateAccount\x12 .nakama.api.UpdateAccountRequest\x1a\x16.google.protobuf.Empty\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\x1a\v/v2/account\x12f\n" + "\vUpdateGroup\x12\x1e.nakama.api.UpdateGroupRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\x1a\x14/v2/group/{group_id}\x12z\n" + - "\x10ValidatePurchase\x12#.nakama.api.ValidatePurchaseRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\x1a\x10/v2/iap/purchase\x12\x8a\x01\n" + + "\x10ValidatePurchase\x12#.nakama.api.ValidatePurchaseRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v2/iap/purchase\x12\x8a\x01\n" + "\x15ValidatePurchaseApple\x12(.nakama.api.ValidatePurchaseAppleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/iap/purchase/apple\x12\x9a\x01\n" + "\x19ValidateSubscriptionApple\x12,.nakama.api.ValidateSubscriptionAppleRequest\x1a(.nakama.api.ValidateSubscriptionResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v2/iap/subscription/apple\x12\x8d\x01\n" + "\x16ValidatePurchaseGoogle\x12).nakama.api.ValidatePurchaseGoogleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/iap/purchase/google\x12\x9d\x01\n" + diff --git a/apigrpc/apigrpc.pb.gw.go b/apigrpc/apigrpc.pb.gw.go index ae2721b4eb..14f3b63239 100644 --- a/apigrpc/apigrpc.pb.gw.go +++ b/apigrpc/apigrpc.pb.gw.go @@ -4546,7 +4546,7 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Nakama_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPut, pattern_Nakama_ValidatePurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -6098,7 +6098,7 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Nakama_UpdateGroup_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodPut, pattern_Nakama_ValidatePurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_Nakama_ValidatePurchase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) diff --git a/apigrpc/apigrpc.proto b/apigrpc/apigrpc.proto index 9350cb029c..6251fc0062 100644 --- a/apigrpc/apigrpc.proto +++ b/apigrpc/apigrpc.proto @@ -680,7 +680,7 @@ service Nakama { // Validate Purchase rpc ValidatePurchase (api.ValidatePurchaseRequest) returns (api.ValidatePurchaseResponse) { option (google.api.http) = { - put: "/v2/iap/purchase", + post: "/v2/iap/purchase", body: "*" }; } diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index 65b09dec59..1477136b35 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -2217,7 +2217,7 @@ } }, "/v2/iap/purchase": { - "put": { + "post": { "summary": "Validate Purchase", "operationId": "Nakama_ValidatePurchase", "responses": { diff --git a/iap/apple.go b/iap/apple.go index cfab597b62..b2296bc015 100644 --- a/iap/apple.go +++ b/iap/apple.go @@ -29,6 +29,9 @@ type ApplePurchaseProvider struct { logger runtime.Logger purchaseFn runtime.PurchaseRefundFn subscriptionFn runtime.SubscriptionRefundFn + config runtime.IAPConfig + db *sql.DB + zapLogger *zap.Logger } func (a *ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) { @@ -36,16 +39,21 @@ func (a *ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, a.subscriptionFn = subscriptionRefundFn } -func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, receipt string, userID uuid.UUID, persist bool, config runtime.IAPConfig) (*api.ValidatePurchaseResponse, error) { - validation, raw, err := ValidateReceiptApple(ctx, Httpc, receipt, config.GetApple().GetSharedPassword()) +func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, receipt, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { + uuidUserID, err := uuid.FromString(userID) + if err != nil { + a.logger.Error("Error parsing user ID, error: %v", err) + } + + validation, raw, err := ValidateReceiptApple(ctx, Httpc, receipt, a.config.GetApple().GetSharedPassword()) if err != nil { if err != context.Canceled { var vErr *ValidationError if errors.As(err, &vErr) { - logger.Debug("Error validating Apple receipt", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) + a.logger.Debug("Error validating Apple receipt, error: &v, status_code: %v, payload: %v", vErr.Err, vErr.StatusCode, vErr.Payload) return nil, vErr } else { - logger.Error("Error validating Apple receipt", zap.Error(err)) + a.logger.Error("Error validating Apple receipt, error: %v", err) } } return nil, err @@ -80,7 +88,7 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *za seenTransactionIDs[purchase.TransactionId] = struct{}{} storagePurchases = append(storagePurchases, &StoragePurchase{ - UserID: userID, + UserID: uuidUserID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: purchase.ProductID, TransactionId: purchase.TransactionId, @@ -106,7 +114,7 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *za seenTransactionIDs[purchase.TransactionId] = struct{}{} storagePurchases = append(storagePurchases, &StoragePurchase{ - UserID: userID, + UserID: uuidUserID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: purchase.ProductId, TransactionId: purchase.TransactionId, @@ -139,7 +147,7 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *za return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := UpsertPurchases(ctx, db, storagePurchases) + purchases, err := UpsertPurchases(ctx, a.db, storagePurchases) if err != nil { return nil, err } @@ -169,16 +177,21 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, logger *za }, nil } -func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { +func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { + uuidUserID, err := uuid.FromString(userID) + if err != nil { + a.logger.Error("Error parsing user ID, error: %v", err) + } + validation, rawResponse, err := ValidateReceiptApple(ctx, Httpc, receipt, password) if err != nil { if err != context.Canceled { var vErr *ValidationError if errors.As(err, &vErr) { - logger.Error("Error validating Apple receipt", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) + a.logger.Error("Error validating Apple receipt, error: &v, status_code: %v, payload: %v", vErr.Err, vErr.StatusCode, vErr.Payload) return nil, vErr } else { - logger.Error("Error validating Apple receipt", zap.Error(err)) + a.logger.Error("Error validating Apple receipt", zap.Error(err)) } } return nil, err @@ -229,7 +242,7 @@ func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger } storageSub := &StorageSubscription{ - UserID: userID, + UserID: uuidUserID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: receiptInfo.ProductId, OriginalTransactionId: receiptInfo.OriginalTransactionId, @@ -256,7 +269,7 @@ func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil } - if err = UpsertSubscription(ctx, db, storageSub); err != nil { + if err = UpsertSubscription(ctx, a.db, storageSub); err != nil { return nil, err } @@ -274,7 +287,7 @@ func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, logger return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil } -func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) (http.HandlerFunc, error) { +func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { return func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) if err != nil { @@ -435,7 +448,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Lo // Notification regarding a subscription. if uid.IsNil() { // No user ID was found in receipt, lookup a validated subscription. - s, err := GetSubscriptionByOriginalTransactionId(r.Context(), logger, db, signedTransactionInfo.OriginalTransactionId) + s, err := GetSubscriptionByOriginalTransactionId(r.Context(), a.zapLogger, a.db, signedTransactionInfo.OriginalTransactionId) if err != nil || s == nil { w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. return @@ -455,7 +468,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Lo RefundTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), } - if err = UpsertSubscription(r.Context(), db, sub); err != nil { + if err = UpsertSubscription(r.Context(), a.db, sub); err != nil { var pgErr *pgconn.PgError if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { // User id was not found, ignore this notification @@ -495,7 +508,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Lo } if a.subscriptionFn != nil { - if err = a.subscriptionFn(r.Context(), a.logger, db, a.nk, validatedSub, string(body)); err != nil { + if err = a.subscriptionFn(r.Context(), a.logger, a.db, a.nk, validatedSub, string(body)); err != nil { a.logger.Error("Error invoking Apple subscription refund runtime function", zap.Error(err)) w.WriteHeader(http.StatusOK) return @@ -507,7 +520,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Lo // Notification regarding a purchase. if uid.IsNil() { // No user ID was found in receipt, lookup a validated subscription. - p, err := GetPurchaseByTransactionId(r.Context(), logger, db, signedTransactionInfo.TransactionId) + p, err := GetPurchaseByTransactionId(r.Context(), a.zapLogger, a.db, signedTransactionInfo.TransactionId) if err != nil || p == nil { // User validated purchase not found. w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. @@ -527,7 +540,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Lo Environment: env, } - dbPurchases, err := UpsertPurchases(r.Context(), db, []*StoragePurchase{purchase}) + dbPurchases, err := UpsertPurchases(r.Context(), a.db, []*StoragePurchase{purchase}) if err != nil { a.logger.Error("Failed to store App Store notification purchase data") w.WriteHeader(http.StatusInternalServerError) @@ -554,7 +567,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Lo SeenBefore: dbPurchase.SeenBefore, } - if err = a.purchaseFn(r.Context(), a.logger, db, a.nk, validatedPurchase, string(body)); err != nil { + if err = a.purchaseFn(r.Context(), a.logger, a.db, a.nk, validatedPurchase, string(body)); err != nil { a.logger.Error("Error invoking Apple purchase refund runtime function", zap.Error(err)) w.WriteHeader(http.StatusOK) return @@ -567,10 +580,13 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context, logger *zap.Lo }, nil } -func NewApplePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger) runtime.PurchaseProvider { +func NewApplePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { purchaseProvider := &ApplePurchaseProvider{ - nk: nk, - logger: logger, + nk: nk, + logger: logger, + db: db, + config: config, + zapLogger: zapLogger, } return purchaseProvider diff --git a/main.go b/main.go index af0ead2eb1..f395dece10 100644 --- a/main.go +++ b/main.go @@ -187,7 +187,6 @@ func main() { leaderboardRankCache := server.NewLocalLeaderboardRankCache(ctx, startupLogger, db, config.GetLeaderboard(), leaderboardCache) leaderboardScheduler := server.NewLocalLeaderboardScheduler(logger, db, config, leaderboardCache, leaderboardRankCache) googleRefundScheduler := server.NewGoogleRefundScheduler(logger, db, config) - xboxRefundPoller := server.NewXboxRefundPoller(logger, db, config) matchRegistry := server.NewLocalMatchRegistry(logger, startupLogger, config, sessionRegistry, tracker, router, metrics, config.GetName()) tracker.SetMatchJoinListener(matchRegistry.Join) tracker.SetMatchLeaveListener(matchRegistry.Leave) @@ -216,7 +215,6 @@ func main() { leaderboardScheduler.Start(runtime) googleRefundScheduler.Start(runtime) - xboxRefundPoller.Start(runtime) pipeline := server.NewPipeline(logger, config, db, jsonpbMarshaler, jsonpbUnmarshaler, sessionRegistry, statusRegistry, matchRegistry, partyRegistry, matchmaker, tracker, router, runtime) statusHandler := server.NewLocalStatusHandler(logger, sessionRegistry, matchRegistry, tracker, metrics, config.GetName()) diff --git a/server/api_purchase.go b/server/api_purchase.go index a846165e5b..84762fdf29 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -70,7 +70,7 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha persist = in.Persist.GetValue() } - validation, err := purchaseProvider.PurchaseValidate(ctx, s.logger, s.db, in.Receipt, userID, persist, s.config.GetIAP()) + validation, err := purchaseProvider.PurchaseValidate(ctx, in.Receipt, userID.String(), persist) if err != nil { return nil, err } diff --git a/server/runtime_go.go b/server/runtime_go.go index 630a65d1f5..3968de21c3 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -3053,14 +3053,14 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger } } - RegisterBuiltInIAPPurchaseProviders(nk, runtimeLogger, initializer) + RegisterBuiltInIAPPurchaseProviders(nk, runtimeLogger, initializer, db, config.GetIAP(), logger) return modulePaths, initializer.rpc, initializer.beforeRt, initializer.afterRt, initializer.beforeReq, initializer.afterReq, initializer.matchmakerMatched, initializer.matchmakerOverride, initializer.tournamentEnd, initializer.tournamentReset, initializer.leaderboardReset, initializer.shutdownFunction, initializer.purchaseNotificationApple, initializer.subscriptionNotificationApple, initializer.purchaseNotificationGoogle, initializer.subscriptionNotificationGoogle, initializer.storageIndexFunctions, initializer.fleetManager, initializer.purchaseProviders, initializer.refundFns, initializer.httpHandlers, events, matchNamesListFn, nil } -func RegisterBuiltInIAPPurchaseProviders(nk runtime.NakamaModule, logger runtime.Logger, initializer runtime.Initializer) { +func RegisterBuiltInIAPPurchaseProviders(nk runtime.NakamaModule, logger runtime.Logger, initializer runtime.Initializer, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) { // Apple - provider := iap.NewApplePurchaseProvider(nk, logger) + provider := iap.NewApplePurchaseProvider(nk, logger, db, config, zapLogger) if provider != nil { initializer.RegisterPurchaseProvider("apple", provider) } diff --git a/server/xbox_refund_poller.go b/server/xbox_refund_poller.go deleted file mode 100644 index f144d48025..0000000000 --- a/server/xbox_refund_poller.go +++ /dev/null @@ -1,77 +0,0 @@ -package server - -import ( - "context" - "database/sql" - "github.com/heroiclabs/nakama/v3/iap" - "go.uber.org/atomic" - "go.uber.org/zap" - "time" -) - -type XboxRefundPoller interface { - Start(runtime *Runtime) - Pause() - Resume() - Stop() -} - -type LocalXboxRefundPoller struct { - ctx context.Context - logger *zap.Logger - db *sql.DB - active *atomic.Uint32 - ctxCancelFn context.CancelFunc - config Config -} - -func NewXboxRefundPoller(logger *zap.Logger, db *sql.DB, config Config) *LocalXboxRefundPoller { - ctx, ctxCancelFn := context.WithCancel(context.Background()) - - return &LocalXboxRefundPoller{ - ctx: ctx, - logger: logger, - db: db, - active: atomic.NewUint32(0), - ctxCancelFn: ctxCancelFn, - config: config, - } -} - -func (x *LocalXboxRefundPoller) Start(runtime *Runtime) { - period := x.config.GetIAP().Xbox.RefundCheckPeriodMin - if period != 0 { - go func() { - ticker := time.NewTicker(1 * time.Minute) - defer ticker.Stop() - for { - select { - case <-x.ctx.Done(): - return - case <-ticker.C: - provider, err := iap.GetPurchaseProvider("xbox", runtime.purchaseProviders) - if err != nil { - x.logger.Error("failed to get purchase provider on xbox refund poller", zap.Error(err)) - } - _, err = provider.HandleRefund(x.ctx, x.logger, x.db) - if err != nil { - x.logger.Error("xbox refund poller failed", zap.Error(err)) - continue - } - } - } - }() - } -} - -func (x *LocalXboxRefundPoller) Pause() { - x.active.Store(0) -} - -func (x *LocalXboxRefundPoller) Resume() { - x.active.Store(1) -} - -func (x *LocalXboxRefundPoller) Stop() { - x.ctxCancelFn() -} diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index f7dfc9a3c0..e2a9f4035b 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -7597,268 +7597,6 @@ func (x *ValidatePurchaseFacebookInstantRequest) GetPersist() *wrapperspb.BoolVa return nil } -// Xbox Purchase validation request -type ValidatePurchaseXboxRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ProductId string `protobuf:"bytes,1,opt,name=productId,proto3" json:"productId,omitempty"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - Platform string `protobuf:"bytes,3,opt,name=platform,proto3" json:"platform,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ValidatePurchaseXboxRequest) Reset() { - *x = ValidatePurchaseXboxRequest{} - mi := &file_api_proto_msgTypes[104] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ValidatePurchaseXboxRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidatePurchaseXboxRequest) ProtoMessage() {} - -func (x *ValidatePurchaseXboxRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[104] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidatePurchaseXboxRequest.ProtoReflect.Descriptor instead. -func (*ValidatePurchaseXboxRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{104} -} - -func (x *ValidatePurchaseXboxRequest) GetProductId() string { - if x != nil { - return x.ProductId - } - return "" -} - -func (x *ValidatePurchaseXboxRequest) GetPersist() *wrapperspb.BoolValue { - if x != nil { - return x.Persist - } - return nil -} - -func (x *ValidatePurchaseXboxRequest) GetPlatform() string { - if x != nil { - return x.Platform - } - return "" -} - -// Playstation validation request -type ValidatePurchasePlaystationRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - EntitlementLabel string `protobuf:"bytes,1,opt,name=entitlementLabel,proto3" json:"entitlementLabel,omitempty"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ValidatePurchasePlaystationRequest) Reset() { - *x = ValidatePurchasePlaystationRequest{} - mi := &file_api_proto_msgTypes[105] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ValidatePurchasePlaystationRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidatePurchasePlaystationRequest) ProtoMessage() {} - -func (x *ValidatePurchasePlaystationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[105] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidatePurchasePlaystationRequest.ProtoReflect.Descriptor instead. -func (*ValidatePurchasePlaystationRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{105} -} - -func (x *ValidatePurchasePlaystationRequest) GetEntitlementLabel() string { - if x != nil { - return x.EntitlementLabel - } - return "" -} - -func (x *ValidatePurchasePlaystationRequest) GetPersist() *wrapperspb.BoolValue { - if x != nil { - return x.Persist - } - return nil -} - -type ValidatePurchaseEpicRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - NsCatalogItemId string `protobuf:"bytes,1,opt,name=nsCatalogItemId,proto3" json:"nsCatalogItemId,omitempty"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ValidatePurchaseEpicRequest) Reset() { - *x = ValidatePurchaseEpicRequest{} - mi := &file_api_proto_msgTypes[106] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ValidatePurchaseEpicRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidatePurchaseEpicRequest) ProtoMessage() {} - -func (x *ValidatePurchaseEpicRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[106] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidatePurchaseEpicRequest.ProtoReflect.Descriptor instead. -func (*ValidatePurchaseEpicRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{106} -} - -func (x *ValidatePurchaseEpicRequest) GetNsCatalogItemId() string { - if x != nil { - return x.NsCatalogItemId - } - return "" -} - -func (x *ValidatePurchaseEpicRequest) GetPersist() *wrapperspb.BoolValue { - if x != nil { - return x.Persist - } - return nil -} - -type ValidatePurchaseSteamRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,1,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ValidatePurchaseSteamRequest) Reset() { - *x = ValidatePurchaseSteamRequest{} - mi := &file_api_proto_msgTypes[107] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ValidatePurchaseSteamRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidatePurchaseSteamRequest) ProtoMessage() {} - -func (x *ValidatePurchaseSteamRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[107] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidatePurchaseSteamRequest.ProtoReflect.Descriptor instead. -func (*ValidatePurchaseSteamRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{107} -} - -func (x *ValidatePurchaseSteamRequest) GetPersist() *wrapperspb.BoolValue { - if x != nil { - return x.Persist - } - return nil -} - -type ValidatePurchaseDiscordRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - EntitlementId string `protobuf:"bytes,1,opt,name=entitlementId,proto3" json:"entitlementId,omitempty"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ValidatePurchaseDiscordRequest) Reset() { - *x = ValidatePurchaseDiscordRequest{} - mi := &file_api_proto_msgTypes[108] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ValidatePurchaseDiscordRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidatePurchaseDiscordRequest) ProtoMessage() {} - -func (x *ValidatePurchaseDiscordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[108] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidatePurchaseDiscordRequest.ProtoReflect.Descriptor instead. -func (*ValidatePurchaseDiscordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{108} -} - -func (x *ValidatePurchaseDiscordRequest) GetEntitlementId() string { - if x != nil { - return x.EntitlementId - } - return "" -} - -func (x *ValidatePurchaseDiscordRequest) GetPersist() *wrapperspb.BoolValue { - if x != nil { - return x.Persist - } - return nil -} - // Validated Purchase stored by Nakama. type ValidatedPurchase struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -7890,7 +7628,7 @@ type ValidatedPurchase struct { func (x *ValidatedPurchase) Reset() { *x = ValidatedPurchase{} - mi := &file_api_proto_msgTypes[109] + mi := &file_api_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7902,7 +7640,7 @@ func (x *ValidatedPurchase) String() string { func (*ValidatedPurchase) ProtoMessage() {} func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[109] + mi := &file_api_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7915,7 +7653,7 @@ func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedPurchase.ProtoReflect.Descriptor instead. func (*ValidatedPurchase) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{109} + return file_api_proto_rawDescGZIP(), []int{104} } func (x *ValidatedPurchase) GetUserId() string { @@ -8006,7 +7744,7 @@ type ValidatePurchaseResponse struct { func (x *ValidatePurchaseResponse) Reset() { *x = ValidatePurchaseResponse{} - mi := &file_api_proto_msgTypes[110] + mi := &file_api_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8018,7 +7756,7 @@ func (x *ValidatePurchaseResponse) String() string { func (*ValidatePurchaseResponse) ProtoMessage() {} func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[110] + mi := &file_api_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8031,7 +7769,7 @@ func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseResponse.ProtoReflect.Descriptor instead. func (*ValidatePurchaseResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{110} + return file_api_proto_rawDescGZIP(), []int{105} } func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase { @@ -8051,7 +7789,7 @@ type ValidateSubscriptionResponse struct { func (x *ValidateSubscriptionResponse) Reset() { *x = ValidateSubscriptionResponse{} - mi := &file_api_proto_msgTypes[111] + mi := &file_api_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8063,7 +7801,7 @@ func (x *ValidateSubscriptionResponse) String() string { func (*ValidateSubscriptionResponse) ProtoMessage() {} func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[111] + mi := &file_api_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8076,7 +7814,7 @@ func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{111} + return file_api_proto_rawDescGZIP(), []int{106} } func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubscription { @@ -8120,7 +7858,7 @@ type ValidatedSubscription struct { func (x *ValidatedSubscription) Reset() { *x = ValidatedSubscription{} - mi := &file_api_proto_msgTypes[112] + mi := &file_api_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8132,7 +7870,7 @@ func (x *ValidatedSubscription) String() string { func (*ValidatedSubscription) ProtoMessage() {} func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[112] + mi := &file_api_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8145,7 +7883,7 @@ func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedSubscription.ProtoReflect.Descriptor instead. func (*ValidatedSubscription) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{112} + return file_api_proto_rawDescGZIP(), []int{107} } func (x *ValidatedSubscription) GetUserId() string { @@ -8254,7 +7992,7 @@ type PurchaseList struct { func (x *PurchaseList) Reset() { *x = PurchaseList{} - mi := &file_api_proto_msgTypes[113] + mi := &file_api_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8266,7 +8004,7 @@ func (x *PurchaseList) String() string { func (*PurchaseList) ProtoMessage() {} func (x *PurchaseList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[113] + mi := &file_api_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8279,7 +8017,7 @@ func (x *PurchaseList) ProtoReflect() protoreflect.Message { // Deprecated: Use PurchaseList.ProtoReflect.Descriptor instead. func (*PurchaseList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{113} + return file_api_proto_rawDescGZIP(), []int{108} } func (x *PurchaseList) GetValidatedPurchases() []*ValidatedPurchase { @@ -8318,7 +8056,7 @@ type SubscriptionList struct { func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - mi := &file_api_proto_msgTypes[114] + mi := &file_api_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8330,7 +8068,7 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[114] + mi := &file_api_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8343,7 +8081,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{114} + return file_api_proto_rawDescGZIP(), []int{109} } func (x *SubscriptionList) GetValidatedSubscriptions() []*ValidatedSubscription { @@ -8380,7 +8118,7 @@ type WriteLeaderboardRecordRequest struct { func (x *WriteLeaderboardRecordRequest) Reset() { *x = WriteLeaderboardRecordRequest{} - mi := &file_api_proto_msgTypes[115] + mi := &file_api_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8392,7 +8130,7 @@ func (x *WriteLeaderboardRecordRequest) String() string { func (*WriteLeaderboardRecordRequest) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[115] + mi := &file_api_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8405,7 +8143,7 @@ func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteLeaderboardRecordRequest.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{115} + return file_api_proto_rawDescGZIP(), []int{110} } func (x *WriteLeaderboardRecordRequest) GetLeaderboardId() string { @@ -8443,7 +8181,7 @@ type WriteStorageObject struct { func (x *WriteStorageObject) Reset() { *x = WriteStorageObject{} - mi := &file_api_proto_msgTypes[116] + mi := &file_api_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8455,7 +8193,7 @@ func (x *WriteStorageObject) String() string { func (*WriteStorageObject) ProtoMessage() {} func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[116] + mi := &file_api_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8468,7 +8206,7 @@ func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObject.ProtoReflect.Descriptor instead. func (*WriteStorageObject) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{116} + return file_api_proto_rawDescGZIP(), []int{111} } func (x *WriteStorageObject) GetCollection() string { @@ -8524,7 +8262,7 @@ type WriteStorageObjectsRequest struct { func (x *WriteStorageObjectsRequest) Reset() { *x = WriteStorageObjectsRequest{} - mi := &file_api_proto_msgTypes[117] + mi := &file_api_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8536,7 +8274,7 @@ func (x *WriteStorageObjectsRequest) String() string { func (*WriteStorageObjectsRequest) ProtoMessage() {} func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[117] + mi := &file_api_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8549,7 +8287,7 @@ func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObjectsRequest.ProtoReflect.Descriptor instead. func (*WriteStorageObjectsRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{117} + return file_api_proto_rawDescGZIP(), []int{112} } func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { @@ -8572,7 +8310,7 @@ type WriteTournamentRecordRequest struct { func (x *WriteTournamentRecordRequest) Reset() { *x = WriteTournamentRecordRequest{} - mi := &file_api_proto_msgTypes[118] + mi := &file_api_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8584,7 +8322,7 @@ func (x *WriteTournamentRecordRequest) String() string { func (*WriteTournamentRecordRequest) ProtoMessage() {} func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[118] + mi := &file_api_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8597,7 +8335,7 @@ func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteTournamentRecordRequest.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{118} + return file_api_proto_rawDescGZIP(), []int{113} } func (x *WriteTournamentRecordRequest) GetTournamentId() string { @@ -8627,7 +8365,7 @@ type FriendsOfFriendsList_FriendOfFriend struct { func (x *FriendsOfFriendsList_FriendOfFriend) Reset() { *x = FriendsOfFriendsList_FriendOfFriend{} - mi := &file_api_proto_msgTypes[131] + mi := &file_api_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8639,7 +8377,7 @@ func (x *FriendsOfFriendsList_FriendOfFriend) String() string { func (*FriendsOfFriendsList_FriendOfFriend) ProtoMessage() {} func (x *FriendsOfFriendsList_FriendOfFriend) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[131] + mi := &file_api_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8682,7 +8420,7 @@ type GroupUserList_GroupUser struct { func (x *GroupUserList_GroupUser) Reset() { *x = GroupUserList_GroupUser{} - mi := &file_api_proto_msgTypes[132] + mi := &file_api_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8694,7 +8432,7 @@ func (x *GroupUserList_GroupUser) String() string { func (*GroupUserList_GroupUser) ProtoMessage() {} func (x *GroupUserList_GroupUser) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[132] + mi := &file_api_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8737,7 +8475,7 @@ type UserGroupList_UserGroup struct { func (x *UserGroupList_UserGroup) Reset() { *x = UserGroupList_UserGroup{} - mi := &file_api_proto_msgTypes[133] + mi := &file_api_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8749,7 +8487,7 @@ func (x *UserGroupList_UserGroup) String() string { func (*UserGroupList_UserGroup) ProtoMessage() {} func (x *UserGroupList_UserGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[133] + mi := &file_api_proto_msgTypes[128] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8796,7 +8534,7 @@ type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Reset() { *x = WriteLeaderboardRecordRequest_LeaderboardRecordWrite{} - mi := &file_api_proto_msgTypes[134] + mi := &file_api_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8808,7 +8546,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[134] + mi := &file_api_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8821,7 +8559,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() pr // Deprecated: Use WriteLeaderboardRecordRequest_LeaderboardRecordWrite.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{115, 0} + return file_api_proto_rawDescGZIP(), []int{110, 0} } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetScore() int64 { @@ -8869,7 +8607,7 @@ type WriteTournamentRecordRequest_TournamentRecordWrite struct { func (x *WriteTournamentRecordRequest_TournamentRecordWrite) Reset() { *x = WriteTournamentRecordRequest_TournamentRecordWrite{} - mi := &file_api_proto_msgTypes[135] + mi := &file_api_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8881,7 +8619,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { func (*WriteTournamentRecordRequest_TournamentRecordWrite) ProtoMessage() {} func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[135] + mi := &file_api_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8894,7 +8632,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() prot // Deprecated: Use WriteTournamentRecordRequest_TournamentRecordWrite.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest_TournamentRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{118, 0} + return file_api_proto_rawDescGZIP(), []int{113, 0} } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetScore() int64 { @@ -9548,21 +9286,6 @@ const file_api_proto_rawDesc = "" + "\apersist\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x85\x01\n" + "&ValidatePurchaseFacebookInstantRequest\x12%\n" + "\x0esigned_request\x18\x01 \x01(\tR\rsignedRequest\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x8d\x01\n" + - "\x1bValidatePurchaseXboxRequest\x12\x1c\n" + - "\tproductId\x18\x01 \x01(\tR\tproductId\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\x12\x1a\n" + - "\bplatform\x18\x03 \x01(\tR\bplatform\"\x86\x01\n" + - "\"ValidatePurchasePlaystationRequest\x12*\n" + - "\x10entitlementLabel\x18\x01 \x01(\tR\x10entitlementLabel\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"}\n" + - "\x1bValidatePurchaseEpicRequest\x12(\n" + - "\x0fnsCatalogItemId\x18\x01 \x01(\tR\x0fnsCatalogItemId\x124\n" + - "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"T\n" + - "\x1cValidatePurchaseSteamRequest\x124\n" + - "\apersist\x18\x01 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"|\n" + - "\x1eValidatePurchaseDiscordRequest\x12$\n" + - "\rentitlementId\x18\x01 \x01(\tR\rentitlementId\x124\n" + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\xa9\x04\n" + "\x11ValidatedPurchase\x12\x17\n" + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + @@ -9681,7 +9404,7 @@ func file_api_proto_rawDescGZIP() []byte { } var file_api_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 136) +var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 131) var file_api_proto_goTypes = []any{ (StoreProvider)(0), // 0: nakama.api.StoreProvider (StoreEnvironment)(0), // 1: nakama.api.StoreEnvironment @@ -9793,234 +9516,224 @@ var file_api_proto_goTypes = []any{ (*ValidateSubscriptionGoogleRequest)(nil), // 107: nakama.api.ValidateSubscriptionGoogleRequest (*ValidatePurchaseHuaweiRequest)(nil), // 108: nakama.api.ValidatePurchaseHuaweiRequest (*ValidatePurchaseFacebookInstantRequest)(nil), // 109: nakama.api.ValidatePurchaseFacebookInstantRequest - (*ValidatePurchaseXboxRequest)(nil), // 110: nakama.api.ValidatePurchaseXboxRequest - (*ValidatePurchasePlaystationRequest)(nil), // 111: nakama.api.ValidatePurchasePlaystationRequest - (*ValidatePurchaseEpicRequest)(nil), // 112: nakama.api.ValidatePurchaseEpicRequest - (*ValidatePurchaseSteamRequest)(nil), // 113: nakama.api.ValidatePurchaseSteamRequest - (*ValidatePurchaseDiscordRequest)(nil), // 114: nakama.api.ValidatePurchaseDiscordRequest - (*ValidatedPurchase)(nil), // 115: nakama.api.ValidatedPurchase - (*ValidatePurchaseResponse)(nil), // 116: nakama.api.ValidatePurchaseResponse - (*ValidateSubscriptionResponse)(nil), // 117: nakama.api.ValidateSubscriptionResponse - (*ValidatedSubscription)(nil), // 118: nakama.api.ValidatedSubscription - (*PurchaseList)(nil), // 119: nakama.api.PurchaseList - (*SubscriptionList)(nil), // 120: nakama.api.SubscriptionList - (*WriteLeaderboardRecordRequest)(nil), // 121: nakama.api.WriteLeaderboardRecordRequest - (*WriteStorageObject)(nil), // 122: nakama.api.WriteStorageObject - (*WriteStorageObjectsRequest)(nil), // 123: nakama.api.WriteStorageObjectsRequest - (*WriteTournamentRecordRequest)(nil), // 124: nakama.api.WriteTournamentRecordRequest - nil, // 125: nakama.api.AccountRefresh.VarsEntry - nil, // 126: nakama.api.AccountApple.VarsEntry - nil, // 127: nakama.api.AccountCustom.VarsEntry - nil, // 128: nakama.api.AccountDevice.VarsEntry - nil, // 129: nakama.api.AccountEmail.VarsEntry - nil, // 130: nakama.api.AccountFacebook.VarsEntry - nil, // 131: nakama.api.AccountFacebookInstantGame.VarsEntry - nil, // 132: nakama.api.AccountGameCenter.VarsEntry - nil, // 133: nakama.api.AccountGoogle.VarsEntry - nil, // 134: nakama.api.AccountSteam.VarsEntry - nil, // 135: nakama.api.SessionRefreshRequest.VarsEntry - nil, // 136: nakama.api.Event.PropertiesEntry - (*FriendsOfFriendsList_FriendOfFriend)(nil), // 137: nakama.api.FriendsOfFriendsList.FriendOfFriend - (*GroupUserList_GroupUser)(nil), // 138: nakama.api.GroupUserList.GroupUser - (*UserGroupList_UserGroup)(nil), // 139: nakama.api.UserGroupList.UserGroup - (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 140: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 141: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - (*timestamppb.Timestamp)(nil), // 142: google.protobuf.Timestamp - (*wrapperspb.BoolValue)(nil), // 143: google.protobuf.BoolValue - (*wrapperspb.Int32Value)(nil), // 144: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 145: google.protobuf.StringValue - (*wrapperspb.UInt32Value)(nil), // 146: google.protobuf.UInt32Value - (*wrapperspb.Int64Value)(nil), // 147: google.protobuf.Int64Value + (*ValidatedPurchase)(nil), // 110: nakama.api.ValidatedPurchase + (*ValidatePurchaseResponse)(nil), // 111: nakama.api.ValidatePurchaseResponse + (*ValidateSubscriptionResponse)(nil), // 112: nakama.api.ValidateSubscriptionResponse + (*ValidatedSubscription)(nil), // 113: nakama.api.ValidatedSubscription + (*PurchaseList)(nil), // 114: nakama.api.PurchaseList + (*SubscriptionList)(nil), // 115: nakama.api.SubscriptionList + (*WriteLeaderboardRecordRequest)(nil), // 116: nakama.api.WriteLeaderboardRecordRequest + (*WriteStorageObject)(nil), // 117: nakama.api.WriteStorageObject + (*WriteStorageObjectsRequest)(nil), // 118: nakama.api.WriteStorageObjectsRequest + (*WriteTournamentRecordRequest)(nil), // 119: nakama.api.WriteTournamentRecordRequest + nil, // 120: nakama.api.AccountRefresh.VarsEntry + nil, // 121: nakama.api.AccountApple.VarsEntry + nil, // 122: nakama.api.AccountCustom.VarsEntry + nil, // 123: nakama.api.AccountDevice.VarsEntry + nil, // 124: nakama.api.AccountEmail.VarsEntry + nil, // 125: nakama.api.AccountFacebook.VarsEntry + nil, // 126: nakama.api.AccountFacebookInstantGame.VarsEntry + nil, // 127: nakama.api.AccountGameCenter.VarsEntry + nil, // 128: nakama.api.AccountGoogle.VarsEntry + nil, // 129: nakama.api.AccountSteam.VarsEntry + nil, // 130: nakama.api.SessionRefreshRequest.VarsEntry + nil, // 131: nakama.api.Event.PropertiesEntry + (*FriendsOfFriendsList_FriendOfFriend)(nil), // 132: nakama.api.FriendsOfFriendsList.FriendOfFriend + (*GroupUserList_GroupUser)(nil), // 133: nakama.api.GroupUserList.GroupUser + (*UserGroupList_UserGroup)(nil), // 134: nakama.api.UserGroupList.UserGroup + (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 135: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 136: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + (*timestamppb.Timestamp)(nil), // 137: google.protobuf.Timestamp + (*wrapperspb.BoolValue)(nil), // 138: google.protobuf.BoolValue + (*wrapperspb.Int32Value)(nil), // 139: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 140: google.protobuf.StringValue + (*wrapperspb.UInt32Value)(nil), // 141: google.protobuf.UInt32Value + (*wrapperspb.Int64Value)(nil), // 142: google.protobuf.Int64Value } var file_api_proto_depIdxs = []int32{ 100, // 0: nakama.api.Account.user:type_name -> nakama.api.User 10, // 1: nakama.api.Account.devices:type_name -> nakama.api.AccountDevice - 142, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp - 142, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp - 125, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry - 126, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry - 127, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry - 128, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry - 129, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry - 130, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry - 131, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry - 132, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry - 133, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry - 134, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry - 135, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry + 137, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp + 137, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp + 120, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry + 121, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry + 122, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry + 123, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry + 124, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry + 125, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry + 126, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry + 127, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry + 128, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry + 129, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry + 130, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry 8, // 15: nakama.api.AuthenticateAppleRequest.account:type_name -> nakama.api.AccountApple - 143, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue + 138, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue 9, // 17: nakama.api.AuthenticateCustomRequest.account:type_name -> nakama.api.AccountCustom - 143, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue + 138, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue 10, // 19: nakama.api.AuthenticateDeviceRequest.account:type_name -> nakama.api.AccountDevice - 143, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue + 138, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue 11, // 21: nakama.api.AuthenticateEmailRequest.account:type_name -> nakama.api.AccountEmail - 143, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue + 138, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue 12, // 23: nakama.api.AuthenticateFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 143, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue - 143, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 138, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue + 138, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue 13, // 26: nakama.api.AuthenticateFacebookInstantGameRequest.account:type_name -> nakama.api.AccountFacebookInstantGame - 143, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue + 138, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue 14, // 28: nakama.api.AuthenticateGameCenterRequest.account:type_name -> nakama.api.AccountGameCenter - 143, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue + 138, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue 15, // 30: nakama.api.AuthenticateGoogleRequest.account:type_name -> nakama.api.AccountGoogle - 143, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue + 138, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue 16, // 32: nakama.api.AuthenticateSteamRequest.account:type_name -> nakama.api.AccountSteam - 143, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue - 143, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue - 144, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value - 142, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp - 142, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp - 143, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue + 138, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue + 138, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue + 139, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value + 137, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp + 137, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp + 138, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue 32, // 39: nakama.api.ChannelMessageList.messages:type_name -> nakama.api.ChannelMessage 40, // 40: nakama.api.DeleteStorageObjectsRequest.object_ids:type_name -> nakama.api.DeleteStorageObjectId - 136, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry - 142, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp + 131, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry + 137, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp 100, // 43: nakama.api.Friend.user:type_name -> nakama.api.User - 144, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value - 142, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp + 139, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value + 137, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp 43, // 46: nakama.api.FriendList.friends:type_name -> nakama.api.Friend - 137, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend - 143, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue - 142, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp - 142, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp + 132, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend + 138, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue + 137, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp + 137, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp 48, // 51: nakama.api.GroupList.groups:type_name -> nakama.api.Group - 138, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser + 133, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser 12, // 53: nakama.api.ImportFacebookFriendsRequest.account:type_name -> nakama.api.AccountFacebook - 143, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 138, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue 16, // 55: nakama.api.ImportSteamFriendsRequest.account:type_name -> nakama.api.AccountSteam - 143, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 138, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue 2, // 57: nakama.api.Leaderboard.operator:type_name -> nakama.api.Operator - 142, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp + 137, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp 56, // 59: nakama.api.LeaderboardList.leaderboards:type_name -> nakama.api.Leaderboard - 145, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue - 142, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp - 142, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp - 142, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp + 140, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue + 137, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp + 137, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp + 137, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp 58, // 64: nakama.api.LeaderboardRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 65: nakama.api.LeaderboardRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord 12, // 66: nakama.api.LinkFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 143, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 138, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue 16, // 68: nakama.api.LinkSteamRequest.account:type_name -> nakama.api.AccountSteam - 143, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue - 144, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value - 143, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue - 144, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value - 144, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value - 143, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue - 144, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value - 146, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 147, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 144, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 147, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 144, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value - 143, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue - 145, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue - 144, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value - 144, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value - 145, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue - 144, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value - 146, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 147, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 144, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 147, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 146, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value - 146, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value - 146, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value - 146, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value - 144, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 144, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value - 145, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue + 138, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue + 139, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue + 139, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value + 139, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value + 138, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue + 139, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value + 141, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 142, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 139, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 142, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 139, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value + 138, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue + 140, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue + 139, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value + 139, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value + 140, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue + 139, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value + 141, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 142, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 139, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 142, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 141, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value + 141, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value + 141, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value + 141, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value + 139, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 139, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value + 140, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue 78, // 105: nakama.api.MatchList.matches:type_name -> nakama.api.Match - 142, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp - 142, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp - 142, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp + 137, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp + 137, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp + 137, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp 80, // 109: nakama.api.MatchmakerStats.completions:type_name -> nakama.api.MatchmakerCompletionStats - 142, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp + 137, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp 82, // 111: nakama.api.NotificationList.notifications:type_name -> nakama.api.Notification 86, // 112: nakama.api.ReadStorageObjectsRequest.object_ids:type_name -> nakama.api.ReadStorageObjectId - 142, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp - 142, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp - 142, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp - 142, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp + 137, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp + 137, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp + 137, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp + 137, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp 91, // 117: nakama.api.StorageObjectAcks.acks:type_name -> nakama.api.StorageObjectAck 90, // 118: nakama.api.StorageObjects.objects:type_name -> nakama.api.StorageObject 90, // 119: nakama.api.StorageObjectList.objects:type_name -> nakama.api.StorageObject - 142, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp - 142, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp - 142, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp + 137, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp + 137, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp + 137, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp 2, // 123: nakama.api.Tournament.operator:type_name -> nakama.api.Operator 95, // 124: nakama.api.TournamentList.tournaments:type_name -> nakama.api.Tournament 58, // 125: nakama.api.TournamentRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 126: nakama.api.TournamentRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord - 145, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue - 145, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue - 145, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue - 145, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue - 145, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue - 145, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue - 145, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue - 145, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue - 145, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue - 145, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue - 143, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue - 142, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp - 142, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp - 139, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup + 140, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue + 140, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue + 140, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue + 140, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue + 140, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue + 140, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue + 140, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue + 140, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue + 140, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue + 140, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue + 138, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue + 137, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp + 137, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp + 134, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup 100, // 141: nakama.api.Users.users:type_name -> nakama.api.User - 143, // 142: nakama.api.ValidatePurchaseRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 143: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 144: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 145: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 146: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 147: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 148: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 149: nakama.api.ValidatePurchaseXboxRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 150: nakama.api.ValidatePurchasePlaystationRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 151: nakama.api.ValidatePurchaseEpicRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 152: nakama.api.ValidatePurchaseSteamRequest.persist:type_name -> google.protobuf.BoolValue - 143, // 153: nakama.api.ValidatePurchaseDiscordRequest.persist:type_name -> google.protobuf.BoolValue - 0, // 154: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider - 142, // 155: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp - 142, // 156: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp - 142, // 157: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp - 142, // 158: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp - 1, // 159: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment - 115, // 160: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 118, // 161: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription - 0, // 162: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider - 142, // 163: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp - 142, // 164: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp - 142, // 165: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp - 1, // 166: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment - 142, // 167: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp - 142, // 168: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp - 115, // 169: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 118, // 170: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription - 140, // 171: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - 144, // 172: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value - 144, // 173: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value - 122, // 174: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject - 141, // 175: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - 100, // 176: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User - 100, // 177: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User - 144, // 178: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value - 48, // 179: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group - 144, // 180: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value - 2, // 181: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator - 2, // 182: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator - 183, // [183:183] is the sub-list for method output_type - 183, // [183:183] is the sub-list for method input_type - 183, // [183:183] is the sub-list for extension type_name - 183, // [183:183] is the sub-list for extension extendee - 0, // [0:183] is the sub-list for field type_name + 138, // 142: nakama.api.ValidatePurchaseRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 143: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 144: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 145: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 146: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 147: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue + 138, // 148: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue + 0, // 149: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider + 137, // 150: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp + 137, // 151: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp + 137, // 152: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp + 137, // 153: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp + 1, // 154: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment + 110, // 155: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 113, // 156: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription + 0, // 157: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider + 137, // 158: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp + 137, // 159: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp + 137, // 160: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp + 1, // 161: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment + 137, // 162: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp + 137, // 163: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp + 110, // 164: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 113, // 165: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription + 135, // 166: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + 139, // 167: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value + 139, // 168: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value + 117, // 169: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject + 136, // 170: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + 100, // 171: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User + 100, // 172: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User + 139, // 173: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value + 48, // 174: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group + 139, // 175: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value + 2, // 176: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator + 2, // 177: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator + 178, // [178:178] is the sub-list for method output_type + 178, // [178:178] is the sub-list for method input_type + 178, // [178:178] is the sub-list for extension type_name + 178, // [178:178] is the sub-list for extension extendee + 0, // [0:178] is the sub-list for field type_name } func init() { file_api_proto_init() } @@ -10034,7 +9747,7 @@ func file_api_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc)), NumEnums: 6, - NumMessages: 136, + NumMessages: 131, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index 9c4efddd3b..2be3290a96 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1243,33 +1243,6 @@ message ValidatePurchaseFacebookInstantRequest { google.protobuf.BoolValue persist = 2; } -// Xbox Purchase validation request -message ValidatePurchaseXboxRequest { - string productId = 1; - google.protobuf.BoolValue persist = 2; - string platform = 3; -} - -// Playstation validation request -message ValidatePurchasePlaystationRequest { - string entitlementLabel = 1; - google.protobuf.BoolValue persist = 2; -} - -message ValidatePurchaseEpicRequest { - string nsCatalogItemId = 1; - google.protobuf.BoolValue persist = 2; -} - -message ValidatePurchaseSteamRequest { - google.protobuf.BoolValue persist = 1; -} - -message ValidatePurchaseDiscordRequest { - string entitlementId = 1; - google.protobuf.BoolValue persist = 2; -} - // Validated Purchase stored by Nakama. message ValidatedPurchase { // Purchase User ID. diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go index ebdc0b00e2..4c8a12c897 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go @@ -94,6 +94,10 @@ type IAPConfig interface { GetHuawei() IAPHuaweiConfig GetFacebookInstant() IAPFacebookInstantConfig GetXbox() IAPXboxConfig + GetPlaystation() IAPPlaystationConfig + GetSteam() IAPSteamConfig + GetEpic() IAPEpicConfig + GetDiscord() IAPDiscordConfig } type IAPAppleConfig interface { @@ -128,22 +132,30 @@ type IAPFacebookInstantConfig interface { type IAPXboxConfig interface { GetToken() string + GetRefundCheckPeriodMin() int } type IAPPlaystationConfig interface { GetToken() string + GetEnvironment() string + GetPartnerName() string + GetStreamName() string } type IAPEpicConfig interface { GetToken() string + GetAccountId() string } type IAPSteamConfig interface { GetAppId() string + GetToken() string + GetPublisherKey() string } type IAPDiscordConfig interface { GetToken() string + GetAppId() string } type GoogleAuthConfig interface { diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 8dd6ea89ea..7e86d05e22 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -90,14 +90,12 @@ import ( "database/sql" "errors" "fmt" - "github.com/gofrs/uuid/v5" "net/http" "os" "time" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama-common/rtapi" - "go.uber.org/zap" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -331,6 +329,12 @@ type Initializer interface { */ GetConfig() (Config, error) + /* + RegisterRpc registers a function with the given ID. This ID can be used within client code to send an RPC message to + execute the function and return the result. Results are always returned as a JSON string (or optionally empty string). + + If there is an issue with the RPC call, return an empty string and the associated error which will be returned to the client. + */ RegisterRpc(id string, fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, payload string) (string, error)) error /* @@ -381,7 +385,7 @@ type Initializer interface { // RegisterSubscriptionNotificationGoogle RegisterSubscriptionNotificationGoogle(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, subscription *api.ValidatedSubscription, providerPayload string) error) error - // RegisterPurchaseNotification + // RegisterRefundHandler RegisterRefundHandler(platform string, purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) error // RegisterBeforeGetAccount is used to register a function invoked when the server receives the relevant request. @@ -800,24 +804,6 @@ type Initializer interface { // RegisterAfterValidatePurchaseFacebookInstant can be used to perform additional logic after validating an Facebook Instant IAP receipt. RegisterAfterValidatePurchaseFacebookInstant(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error) error - //// RegisterBeforeValidatePurchaseEpic can be used to perform additonal logic before validating a Epic Store receipt - //RegisterBeforeValidatePurchaseEpic(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseEpicRequest) (*api.ValidatePurchaseEpicRequest, error)) error - // - //// RegisterAfterValidatePurchaseEpic can be used to perform additional logic after validating a Epic Store receipt - //RegisterAfterValidatePurchaseEpic(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseEpicRequest) error) error - // - //// RegisterBeforeValidatePurchaseSteam can be used to perform additonal logic before validating a Steam Store receipt - //RegisterBeforeValidatePurchaseSteam(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseSteamRequest) (*api.ValidatePurchaseSteamRequest, error)) error - // - //// RegisterAfterValidatePurchaseSteam can be used to perform additional logic after validating a Steam Store receipt - //RegisterAfterValidatePurchaseSteam(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseSteamRequest) error) error - // - //// RegisterBeforeValidatePurchaseDiscord can be used to perform additonal logic before validating a Discord Store receipt - //RegisterBeforeValidatePurchaseDiscord(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseDiscordRequest) (*api.ValidatePurchaseDiscordRequest, error)) error - // - //// RegisterAfterValidatePurchaseDiscord can be used to perform additional logic after validating a Discord Store receipt - //RegisterAfterValidatePurchaseDiscord(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseDiscordRequest) error) error - // RegisterBeforeListSubscriptions can be used to perform additional logic before listing subscriptions. RegisterBeforeListSubscriptions(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ListSubscriptionsRequest) (*api.ListSubscriptionsRequest, error)) error @@ -1366,10 +1352,9 @@ type FleetManagerInitializer interface { type PurchaseProvider interface { Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) - // token and environment is config - PurchaseValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, receipt string, userID uuid.UUID, persist bool, config IAPConfig) (*api.ValidatePurchaseResponse, error) - SubscriptionValidate(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) - HandleRefund(ctx context.Context, logger *zap.Logger, db *sql.DB) (http.HandlerFunc, error) + PurchaseValidate(ctx context.Context, receipt, userID string, persist bool) (*api.ValidatePurchaseResponse, error) + SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) + HandleRefund(ctx context.Context) (http.HandlerFunc, error) } /* From 0aa3412681eb20ae0ce689e1b24c62e686bc2fec Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 22 Jul 2025 19:58:37 +0100 Subject: [PATCH 14/28] validate request func implemented for apple adapter and called in generic validate purchase func --- iap/apple.go | 8 ++++++ server/api_purchase.go | 27 +++++-------------- .../nakama-common/runtime/runtime.go | 1 + 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/iap/apple.go b/iap/apple.go index b2296bc015..0bde242df3 100644 --- a/iap/apple.go +++ b/iap/apple.go @@ -580,6 +580,14 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerF }, nil } +func (a *ApplePurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { + if a.config.GetApple().GetSharedPassword() == "" { + return status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") + } + + return nil +} + func NewApplePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { purchaseProvider := &ApplePurchaseProvider{ nk: nk, diff --git a/server/api_purchase.go b/server/api_purchase.go index 84762fdf29..490cdd482e 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -26,14 +26,18 @@ import ( func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) - platform := iap.FromString(in.Platform) purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) if err != nil { s.logger.Warn("Purchase provider not found", zap.Error(err)) return nil, status.Error(codes.Internal, "failed to get purchase provider") } - err = validatePurchaseRequest(ctx, in, platform, s.config.GetIAP()) + purchaseProvider.ValidateRequest(in) + + if iap.FromString(in.Platform) != iap.Steam && len(in.Receipt) < 1 { + return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") + } + if err != nil { s.logger.Warn("Purchase request validation failed", zap.Error(err)) return nil, status.Error(codes.Internal, err.Error()) @@ -87,25 +91,6 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha return validation, err } -func validatePurchaseRequest(ctx context.Context, in *api.ValidatePurchaseRequest, platform iap.Platform, config *IAPConfig) error { - switch platform { - case iap.Apple: - if config.Apple.SharedPassword == "" { - return status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") - } - case iap.Xbox: - if config.Xbox.Token == "" { - return status.Error(codes.FailedPrecondition, "Xbox IAP is not configured.") - } - } - - if iap.FromString(in.Platform) != iap.Steam && len(in.Receipt) < 1 { - return status.Error(codes.InvalidArgument, "Receipt cannot be empty.") - } - - return nil -} - func (s *ApiServer) ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 7e86d05e22..1bf1d4a1e8 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -1355,6 +1355,7 @@ type PurchaseProvider interface { PurchaseValidate(ctx context.Context, receipt, userID string, persist bool) (*api.ValidatePurchaseResponse, error) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) HandleRefund(ctx context.Context) (http.HandlerFunc, error) + ValidateRequest(in *api.ValidatePurchaseRequest) error } /* From 7dcf4bf52c8beac080bae05ce73301f09ee34754 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Wed, 23 Jul 2025 19:03:32 +0100 Subject: [PATCH 15/28] move the console iap config out into console adapter repo --- server/config.go | 36 +--- server/runtime_config.go | 5 + .../nakama-common/runtime/config.go | 34 +--- vendor/golang.org/x/text/language/coverage.go | 187 ------------------ 4 files changed, 13 insertions(+), 249 deletions(-) delete mode 100644 vendor/golang.org/x/text/language/coverage.go diff --git a/server/config.go b/server/config.go index 9b704d916c..e3ee4b08ca 100644 --- a/server/config.go +++ b/server/config.go @@ -34,6 +34,7 @@ import ( // Config interface is the Nakama core configuration. type Config interface { GetName() string + GetConfigFilePath() []string GetDataDir() string GetShutdownGraceSec() int GetLogger() *LoggerConfig @@ -521,6 +522,7 @@ func (c *config) Clone() (Config, error) { nc := &config{ Name: c.Name, + Config: c.Config, Datadir: c.Datadir, ShutdownGraceSec: c.ShutdownGraceSec, Logger: c.Logger.Clone(), @@ -550,6 +552,10 @@ func (c *config) GetName() string { return c.Name } +func (c *config) GetConfigFilePath() []string { + return c.Config +} + func (c *config) GetDataDir() string { return c.Datadir } @@ -643,6 +649,7 @@ func (c *config) GetRuntimeConfig() (runtime.Config, error) { cn := &RuntimeConfigClone{ Name: clone.GetName(), + FilePaths: clone.GetConfigFilePath(), ShutdownGrace: clone.GetShutdownGraceSec(), Logger: lc, Session: sc, @@ -1338,11 +1345,6 @@ type IAPConfig struct { Google *IAPGoogleConfig `yaml:"google" json:"google" usage:"Google Play Store purchase validation configuration."` Huawei *IAPHuaweiConfig `yaml:"huawei" json:"huawei" usage:"Huawei purchase validation configuration."` FacebookInstant *IAPFacebookInstantConfig `yaml:"facebook_instant" json:"facebook_instant" usage:"Facebook Instant purchase validation configuration."` - Xbox *IAPXboxConfig `yaml:"xbox" json:"xbox" usage:"Xbox Configuration."` - Playstation *IAPPlaystationConfig `yaml:"playstation" json:"playstation" usage:"Playstation Configuration."` - //Epic *IAPEpicConfig `yaml:"epic" json:"epic" usage:"Epic Configuration."` - //Steam *IAPSteamConfig `yaml:"steam" json:"steam" usage:"Steam Configuration."` - //Discord *IAPDiscord `yaml:"discord" json:"discord" usage:"Discord Configuration."` } func (cfg *IAPConfig) GetApple() runtime.IAPAppleConfig { @@ -1361,16 +1363,6 @@ func (cfg *IAPConfig) GetFacebookInstant() runtime.IAPFacebookInstantConfig { return cfg.FacebookInstant } -func (cfg *IAPConfig) GetXbox() runtime.IAPXboxConfig { return cfg.Xbox } - -func (cfg *IAPConfig) GetPlaystation() runtime.IAPPlaystationConfig { return cfg.Playstation } - -//func (cfg *IAPConfig) GetEpic() runtime.IAPEpicConfig { return cfg.Epic } -// -//func (cfg *IAPConfig) GetSteam() runtime.IAPSteamConfig { return cfg.Steam } -// -//func (cfg *IAPConfig) GetDiscord() runtime.IAPDiscordConfig { return cfg.Discord } - func (cfg *IAPConfig) Clone() *IAPConfig { if cfg == nil { return nil @@ -1549,20 +1541,6 @@ func (i IAPFacebookInstantConfig) GetAppSecret() string { return i.AppSecret } -type IAPXboxConfig struct { - Token string `yaml:"token" json:"token" usage:"Xbox credentials token"` - RefundCheckPeriodMin int `yaml:"refund_check_period_min" json:"refund_check_period_min" usage:"Defines the polling interval in minutes of the azure queue that the microsoft clawback service uses."` -} - -func (i IAPXboxConfig) GetToken() string { return i.Token } - -type IAPPlaystationConfig struct { - Token string `yaml:"token" json:"token" usage:"Playstation credentials token"` - Environment string `yaml:"environment" json:"environment" usage:"IAP Playstation environment"` -} - -func (i IAPPlaystationConfig) GetToken() string { return i.Token } - var _ runtime.GoogleAuthConfig = &GoogleAuthConfig{} type GoogleAuthConfig struct { diff --git a/server/runtime_config.go b/server/runtime_config.go index f837a5c2b8..124d3f7c2f 100644 --- a/server/runtime_config.go +++ b/server/runtime_config.go @@ -18,6 +18,7 @@ import "github.com/heroiclabs/nakama-common/runtime" type RuntimeConfigClone struct { Name string + FilePaths []string ShutdownGrace int Logger runtime.LoggerConfig Session runtime.SessionConfig @@ -33,6 +34,10 @@ func (c *RuntimeConfigClone) GetName() string { return c.Name } +func (c *RuntimeConfigClone) GetConfigFilePath() []string { + return c.FilePaths +} + func (c *RuntimeConfigClone) GetShutdownGraceSec() int { return c.ShutdownGrace } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go index 4c8a12c897..792892f72f 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go @@ -17,6 +17,7 @@ package runtime // Config interface is the Nakama core configuration. type Config interface { GetName() string + GetConfigFilePath() []string GetShutdownGraceSec() int GetLogger() LoggerConfig GetSession() SessionConfig @@ -93,11 +94,6 @@ type IAPConfig interface { GetGoogle() IAPGoogleConfig GetHuawei() IAPHuaweiConfig GetFacebookInstant() IAPFacebookInstantConfig - GetXbox() IAPXboxConfig - GetPlaystation() IAPPlaystationConfig - GetSteam() IAPSteamConfig - GetEpic() IAPEpicConfig - GetDiscord() IAPDiscordConfig } type IAPAppleConfig interface { @@ -130,34 +126,6 @@ type IAPFacebookInstantConfig interface { GetAppSecret() string } -type IAPXboxConfig interface { - GetToken() string - GetRefundCheckPeriodMin() int -} - -type IAPPlaystationConfig interface { - GetToken() string - GetEnvironment() string - GetPartnerName() string - GetStreamName() string -} - -type IAPEpicConfig interface { - GetToken() string - GetAccountId() string -} - -type IAPSteamConfig interface { - GetAppId() string - GetToken() string - GetPublisherKey() string -} - -type IAPDiscordConfig interface { - GetToken() string - GetAppId() string -} - type GoogleAuthConfig interface { GetCredentialsJSON() string } diff --git a/vendor/golang.org/x/text/language/coverage.go b/vendor/golang.org/x/text/language/coverage.go deleted file mode 100644 index a24fd1a4d6..0000000000 --- a/vendor/golang.org/x/text/language/coverage.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package language - -import ( - "fmt" - "sort" - - "golang.org/x/text/internal/language" -) - -// The Coverage interface is used to define the level of coverage of an -// internationalization service. Note that not all types are supported by all -// services. As lists may be generated on the fly, it is recommended that users -// of a Coverage cache the results. -type Coverage interface { - // Tags returns the list of supported tags. - Tags() []Tag - - // BaseLanguages returns the list of supported base languages. - BaseLanguages() []Base - - // Scripts returns the list of supported scripts. - Scripts() []Script - - // Regions returns the list of supported regions. - Regions() []Region -} - -var ( - // Supported defines a Coverage that lists all supported subtags. Tags - // always returns nil. - Supported Coverage = allSubtags{} -) - -// TODO: -// - Support Variants, numbering systems. -// - CLDR coverage levels. -// - Set of common tags defined in this package. - -type allSubtags struct{} - -// Regions returns the list of supported regions. As all regions are in a -// consecutive range, it simply returns a slice of numbers in increasing order. -// The "undefined" region is not returned. -func (s allSubtags) Regions() []Region { - reg := make([]Region, language.NumRegions) - for i := range reg { - reg[i] = Region{language.Region(i + 1)} - } - return reg -} - -// Scripts returns the list of supported scripts. As all scripts are in a -// consecutive range, it simply returns a slice of numbers in increasing order. -// The "undefined" script is not returned. -func (s allSubtags) Scripts() []Script { - scr := make([]Script, language.NumScripts) - for i := range scr { - scr[i] = Script{language.Script(i + 1)} - } - return scr -} - -// BaseLanguages returns the list of all supported base languages. It generates -// the list by traversing the internal structures. -func (s allSubtags) BaseLanguages() []Base { - bs := language.BaseLanguages() - base := make([]Base, len(bs)) - for i, b := range bs { - base[i] = Base{b} - } - return base -} - -// Tags always returns nil. -func (s allSubtags) Tags() []Tag { - return nil -} - -// coverage is used by NewCoverage which is used as a convenient way for -// creating Coverage implementations for partially defined data. Very often a -// package will only need to define a subset of slices. coverage provides a -// convenient way to do this. Moreover, packages using NewCoverage, instead of -// their own implementation, will not break if later new slice types are added. -type coverage struct { - tags func() []Tag - bases func() []Base - scripts func() []Script - regions func() []Region -} - -func (s *coverage) Tags() []Tag { - if s.tags == nil { - return nil - } - return s.tags() -} - -// bases implements sort.Interface and is used to sort base languages. -type bases []Base - -func (b bases) Len() int { - return len(b) -} - -func (b bases) Swap(i, j int) { - b[i], b[j] = b[j], b[i] -} - -func (b bases) Less(i, j int) bool { - return b[i].langID < b[j].langID -} - -// BaseLanguages returns the result from calling s.bases if it is specified or -// otherwise derives the set of supported base languages from tags. -func (s *coverage) BaseLanguages() []Base { - if s.bases == nil { - tags := s.Tags() - if len(tags) == 0 { - return nil - } - a := make([]Base, len(tags)) - for i, t := range tags { - a[i] = Base{language.Language(t.lang())} - } - sort.Sort(bases(a)) - k := 0 - for i := 1; i < len(a); i++ { - if a[k] != a[i] { - k++ - a[k] = a[i] - } - } - return a[:k+1] - } - return s.bases() -} - -func (s *coverage) Scripts() []Script { - if s.scripts == nil { - return nil - } - return s.scripts() -} - -func (s *coverage) Regions() []Region { - if s.regions == nil { - return nil - } - return s.regions() -} - -// NewCoverage returns a Coverage for the given lists. It is typically used by -// packages providing internationalization services to define their level of -// coverage. A list may be of type []T or func() []T, where T is either Tag, -// Base, Script or Region. The returned Coverage derives the value for Bases -// from Tags if no func or slice for []Base is specified. For other unspecified -// types the returned Coverage will return nil for the respective methods. -func NewCoverage(list ...interface{}) Coverage { - s := &coverage{} - for _, x := range list { - switch v := x.(type) { - case func() []Base: - s.bases = v - case func() []Script: - s.scripts = v - case func() []Region: - s.regions = v - case func() []Tag: - s.tags = v - case []Base: - s.bases = func() []Base { return v } - case []Script: - s.scripts = func() []Script { return v } - case []Region: - s.regions = func() []Region { return v } - case []Tag: - s.tags = func() []Tag { return v } - default: - panic(fmt.Sprintf("language: unsupported set type %T", v)) - } - } - return s -} From 21062a8b7bac0a9834f45ea02064ba87a8cb4d0e Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Thu, 24 Jul 2025 15:23:15 +0100 Subject: [PATCH 16/28] added the rest of the built ins and now handling error returned from purchase provider validate request func --- iap/apple.go | 4 +- iap/facebook.go | 135 ++++++++++++++++ iap/google.go | 152 ++++++++++++++++++ iap/huawei.go | 142 ++++++++++++++++ server/api_purchase.go | 7 +- .../heroiclabs/nakama-common/api/api.pb.go | 37 ++++- .../heroiclabs/nakama-common/api/api.proto | 7 +- .../nakama-common/runtime/runtime.go | 2 +- 8 files changed, 474 insertions(+), 12 deletions(-) create mode 100644 iap/facebook.go create mode 100644 iap/google.go create mode 100644 iap/huawei.go diff --git a/iap/apple.go b/iap/apple.go index 0bde242df3..955875a8d7 100644 --- a/iap/apple.go +++ b/iap/apple.go @@ -39,13 +39,13 @@ func (a *ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, a.subscriptionFn = subscriptionRefundFn } -func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, receipt, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { +func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { uuidUserID, err := uuid.FromString(userID) if err != nil { a.logger.Error("Error parsing user ID, error: %v", err) } - validation, raw, err := ValidateReceiptApple(ctx, Httpc, receipt, a.config.GetApple().GetSharedPassword()) + validation, raw, err := ValidateReceiptApple(ctx, Httpc, in.Receipt, a.config.GetApple().GetSharedPassword()) if err != nil { if err != context.Canceled { var vErr *ValidationError diff --git a/iap/facebook.go b/iap/facebook.go new file mode 100644 index 0000000000..30a7f4f5ab --- /dev/null +++ b/iap/facebook.go @@ -0,0 +1,135 @@ +package iap + +import ( + "context" + "database/sql" + "github.com/gofrs/uuid/v5" + "github.com/heroiclabs/nakama-common/api" + "github.com/heroiclabs/nakama-common/runtime" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" + "net/http" + "time" +) + +type FacebookPurchaseProvider struct { + nk runtime.NakamaModule + logger runtime.Logger + purchaseFn runtime.PurchaseRefundFn + subscriptionFn runtime.SubscriptionRefundFn + config runtime.IAPConfig + db *sql.DB + zapLogger *zap.Logger +} + +func (f *FacebookPurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) { + f.purchaseFn = purchaseRefundFn + f.subscriptionFn = subscriptionRefundFn +} + +func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { + uuidUserID, err := uuid.FromString(userID) + if err != nil { + f.logger.Error("Error parsing user ID, error: %v", err) + } + + payment, rawResponse, err := ValidateReceiptFacebookInstant(f.config.GetFacebookInstant().GetAppSecret(), in.SignedRequest) + if err != nil { + if err != context.Canceled { + f.logger.Error("Error validating Facebook Instant receipt", zap.Error(err)) + } + return nil, err + } + + sPurchase := &StoragePurchase{ + UserID: uuidUserID, + Store: api.StoreProvider_FACEBOOK_INSTANT_STORE, + ProductId: payment.ProductId, + TransactionId: payment.PurchaseToken, + RawResponse: rawResponse, + PurchaseTime: time.Unix(int64(payment.PurchaseTime), 0), + Environment: api.StoreEnvironment_PRODUCTION, + } + + if !persist { + validatedPurchases := []*api.ValidatedPurchase{ + { + UserId: userID, + ProductId: sPurchase.ProductId, + TransactionId: sPurchase.TransactionId, + Store: sPurchase.Store, + PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), + ProviderResponse: rawResponse, + Environment: sPurchase.Environment, + }, + } + + return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil + } + + purchases, err := UpsertPurchases(ctx, f.db, []*StoragePurchase{sPurchase}) + if err != nil { + if err != context.Canceled { + f.logger.Error("Error storing Facebook Instant receipt, error: %v", err) + } + return nil, err + } + + validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) + for _, p := range purchases { + suid := p.UserID.String() + if p.UserID.IsNil() { + suid = "" + } + validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ + UserId: suid, + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), + ProviderResponse: rawResponse, + SeenBefore: p.SeenBefore, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseResponse{ + ValidatedPurchases: validatedPurchases, + }, nil +} + +func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { + return nil, nil +} + +func (f *FacebookPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { + return nil, nil +} + +func (f *FacebookPurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { + if f.config.GetFacebookInstant().GetAppSecret() == "" { + return status.Error(codes.FailedPrecondition, "Facebook Instant IAP is not configured.") + } + + if len(in.SignedRequest) < 1 { + return status.Error(codes.InvalidArgument, "SignedRequest cannot be empty.") + } + + return nil +} + +func NewFacebookPurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { + purchaseProvider := &FacebookPurchaseProvider{ + nk: nk, + logger: logger, + db: db, + config: config, + zapLogger: zapLogger, + } + + return purchaseProvider +} diff --git a/iap/google.go b/iap/google.go new file mode 100644 index 0000000000..c4560fc5be --- /dev/null +++ b/iap/google.go @@ -0,0 +1,152 @@ +package iap + +import ( + "context" + "database/sql" + "errors" + "fmt" + "github.com/gofrs/uuid/v5" + "github.com/heroiclabs/nakama-common/api" + "github.com/heroiclabs/nakama-common/runtime" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" + "net/http" +) + +type GooglePurchaseProvider struct { + nk runtime.NakamaModule + logger runtime.Logger + purchaseFn runtime.PurchaseRefundFn + subscriptionFn runtime.SubscriptionRefundFn + config runtime.IAPConfig + db *sql.DB + zapLogger *zap.Logger +} + +func (g *GooglePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) { + g.purchaseFn = purchaseRefundFn + g.subscriptionFn = subscriptionRefundFn +} + +func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { + uuidUserID, err := uuid.FromString(userID) + if err != nil { + g.logger.Error("Error parsing user ID, error: %v", err) + } + + gResponse, gReceipt, raw, err := ValidateReceiptGoogle(ctx, Httpc, g.config.GetGoogle().GetClientEmail(), g.config.GetGoogle().GetPrivateKey(), in.Receipt) + if err != nil { + if err != context.Canceled { + var vErr *ValidationError + if errors.As(err, &vErr) { + g.logger.Debug("Error validating Google receipt, error: %v, status_code: %v, payload: %v", vErr.Err, vErr.StatusCode, vErr.Payload) + return nil, vErr + } else { + g.logger.Error("Error validating Google receipt, error: %v", err) + } + } + return nil, err + } + + purchaseEnv := api.StoreEnvironment_PRODUCTION + if gResponse.PurchaseType == 0 { + purchaseEnv = api.StoreEnvironment_SANDBOX + } + + if gReceipt.PurchaseState != 0 { + // Do not accept cancelled or pending receipts. + return nil, status.Error(codes.FailedPrecondition, fmt.Sprintf("Invalid Receipt. State: %d", gReceipt.PurchaseState)) + } + + sPurchase := &StoragePurchase{ + UserID: uuidUserID, + Store: api.StoreProvider_GOOGLE_PLAY_STORE, + ProductId: gReceipt.ProductID, + TransactionId: gReceipt.PurchaseToken, + RawResponse: string(raw), + PurchaseTime: ParseMillisecondUnixTimestamp(gReceipt.PurchaseTime), + Environment: purchaseEnv, + } + + if !persist { + validatedPurchases := []*api.ValidatedPurchase{ + { + UserId: userID, + ProductId: sPurchase.ProductId, + TransactionId: sPurchase.TransactionId, + Store: sPurchase.Store, + PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), + ProviderResponse: string(raw), + Environment: sPurchase.Environment, + }, + } + + return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil + } + + purchases, err := UpsertPurchases(ctx, g.db, []*StoragePurchase{sPurchase}) + if err != nil { + if err != context.Canceled { + g.logger.Error("Error storing Google receipt", err) + } + return nil, err + } + + validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) + for _, p := range purchases { + suid := p.UserID.String() + if p.UserID.IsNil() { + suid = "" + } + validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ + UserId: suid, + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), + ProviderResponse: string(raw), + SeenBefore: p.SeenBefore, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseResponse{ + ValidatedPurchases: validatedPurchases, + }, nil +} + +func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { + return nil, nil +} + +func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { + return nil, nil +} + +func (g *GooglePurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { + if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { + return status.Error(codes.FailedPrecondition, "Google IAP is not configured.") + } + + if len(in.Purchase) < 1 { + return status.Error(codes.InvalidArgument, "Purchase cannot be empty.") + } + + return nil +} + +func NewGooglePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { + purchaseProvider := &GooglePurchaseProvider{ + nk: nk, + logger: logger, + db: db, + config: config, + zapLogger: zapLogger, + } + + return purchaseProvider +} diff --git a/iap/huawei.go b/iap/huawei.go new file mode 100644 index 0000000000..a490845a0b --- /dev/null +++ b/iap/huawei.go @@ -0,0 +1,142 @@ +package iap + +import ( + "context" + "database/sql" + "errors" + "fmt" + "github.com/gofrs/uuid/v5" + "github.com/heroiclabs/nakama-common/api" + "github.com/heroiclabs/nakama-common/runtime" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" + "net/http" + "strconv" +) + +type HuaweiPurchaseProvider struct { + nk runtime.NakamaModule + logger runtime.Logger + purchaseFn runtime.PurchaseRefundFn + subscriptionFn runtime.SubscriptionRefundFn + config runtime.IAPConfig + db *sql.DB + zapLogger *zap.Logger +} + +func (h *HuaweiPurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) { + h.purchaseFn = purchaseRefundFn + h.subscriptionFn = subscriptionRefundFn +} + +func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { + uuidUserID, err := uuid.FromString(userID) + if err != nil { + h.logger.Error("Error parsing user ID, error: %v", err) + } + + validation, data, raw, err := ValidateReceiptHuawei(ctx, Httpc, h.config.GetHuawei().GetPublicKey(), h.config.GetHuawei().GetClientID(), h.config.GetHuawei().GetClientSecret(), in.Purchase, in.Signature) + if err != nil { + if err != context.Canceled { + var vErr *ValidationError + if errors.As(err, &vErr) { + h.logger.Debug("Error validating Huawei receipt, error: %v, status_code: %v, payload: %v", vErr.Err, vErr.StatusCode, vErr.Payload) + return nil, vErr + } else { + h.logger.Error("Error validating Huawei receipt, error: %v", err) + } + } + return nil, err + } + + if validation.ResponseCode != strconv.Itoa(HuaweiReceiptIsValid) { + return nil, status.Error(codes.FailedPrecondition, fmt.Sprintf("Invalid Receipt. Code: %s", validation.ResponseCode)) + } + + env := api.StoreEnvironment_PRODUCTION + if data.PurchaseType == HuaweiSandboxPurchaseType { + env = api.StoreEnvironment_SANDBOX + } + + sPurchase := &StoragePurchase{ + UserID: uuidUserID, + Store: api.StoreProvider_HUAWEI_APP_GALLERY, + ProductId: validation.PurchaseTokenData.ProductId, + TransactionId: validation.PurchaseTokenData.PurchaseToken, + RawResponse: string(raw), + PurchaseTime: ParseMillisecondUnixTimestamp(data.PurchaseTime), + Environment: env, + } + + if !persist { + validatedPurchases := []*api.ValidatedPurchase{ + { + ProductId: sPurchase.ProductId, + TransactionId: sPurchase.TransactionId, + Store: sPurchase.Store, + PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), + ProviderResponse: string(raw), + Environment: sPurchase.Environment, + }, + } + return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil + } + + purchases, err := UpsertPurchases(ctx, h.db, []*StoragePurchase{sPurchase}) + if err != nil { + if err != context.Canceled { + h.logger.Error("Error storing Huawei receipt, error: %v", err) + } + return nil, err + } + + validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) + for _, p := range purchases { + suid := p.UserID.String() + if p.UserID.IsNil() { + suid = "" + } + validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ + UserId: suid, + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), + ProviderResponse: string(raw), + SeenBefore: p.SeenBefore, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseResponse{ + ValidatedPurchases: validatedPurchases, + }, nil +} + +func (h *HuaweiPurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { + return nil, nil +} + +func (h *HuaweiPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { + return nil, nil +} + +func (h *HuaweiPurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { + return nil +} + +func NewHuaweiPurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { + purchaseProvider := &HuaweiPurchaseProvider{ + nk: nk, + logger: logger, + db: db, + config: config, + zapLogger: zapLogger, + } + + return purchaseProvider +} diff --git a/server/api_purchase.go b/server/api_purchase.go index 490cdd482e..a534a7af62 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -32,7 +32,10 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha return nil, status.Error(codes.Internal, "failed to get purchase provider") } - purchaseProvider.ValidateRequest(in) + err = purchaseProvider.ValidateRequest(in) + if err != nil { + return nil, err + } if iap.FromString(in.Platform) != iap.Steam && len(in.Receipt) < 1 { return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") @@ -74,7 +77,7 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha persist = in.Persist.GetValue() } - validation, err := purchaseProvider.PurchaseValidate(ctx, in.Receipt, userID.String(), persist) + validation, err := purchaseProvider.PurchaseValidate(ctx, in, userID.String(), persist) if err != nil { return nil, err } diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index e2a9f4035b..82e3694d15 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -7201,8 +7201,11 @@ func (x *Users) GetUsers() []*User { type ValidatePurchaseRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` - Platform string `protobuf:"bytes,2,opt,name=platform,proto3" json:"platform,omitempty"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` + Purchase string `protobuf:"bytes,2,opt,name=purchase,proto3" json:"purchase,omitempty"` + SignedRequest string `protobuf:"bytes,3,opt,name=signed_request,json=signedRequest,proto3" json:"signed_request,omitempty"` + Signature string `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` + Platform string `protobuf:"bytes,5,opt,name=platform,proto3" json:"platform,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=persist,proto3" json:"persist,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -7244,6 +7247,27 @@ func (x *ValidatePurchaseRequest) GetReceipt() string { return "" } +func (x *ValidatePurchaseRequest) GetPurchase() string { + if x != nil { + return x.Purchase + } + return "" +} + +func (x *ValidatePurchaseRequest) GetSignedRequest() string { + if x != nil { + return x.SignedRequest + } + return "" +} + +func (x *ValidatePurchaseRequest) GetSignature() string { + if x != nil { + return x.Signature + } + return "" +} + func (x *ValidatePurchaseRequest) GetPlatform() string { if x != nil { return x.Platform @@ -9263,11 +9287,14 @@ const file_api_proto_rawDesc = "" + "\x06MEMBER\x10\x02\x12\x10\n" + "\fJOIN_REQUEST\x10\x03\"/\n" + "\x05Users\x12&\n" + - "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\"\x85\x01\n" + + "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\"\xe6\x01\n" + "\x17ValidatePurchaseRequest\x12\x18\n" + "\areceipt\x18\x01 \x01(\tR\areceipt\x12\x1a\n" + - "\bplatform\x18\x02 \x01(\tR\bplatform\x124\n" + - "\apersist\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"n\n" + + "\bpurchase\x18\x02 \x01(\tR\bpurchase\x12%\n" + + "\x0esigned_request\x18\x03 \x01(\tR\rsignedRequest\x12\x1c\n" + + "\tsignature\x18\x04 \x01(\tR\tsignature\x12\x1a\n" + + "\bplatform\x18\x05 \x01(\tR\bplatform\x124\n" + + "\apersist\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"n\n" + "\x1cValidatePurchaseAppleRequest\x12\x18\n" + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"r\n" + diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index 2be3290a96..6f41480fd6 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1189,8 +1189,11 @@ message Users { message ValidatePurchaseRequest { string receipt = 1; - string platform = 2; - google.protobuf.BoolValue persist = 3; + string purchase = 2; + string signed_request = 3; + string signature = 4; + string platform = 5; + google.protobuf.BoolValue persist = 6; } // Apple IAP Purchases validation request diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 1bf1d4a1e8..ba10e1a665 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -1352,7 +1352,7 @@ type FleetManagerInitializer interface { type PurchaseProvider interface { Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) - PurchaseValidate(ctx context.Context, receipt, userID string, persist bool) (*api.ValidatePurchaseResponse, error) + PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) HandleRefund(ctx context.Context) (http.HandlerFunc, error) ValidateRequest(in *api.ValidatePurchaseRequest) error From 337daaf29b449231825f381cad19c52bde1ccf9a Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Thu, 24 Jul 2025 15:50:10 +0100 Subject: [PATCH 17/28] huawei validate purchase request func implemented --- iap/huawei.go | 14 ++++++++++++++ server/runtime_go.go | 34 +++++++++++++++++----------------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/iap/huawei.go b/iap/huawei.go index a490845a0b..76400ffbcd 100644 --- a/iap/huawei.go +++ b/iap/huawei.go @@ -126,6 +126,20 @@ func (h *HuaweiPurchaseProvider) HandleRefund(ctx context.Context) (http.Handler } func (h *HuaweiPurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { + if h.config.GetHuawei().GetPublicKey() == "" || + h.config.GetHuawei().GetClientID() == "" || + h.config.GetHuawei().GetClientSecret() == "" { + return status.Error(codes.FailedPrecondition, "Huawei IAP is not configured.") + } + + if len(in.Purchase) < 1 { + return status.Error(codes.InvalidArgument, "Purchase cannot be empty.") + } + + if len(in.Signature) < 1 { + return status.Error(codes.InvalidArgument, "Signature cannot be empty.") + } + return nil } diff --git a/server/runtime_go.go b/server/runtime_go.go index 3968de21c3..3f98e5156d 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -3065,23 +3065,23 @@ func RegisterBuiltInIAPPurchaseProviders(nk runtime.NakamaModule, logger runtime initializer.RegisterPurchaseProvider("apple", provider) } - //// Google - //provider = iap.NewGooglePurchaseProvider(nk, logger) - //if provider != nil { - // initializer.RegisterPurchaseProvider("google", provider) - //} - // - //// Facebook - //provider = iap.NewFacebookPurchaseProvider(nk, logger) - //if provider != nil { - // initializer.RegisterPurchaseProvider("facebook", provider) - //} - // - //// Huawei - //provider = iap.NewHuaweiPurchaseProvider(nk, logger) - //if provider != nil { - // initializer.RegisterPurchaseProvider("huawei", provider) - //} + // Google + provider = iap.NewGooglePurchaseProvider(nk, logger, db, config, zapLogger) + if provider != nil { + initializer.RegisterPurchaseProvider("google", provider) + } + + // Facebook + provider = iap.NewFacebookPurchaseProvider(nk, logger, db, config, zapLogger) + if provider != nil { + initializer.RegisterPurchaseProvider("facebook", provider) + } + + // Huawei + provider = iap.NewHuaweiPurchaseProvider(nk, logger, db, config, zapLogger) + if provider != nil { + initializer.RegisterPurchaseProvider("huawei", provider) + } } func CheckRuntimeProviderGo(logger *zap.Logger, rootPath string, paths []string) error { From 51f135f172fe63fbb42ae828bcaeeb24d283e4ca Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Thu, 24 Jul 2025 16:10:52 +0100 Subject: [PATCH 18/28] handle refund implemeted in the relevant built ins --- iap/facebook.go | 2 + iap/google.go | 165 +++++++++++++++++++++++++++++++++++- iap/huawei.go | 2 + iap/iap.go | 26 ++++++ server/console.go | 30 +++++-- server/core_subscription.go | 34 ++------ 6 files changed, 221 insertions(+), 38 deletions(-) diff --git a/iap/facebook.go b/iap/facebook.go index 30a7f4f5ab..2f54c4d72d 100644 --- a/iap/facebook.go +++ b/iap/facebook.go @@ -107,6 +107,8 @@ func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, use } func (f *FacebookPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { + f.logger.Info("Handling refund not implemented yet") + return nil, nil } diff --git a/iap/google.go b/iap/google.go index c4560fc5be..9512e15499 100644 --- a/iap/google.go +++ b/iap/google.go @@ -3,16 +3,23 @@ package iap import ( "context" "database/sql" + "encoding/base64" + "encoding/json" "errors" "fmt" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama-common/runtime" + "github.com/jackc/pgerrcode" + "github.com/jackc/pgx/v5/pgconn" "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" + "io" "net/http" + "strconv" + "strings" ) type GooglePurchaseProvider struct { @@ -124,7 +131,163 @@ func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, userI } func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { - return nil, nil + return func(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + if err != nil { + g.logger.Error("Failed to decode App Store notification body, error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + defer r.Body.Close() + + g.zapLogger = g.zapLogger.With(zap.String("notification_body", string(body))) + + var notification *GoogleStoreNotification + if err := json.Unmarshal(body, ¬ification); err != nil { + g.zapLogger.Error("Failed to unmarshal Google Play Billing notification", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + jsonData, err := base64.URLEncoding.DecodeString(notification.Message.Data) + if err != nil { + g.zapLogger.Error("Failed to base64 decode Google Play Billing notification data") + w.WriteHeader(http.StatusInternalServerError) + return + } + + var googleNotification *GoogleDeveloperNotification + if err = json.Unmarshal(jsonData, &googleNotification); err != nil { + g.zapLogger.Error("Failed to json unmarshal Google Play Billing notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + if googleNotification.SubscriptionNotification == nil { + // Notification is not for subscription, ack and return. https://developer.android.com/google/play/billing/rtdn-reference#one-time + w.WriteHeader(http.StatusOK) + return + } + + receipt := &ReceiptGoogle{ + PurchaseToken: googleNotification.SubscriptionNotification.PurchaseToken, + ProductID: googleNotification.SubscriptionNotification.SubscriptionId, + PackageName: googleNotification.PackageName, + } + + encodedReceipt, err := json.Marshal(receipt) + if err != nil { + g.zapLogger.Error("Failed to marshal Google receipt.", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + gResponse, _, _, err := ValidateSubscriptionReceiptGoogle(r.Context(), Httpc, g.config.GetGoogle().GetClientEmail(), g.config.GetGoogle().GetPrivateKey(), string(encodedReceipt)) + if err != nil { + var vErr *ValidationError + if errors.As(err, &vErr) { + g.zapLogger.Error("Error validating Google receipt in notification callback", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) + } else { + g.zapLogger.Error("Error validating Google receipt in notification callback", zap.Error(err)) + } + w.WriteHeader(http.StatusInternalServerError) + return + } + + g.zapLogger.Debug("Google IAP subscription notification received", zap.String("notification_payload", string(jsonData)), zap.Any("api_response", gResponse)) + + var uid uuid.UUID + if gResponse.ObfuscatedExternalAccountId != "" { + extUID, err := uuid.FromString(gResponse.ObfuscatedExternalAccountId) + if err != nil { + w.WriteHeader(http.StatusOK) + return + } + uid = extUID + } else if gResponse.ObfuscatedExternalProfileId != "" { + extUID, err := uuid.FromString(gResponse.ObfuscatedExternalProfileId) + if err != nil { + w.WriteHeader(http.StatusOK) + return + } + uid = extUID + } else if gResponse.ProfileId != "" { + var dbUID uuid.UUID + if err = g.db.QueryRowContext(r.Context(), "SELECT id FROM users WHERE google_id = $1", gResponse.ProfileId).Scan(&dbUID); err != nil { + if errors.Is(err, sql.ErrNoRows) { + g.zapLogger.Warn("Google Play Billing subscription notification user not found", zap.String("profile_id", gResponse.ProfileId), zap.String("payload", string(body))) + w.WriteHeader(http.StatusOK) // Subscription could not be assigned to a user ID, ack and ignore it. + return + } + w.WriteHeader(http.StatusInternalServerError) + return + } + uid = dbUID + } else { + // Get user id by existing validated subscription. + purchaseToken := googleNotification.SubscriptionNotification.PurchaseToken + if gResponse.LinkedPurchaseToken != "" { + // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da + purchaseToken = gResponse.LinkedPurchaseToken + } + sub, err := GetSubscriptionByOriginalTransactionId(r.Context(), g.zapLogger, g.db, purchaseToken) + if err != nil || sub == nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + uid = uuid.Must(uuid.FromString(sub.UserId)) + } + + env := api.StoreEnvironment_PRODUCTION + if gResponse.PurchaseType == 0 { + env = api.StoreEnvironment_SANDBOX + } + + expireTimeInt, err := strconv.ParseInt(gResponse.ExpiryTimeMillis, 10, 64) + if err != nil { + g.zapLogger.Error("Failed to convert Google Play Billing notification 'ExpiryTimeMillis' string to int", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + purchaseTime, err := strconv.ParseInt(gResponse.StartTimeMillis, 10, 64) + if err != nil { + g.zapLogger.Error("Failed to convert Google Play Billing notification 'StartTimeMillis' string to int", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + storageSub := &StorageSubscription{ + OriginalTransactionId: googleNotification.SubscriptionNotification.PurchaseToken, + UserID: uid, + Store: api.StoreProvider_GOOGLE_PLAY_STORE, + ProductId: googleNotification.SubscriptionNotification.SubscriptionId, + PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + ExpireTime: ParseMillisecondUnixTimestamp(expireTimeInt), + RawNotification: string(body), + } + + if gResponse.LinkedPurchaseToken != "" { + // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da + storageSub.OriginalTransactionId = gResponse.LinkedPurchaseToken + } + + if err = UpsertSubscription(r.Context(), g.db, storageSub); err != nil { + var pgErr *pgconn.PgError + if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { + // Record was inserted and the user id was not found, ignore this notification + w.WriteHeader(http.StatusOK) + return + } + + g.zapLogger.Error("Failed to store Google Play Billing notification subscription data", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) + }, nil } func (g *GooglePurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { diff --git a/iap/huawei.go b/iap/huawei.go index 76400ffbcd..d2aa740863 100644 --- a/iap/huawei.go +++ b/iap/huawei.go @@ -122,6 +122,8 @@ func (h *HuaweiPurchaseProvider) SubscriptionValidate(ctx context.Context, userI } func (h *HuaweiPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { + h.logger.Info("Handling refund not implemented yet") + return nil, nil } diff --git a/iap/iap.go b/iap/iap.go index 324e048f69..4acf97285c 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -439,6 +439,32 @@ type accessTokenGoogle struct { fetchedAt time.Time // Set when token is received } +type GoogleStoreNotification struct { + Message GoogleStoreNotificationMessage `json:"message"` + Subscription string `json:"subscription"` +} + +type GoogleStoreNotificationMessage struct { + Attributes map[string]string `json:"attributes"` + Data string `json:"data"` + MessageId string `json:"messageId"` +} + +type GoogleDeveloperNotification struct { + Version string `json:"version"` + PackageName string `json:"packageName"` + EventTimeMillis string `json:"eventTimeMillis"` + SubscriptionNotification *GoogleSubscriptionNotification `json:"subscriptionNotification"` + TestNotification map[string]string `json:"testNotification"` +} + +type GoogleSubscriptionNotification struct { + Version string `json:"version"` + NotificationType int `json:"notificationType"` + PurchaseToken string `json:"purchaseToken"` + SubscriptionId string `json:"subscriptionId"` +} + func (at *accessTokenGoogle) Expired() bool { return at.fetchedAt.Add(time.Duration(at.ExpiresIn)*time.Second - accessTokenExpiresGracePeriod*time.Second).Before(time.Now()) } diff --git a/server/console.go b/server/console.go index 7c2d6d8b76..2a7decbdb4 100644 --- a/server/console.go +++ b/server/console.go @@ -284,23 +284,35 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D if config.GetIAP().Apple.NotificationsEndpointId != "" { endpoint := fmt.Sprintf("/v2/console/apple/subscriptions/%s", config.GetIAP().Apple.NotificationsEndpointId) // uncomment when built in iap are switched to new purchaseprovider flow - //provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) + provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) + if err != nil && provider == nil { + startupLogger.Error("Console registration failed", zap.Error(err)) + } else { + handler, err := provider.HandleRefund(ctx) + if err != nil { + startupLogger.Error("Console registration failed", zap.Error(err)) + } + grpcGatewayRouter.HandleFunc(endpoint, handler) + } + + grpcGatewayRouter.HandleFunc(endpoint, appleNotificationHandler(logger, db, runtime.PurchaseNotificationApple(), runtime.SubscriptionNotificationApple())) + logger.Info("Registered endpoint for Apple subscription notifications callback", zap.String("endpoint", endpoint)) + } + + if config.GetIAP().Google.NotificationsEndpointId != "" { + endpoint := fmt.Sprintf("/v2/console/google/subscriptions/%s", config.GetIAP().Google.NotificationsEndpointId) + //uncomment when built in iap are switched to new purchaseprovider flow + //provider, err := iap.GetPurchaseProvider("google", runtime.purchaseProviders) //if err != nil && provider == nil { // startupLogger.Error("Console registration failed", zap.Error(err)) //} else { - // handler, err := provider.HandleRefund(ctx, logger, db) + // handler, err := provider.HandleRefund(ctx) // if err != nil { // startupLogger.Error("Console registration failed", zap.Error(err)) // } // grpcGatewayRouter.HandleFunc(endpoint, handler) //} - grpcGatewayRouter.HandleFunc(endpoint, appleNotificationHandler(logger, db, runtime.PurchaseNotificationApple(), runtime.SubscriptionNotificationApple())) - logger.Info("Registered endpoint for Apple subscription notifications callback", zap.String("endpoint", endpoint)) - } - - if config.GetIAP().Google.NotificationsEndpointId != "" { - endpoint := fmt.Sprintf("/v2/console/google/subscriptions/%s", config.GetIAP().Google.NotificationsEndpointId) grpcGatewayRouter.HandleFunc(endpoint, googleNotificationHandler(logger, db, config.GetIAP().Google)) logger.Info("Registered endpoint for Google subscription notifications callback", zap.String("endpoint", endpoint)) } @@ -446,7 +458,7 @@ func initPurchaseProviderRefundHooks(logger *zap.Logger, config Config, refundFn provider.Init(refundFn.Purchase, refundFn.Subscription) } - + return nil } diff --git a/server/core_subscription.go b/server/core_subscription.go index feca19a41c..2f33faed71 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -242,6 +242,10 @@ func ListSubscriptions(ctx context.Context, logger *zap.Logger, db *sql.DB, user return &api.SubscriptionList{ValidatedSubscriptions: subscriptions, Cursor: nextCursorStr, PrevCursor: prevCursorStr}, nil } +func ValidateSubscription(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) { + +} + func ValidateSubscriptionApple(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { validation, rawResponse, err := iap.ValidateReceiptApple(ctx, iap.Httpc, receipt, password) if err != nil { @@ -789,32 +793,6 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati } } -type googleStoreNotification struct { - Message googleStoreNotificationMessage `json:"message"` - Subscription string `json:"subscription"` -} - -type googleStoreNotificationMessage struct { - Attributes map[string]string `json:"attributes"` - Data string `json:"data"` - MessageId string `json:"messageId"` -} - -type googleDeveloperNotification struct { - Version string `json:"version"` - PackageName string `json:"packageName"` - EventTimeMillis string `json:"eventTimeMillis"` - SubscriptionNotification *googleSubscriptionNotification `json:"subscriptionNotification"` - TestNotification map[string]string `json:"testNotification"` -} - -type googleSubscriptionNotification struct { - Version string `json:"version"` - NotificationType int `json:"notificationType"` - PurchaseToken string `json:"purchaseToken"` - SubscriptionId string `json:"subscriptionId"` -} - func googleNotificationHandler(logger *zap.Logger, db *sql.DB, config *IAPGoogleConfig) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) @@ -827,7 +805,7 @@ func googleNotificationHandler(logger *zap.Logger, db *sql.DB, config *IAPGoogle logger = logger.With(zap.String("notification_body", string(body))) - var notification *googleStoreNotification + var notification *iap.GoogleStoreNotification if err := json.Unmarshal(body, ¬ification); err != nil { logger.Error("Failed to unmarshal Google Play Billing notification", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) @@ -841,7 +819,7 @@ func googleNotificationHandler(logger *zap.Logger, db *sql.DB, config *IAPGoogle return } - var googleNotification *googleDeveloperNotification + var googleNotification *iap.GoogleDeveloperNotification if err = json.Unmarshal(jsonData, &googleNotification); err != nil { logger.Error("Failed to json unmarshal Google Play Billing notification payload", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) From d3b7f1abc42b7e17f737eaaf4bc11518e4ea87a5 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Sat, 2 Aug 2025 19:50:08 +0100 Subject: [PATCH 19/28] PR requested changes and generic validate subscription implemented --- apigrpc/apigrpc.pb.go | 35 +- apigrpc/apigrpc.proto | 2 +- apigrpc/apigrpc.swagger.json | 75 +- apigrpc/apigrpc_grpc.pb.go | 10 +- iap/apple.go | 183 +-- iap/facebook.go | 136 +-- iap/google.go | 92 +- iap/huawei.go | 144 +-- iap/iap.go | 72 +- server/api_purchase.go | 76 +- server/api_subscription.go | 112 ++ server/core_purchase.go | 19 +- server/core_subscription.go | 13 +- server/google_refund_scheduler.go | 8 +- server/runtime.go | 36 +- server/runtime_go.go | 57 +- .../heroiclabs/nakama-common/api/api.pb.go | 1041 +++++++++++------ .../heroiclabs/nakama-common/api/api.proto | 39 + .../nakama-common/runtime/runtime.go | 59 +- 19 files changed, 1423 insertions(+), 786 deletions(-) diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index d10354e991..69e580361a 100644 --- a/apigrpc/apigrpc.pb.go +++ b/apigrpc/apigrpc.pb.go @@ -46,7 +46,7 @@ var File_apigrpc_proto protoreflect.FileDescriptor const file_apigrpc_proto_rawDesc = "" + "\n" + "\rapigrpc.proto\x12\n" + - "nakama.api\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\x1a1github.com/heroiclabs/nakama-common/api/api.proto2\x9bP\n" + + "nakama.api\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\x1a1github.com/heroiclabs/nakama-common/api/api.proto2\xa4P\n" + "\x06Nakama\x12W\n" + "\n" + "AddFriends\x12\x1d.nakama.api.AddFriendsRequest\x1a\x16.google.protobuf.Empty\"\x12\x82\xd3\xe4\x93\x02\f\"\n" + @@ -156,8 +156,8 @@ const file_apigrpc_proto_rawDesc = "" + "\fUnlinkGoogle\x12\x19.nakama.api.AccountGoogle\x1a\x16.google.protobuf.Empty\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/v2/account/unlink/google\x12d\n" + "\vUnlinkSteam\x12\x18.nakama.api.AccountSteam\x1a\x16.google.protobuf.Empty\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v2/account/unlink/steam\x12a\n" + "\rUpdateAccount\x12 .nakama.api.UpdateAccountRequest\x1a\x16.google.protobuf.Empty\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\x1a\v/v2/account\x12f\n" + - "\vUpdateGroup\x12\x1e.nakama.api.UpdateGroupRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\x1a\x14/v2/group/{group_id}\x12z\n" + - "\x10ValidatePurchase\x12#.nakama.api.ValidatePurchaseRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v2/iap/purchase\x12\x8a\x01\n" + + "\vUpdateGroup\x12\x1e.nakama.api.UpdateGroupRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\x1a\x14/v2/group/{group_id}\x12\x82\x01\n" + + "\x10ValidatePurchase\x12#.nakama.api.ValidatePurchaseRequest\x1a,.nakama.api.ValidatePurchaseProviderResponse\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v2/iap/purchase\x12\x8a\x01\n" + "\x15ValidatePurchaseApple\x12(.nakama.api.ValidatePurchaseAppleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/v2/iap/purchase/apple\x12\x9a\x01\n" + "\x19ValidateSubscriptionApple\x12,.nakama.api.ValidateSubscriptionAppleRequest\x1a(.nakama.api.ValidateSubscriptionResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/v2/iap/subscription/apple\x12\x8d\x01\n" + "\x16ValidatePurchaseGoogle\x12).nakama.api.ValidatePurchaseGoogleRequest\x1a$.nakama.api.ValidatePurchaseResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v2/iap/purchase/google\x12\x9d\x01\n" + @@ -275,10 +275,11 @@ var file_apigrpc_proto_goTypes = []any{ (*api.TournamentRecordList)(nil), // 91: nakama.api.TournamentRecordList (*api.UserGroupList)(nil), // 92: nakama.api.UserGroupList (*api.StorageObjects)(nil), // 93: nakama.api.StorageObjects - (*api.ValidatePurchaseResponse)(nil), // 94: nakama.api.ValidatePurchaseResponse - (*api.ValidateSubscriptionResponse)(nil), // 95: nakama.api.ValidateSubscriptionResponse - (*api.LeaderboardRecord)(nil), // 96: nakama.api.LeaderboardRecord - (*api.StorageObjectAcks)(nil), // 97: nakama.api.StorageObjectAcks + (*api.ValidatePurchaseProviderResponse)(nil), // 94: nakama.api.ValidatePurchaseProviderResponse + (*api.ValidatePurchaseResponse)(nil), // 95: nakama.api.ValidatePurchaseResponse + (*api.ValidateSubscriptionResponse)(nil), // 96: nakama.api.ValidateSubscriptionResponse + (*api.LeaderboardRecord)(nil), // 97: nakama.api.LeaderboardRecord + (*api.StorageObjectAcks)(nil), // 98: nakama.api.StorageObjectAcks } var file_apigrpc_proto_depIdxs = []int32{ 0, // 0: nakama.api.Nakama.AddFriends:input_type -> nakama.api.AddFriendsRequest @@ -439,16 +440,16 @@ var file_apigrpc_proto_depIdxs = []int32{ 16, // 155: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty 16, // 156: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty 16, // 157: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty - 94, // 158: nakama.api.Nakama.ValidatePurchase:output_type -> nakama.api.ValidatePurchaseResponse - 94, // 159: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 160: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse - 94, // 161: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse - 95, // 162: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse - 94, // 163: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse - 94, // 164: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse - 96, // 165: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord - 97, // 166: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks - 96, // 167: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord + 94, // 158: nakama.api.Nakama.ValidatePurchase:output_type -> nakama.api.ValidatePurchaseProviderResponse + 95, // 159: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse + 96, // 160: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse + 95, // 161: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse + 96, // 162: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse + 95, // 163: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse + 95, // 164: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse + 97, // 165: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord + 98, // 166: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks + 97, // 167: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord 84, // [84:168] is the sub-list for method output_type 0, // [0:84] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name diff --git a/apigrpc/apigrpc.proto b/apigrpc/apigrpc.proto index 6251fc0062..663cb3c808 100644 --- a/apigrpc/apigrpc.proto +++ b/apigrpc/apigrpc.proto @@ -678,7 +678,7 @@ service Nakama { } // Validate Purchase - rpc ValidatePurchase (api.ValidatePurchaseRequest) returns (api.ValidatePurchaseResponse) { + rpc ValidatePurchase (api.ValidatePurchaseRequest) returns (api.ValidatePurchaseProviderResponse) { option (google.api.http) = { post: "/v2/iap/purchase", body: "*" diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index 1477136b35..853878f962 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -2224,7 +2224,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiValidatePurchaseResponse" + "$ref": "#/definitions/apiValidatePurchaseProviderResponse" } }, "default": { @@ -4597,6 +4597,55 @@ "default": "NO_OVERRIDE", "description": "Operator that can be used to override the one set in the leaderboard.\n\n - NO_OVERRIDE: Do not override the leaderboard operator.\n - BEST: Override the leaderboard operator with BEST.\n - SET: Override the leaderboard operator with SET.\n - INCREMENT: Override the leaderboard operator with INCREMENT.\n - DECREMENT: Override the leaderboard operator with DECREMENT." }, + "apiPurchaseProviderValidatedPurchase": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "Purchase User ID." + }, + "productId": { + "type": "string", + "description": "Purchase Product ID." + }, + "transactionId": { + "type": "string", + "description": "Purchase Transaction ID." + }, + "store": { + "$ref": "#/definitions/apiStoreProvider", + "title": "Store identifier" + }, + "purchaseTime": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the purchase was done." + }, + "createTime": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the receipt validation was stored in DB." + }, + "updateTime": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the receipt validation was updated in DB." + }, + "refundTime": { + "type": "string", + "format": "date-time", + "title": "Timestamp when the purchase was refunded. Set to UNIX" + }, + "providerResponse": { + "type": "string", + "description": "Raw provider validation response." + }, + "environment": { + "$ref": "#/definitions/apiStoreEnvironment", + "description": "Whether the purchase was done in production or sandbox environment." + } + } + }, "apiReadStorageObjectId": { "type": "object", "properties": { @@ -5225,12 +5274,36 @@ }, "title": "Huawei IAP Purchase validation request" }, + "apiValidatePurchaseProviderResponse": { + "type": "object", + "properties": { + "validatedPurchases": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiPurchaseProviderValidatedPurchase" + } + }, + "persist": { + "type": "boolean" + } + } + }, "apiValidatePurchaseRequest": { "type": "object", "properties": { "receipt": { "type": "string" }, + "purchase": { + "type": "string" + }, + "signedRequest": { + "type": "string" + }, + "signature": { + "type": "string" + }, "platform": { "type": "string" }, diff --git a/apigrpc/apigrpc_grpc.pb.go b/apigrpc/apigrpc_grpc.pb.go index d2a67e4f70..07ce3d9f3a 100644 --- a/apigrpc/apigrpc_grpc.pb.go +++ b/apigrpc/apigrpc_grpc.pb.go @@ -280,7 +280,7 @@ type NakamaClient interface { // Update fields in a given group. UpdateGroup(ctx context.Context, in *api.UpdateGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Validate Purchase - ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) + ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseProviderResponse, error) // Validate Apple IAP Receipt ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Validate Apple Subscription Receipt @@ -1049,9 +1049,9 @@ func (c *nakamaClient) UpdateGroup(ctx context.Context, in *api.UpdateGroupReque return out, nil } -func (c *nakamaClient) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { +func (c *nakamaClient) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseProviderResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(api.ValidatePurchaseResponse) + out := new(api.ValidatePurchaseProviderResponse) err := c.cc.Invoke(ctx, Nakama_ValidatePurchase_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -1305,7 +1305,7 @@ type NakamaServer interface { // Update fields in a given group. UpdateGroup(context.Context, *api.UpdateGroupRequest) (*emptypb.Empty, error) // Validate Purchase - ValidatePurchase(context.Context, *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) + ValidatePurchase(context.Context, *api.ValidatePurchaseRequest) (*api.ValidatePurchaseProviderResponse, error) // Validate Apple IAP Receipt ValidatePurchaseApple(context.Context, *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) // Validate Apple Subscription Receipt @@ -1556,7 +1556,7 @@ func (UnimplementedNakamaServer) UpdateAccount(context.Context, *api.UpdateAccou func (UnimplementedNakamaServer) UpdateGroup(context.Context, *api.UpdateGroupRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateGroup not implemented") } -func (UnimplementedNakamaServer) ValidatePurchase(context.Context, *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) { +func (UnimplementedNakamaServer) ValidatePurchase(context.Context, *api.ValidatePurchaseRequest) (*api.ValidatePurchaseProviderResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchase not implemented") } func (UnimplementedNakamaServer) ValidatePurchaseApple(context.Context, *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) { diff --git a/iap/apple.go b/iap/apple.go index 955875a8d7..be9bafc058 100644 --- a/iap/apple.go +++ b/iap/apple.go @@ -39,7 +39,21 @@ func (a *ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, a.subscriptionFn = subscriptionRefundFn } -func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { +func (a *ApplePurchaseProvider) GetProviderString() string { + platform := Apple + + return platform.String() +} + +func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { + if a.config.GetApple().GetSharedPassword() == "" { + return nil, status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") + } + + if len(in.Receipt) < 1 { + return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") + } + uuidUserID, err := uuid.FromString(userID) if err != nil { a.logger.Error("Error parsing user ID, error: %v", err) @@ -72,7 +86,7 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.Va } seenTransactionIDs := make(map[string]struct{}, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) - storagePurchases := make([]*StoragePurchase, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) + storagePurchases := make([]*runtime.StoragePurchase, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) for _, purchase := range validation.Receipt.InApp { if purchase.ExpiresDateMs != "" { continue @@ -87,7 +101,7 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.Va } seenTransactionIDs[purchase.TransactionId] = struct{}{} - storagePurchases = append(storagePurchases, &StoragePurchase{ + storagePurchases = append(storagePurchases, &runtime.StoragePurchase{ UserID: uuidUserID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: purchase.ProductID, @@ -113,7 +127,7 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.Va } seenTransactionIDs[purchase.TransactionId] = struct{}{} - storagePurchases = append(storagePurchases, &StoragePurchase{ + storagePurchases = append(storagePurchases, &runtime.StoragePurchase{ UserID: uuidUserID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: purchase.ProductId, @@ -129,61 +143,25 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.Va return nil, status.Error(codes.FailedPrecondition, "Subscription Receipt. Use the appropriate function instead.") } - if !persist { - // Skip storing the receipts - validatedPurchases := make([]*api.ValidatedPurchase, 0, len(storagePurchases)) - for _, p := range storagePurchases { - validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ - UserId: p.UserID.String(), - ProductId: p.ProductId, - TransactionId: p.TransactionId, - Store: p.Store, - PurchaseTime: timestamppb.New(p.PurchaseTime), - ProviderResponse: string(raw), - Environment: p.Environment, - }) - } - - return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil - } - - purchases, err := UpsertPurchases(ctx, a.db, storagePurchases) - if err != nil { - return nil, err - } - - validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) - for _, p := range purchases { - suid := p.UserID.String() - if p.UserID.IsNil() { - suid = "" - } - validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ - UserId: suid, - ProductId: p.ProductId, - TransactionId: p.TransactionId, - Store: p.Store, - PurchaseTime: timestamppb.New(p.PurchaseTime), - CreateTime: timestamppb.New(p.CreateTime), - UpdateTime: timestamppb.New(p.UpdateTime), - ProviderResponse: string(raw), - SeenBefore: p.SeenBefore, - Environment: p.Environment, - }) - } + return storagePurchases, nil - return &api.ValidatePurchaseResponse{ - ValidatedPurchases: validatedPurchases, - }, nil } -func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { +func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { uuidUserID, err := uuid.FromString(userID) if err != nil { a.logger.Error("Error parsing user ID, error: %v", err) } - validation, rawResponse, err := ValidateReceiptApple(ctx, Httpc, receipt, password) + if a.config.GetApple().GetSharedPassword() == "" { + return nil, status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") + } + + if len(in.Receipt) < 1 { + return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") + } + + validation, rawResponse, err := ValidateReceiptApple(ctx, Httpc, in.Receipt, a.config.GetApple().GetSharedPassword()) if err != nil { if err != context.Canceled { var vErr *ValidationError @@ -211,6 +189,8 @@ func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, userID var found bool var receiptInfo ValidateReceiptAppleResponseLatestReceiptInfo + storageSubscriptions := make([]*runtime.StorageSubscription, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) + for _, latestReceiptInfo := range validation.LatestReceiptInfo { if latestReceiptInfo.ExpiresDateMs == "" { // Not a subscription, skip. @@ -218,73 +198,44 @@ func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, userID } receiptInfo = latestReceiptInfo found = true - } - if !found { - // Receipt is for a purchase (or otherwise has no subscriptions for any reason) so ValidatePurchaseApple should be used instead. - return nil, status.Error(codes.FailedPrecondition, "Purchase Receipt. Use the appropriate function instead.") - } - purchaseTime, err := strconv.ParseInt(receiptInfo.OriginalPurchaseDateMs, 10, 64) - if err != nil { - return nil, err - } - - expireTimeInt, err := strconv.ParseInt(receiptInfo.ExpiresDateMs, 10, 64) - if err != nil { - return nil, err - } - - expireTime := ParseMillisecondUnixTimestamp(expireTimeInt) + purchaseTime, err := strconv.ParseInt(receiptInfo.OriginalPurchaseDateMs, 10, 64) + if err != nil { + return nil, err + } - active := false - if expireTime.After(time.Now()) { - active = true - } + expireTimeInt, err := strconv.ParseInt(receiptInfo.ExpiresDateMs, 10, 64) + if err != nil { + return nil, err + } - storageSub := &StorageSubscription{ - UserID: uuidUserID, - Store: api.StoreProvider_APPLE_APP_STORE, - ProductId: receiptInfo.ProductId, - OriginalTransactionId: receiptInfo.OriginalTransactionId, - PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), - Environment: env, - ExpireTime: expireTime, - RawResponse: string(rawResponse), - } + expireTime := ParseMillisecondUnixTimestamp(expireTimeInt) - validatedSub := &api.ValidatedSubscription{ - UserId: storageSub.UserID.String(), - ProductId: storageSub.ProductId, - OriginalTransactionId: storageSub.OriginalTransactionId, - Store: api.StoreProvider_APPLE_APP_STORE, - PurchaseTime: timestamppb.New(storageSub.PurchaseTime), - Environment: env, - Active: active, - ExpiryTime: timestamppb.New(storageSub.ExpireTime), - ProviderResponse: storageSub.RawResponse, - ProviderNotification: storageSub.RawNotification, - } + active := false + if expireTime.After(time.Now()) { + active = true + } - if !persist { - return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil - } + // change this to an array of storage subscriptions + storageSubscriptions = append(storageSubscriptions, &runtime.StorageSubscription{ + UserID: uuidUserID, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: receiptInfo.ProductId, + OriginalTransactionId: receiptInfo.OriginalTransactionId, + PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + ExpireTime: expireTime, + RawResponse: string(rawResponse), + Active: active, + }) - if err = UpsertSubscription(ctx, a.db, storageSub); err != nil { - return nil, err } - - suid := storageSub.UserID.String() - if storageSub.UserID.IsNil() { - suid = "" + if !found { + // Receipt is for a purchase (or otherwise has no subscriptions for any reason) so ValidatePurchaseApple should be used instead. + return nil, status.Error(codes.FailedPrecondition, "Purchase Receipt. Use the appropriate function instead.") } - validatedSub.UserId = suid - validatedSub.CreateTime = timestamppb.New(storageSub.CreateTime) - validatedSub.UpdateTime = timestamppb.New(storageSub.UpdateTime) - validatedSub.ProviderResponse = storageSub.RawResponse - validatedSub.ProviderNotification = storageSub.RawNotification - - return &api.ValidateSubscriptionResponse{ValidatedSubscription: validatedSub}, nil + return storageSubscriptions, nil } func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { @@ -456,7 +407,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerF uid = uuid.Must(uuid.FromString(s.UserId)) } - sub := &StorageSubscription{ + sub := &runtime.StorageSubscription{ UserID: uid, OriginalTransactionId: signedTransactionInfo.OriginalTransactionId, Store: api.StoreProvider_APPLE_APP_STORE, @@ -530,7 +481,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerF } if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { - purchase := &StoragePurchase{ + purchase := &runtime.StoragePurchase{ UserID: uid, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: signedTransactionInfo.ProductId, @@ -540,7 +491,7 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerF Environment: env, } - dbPurchases, err := UpsertPurchases(r.Context(), a.db, []*StoragePurchase{purchase}) + dbPurchases, err := UpsertPurchases(r.Context(), a.db, []*runtime.StoragePurchase{purchase}) if err != nil { a.logger.Error("Failed to store App Store notification purchase data") w.WriteHeader(http.StatusInternalServerError) @@ -580,14 +531,6 @@ func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerF }, nil } -func (a *ApplePurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { - if a.config.GetApple().GetSharedPassword() == "" { - return status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") - } - - return nil -} - func NewApplePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { purchaseProvider := &ApplePurchaseProvider{ nk: nk, diff --git a/iap/facebook.go b/iap/facebook.go index 2f54c4d72d..5c5cd8074a 100644 --- a/iap/facebook.go +++ b/iap/facebook.go @@ -9,7 +9,6 @@ import ( "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" "net/http" "time" ) @@ -29,7 +28,20 @@ func (f *FacebookPurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundF f.subscriptionFn = subscriptionRefundFn } -func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { +func (f *FacebookPurchaseProvider) GetProviderString() string { + platform := Facebook + return platform.String() +} + +func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { + if f.config.GetFacebookInstant().GetAppSecret() == "" { + return nil, status.Error(codes.FailedPrecondition, "Facebook Instant IAP is not configured.") + } + + if len(in.SignedRequest) < 1 { + return nil, status.Error(codes.InvalidArgument, "SignedRequest cannot be empty.") + } + uuidUserID, err := uuid.FromString(userID) if err != nil { f.logger.Error("Error parsing user ID, error: %v", err) @@ -43,7 +55,7 @@ func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api return nil, err } - sPurchase := &StoragePurchase{ + sPurchase := &runtime.StoragePurchase{ UserID: uuidUserID, Store: api.StoreProvider_FACEBOOK_INSTANT_STORE, ProductId: payment.ProductId, @@ -53,75 +65,67 @@ func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api Environment: api.StoreEnvironment_PRODUCTION, } - if !persist { - validatedPurchases := []*api.ValidatedPurchase{ - { - UserId: userID, - ProductId: sPurchase.ProductId, - TransactionId: sPurchase.TransactionId, - Store: sPurchase.Store, - PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), - ProviderResponse: rawResponse, - Environment: sPurchase.Environment, - }, - } - - return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil - } - - purchases, err := UpsertPurchases(ctx, f.db, []*StoragePurchase{sPurchase}) - if err != nil { - if err != context.Canceled { - f.logger.Error("Error storing Facebook Instant receipt, error: %v", err) - } - return nil, err - } - - validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) - for _, p := range purchases { - suid := p.UserID.String() - if p.UserID.IsNil() { - suid = "" - } - validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ - UserId: suid, - ProductId: p.ProductId, - TransactionId: p.TransactionId, - Store: p.Store, - PurchaseTime: timestamppb.New(p.PurchaseTime), - CreateTime: timestamppb.New(p.CreateTime), - UpdateTime: timestamppb.New(p.UpdateTime), - ProviderResponse: rawResponse, - SeenBefore: p.SeenBefore, - Environment: p.Environment, - }) - } - - return &api.ValidatePurchaseResponse{ - ValidatedPurchases: validatedPurchases, - }, nil + return []*runtime.StoragePurchase{sPurchase}, nil + + //if !persist { + // validatedPurchases := []*api.PurchaseProviderValidatedPurchase{ + // { + // UserId: userID, + // ProductId: sPurchase.ProductId, + // TransactionId: sPurchase.TransactionId, + // Store: sPurchase.Store, + // PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), + // ProviderResponse: rawResponse, + // Environment: sPurchase.Environment, + // }, + // } + // + // return &api.ValidatePurchaseProviderResponse{ValidatedPurchases: validatedPurchases}, nil + //} + + //purchases, err := UpsertPurchases(ctx, f.db, []*runtime.StoragePurchase{sPurchase}) + //if err != nil { + // if err != context.Canceled { + // f.logger.Error("Error storing Facebook Instant receipt, error: %v", err) + // } + // return nil, err + //} + // + //validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(purchases)) + //for _, p := range purchases { + // suid := p.UserID.String() + // if p.UserID.IsNil() { + // suid = "" + // } + // validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ + // UserId: suid, + // ProductId: p.ProductId, + // TransactionId: p.TransactionId, + // Store: p.Store, + // PurchaseTime: timestamppb.New(p.PurchaseTime), + // CreateTime: timestamppb.New(p.CreateTime), + // UpdateTime: timestamppb.New(p.UpdateTime), + // ProviderResponse: rawResponse, + // Environment: p.Environment, + // }) + //} + // + //return &api.ValidatePurchaseProviderResponse{ + // ValidatedPurchases: validatedPurchases, + // Persist: persist, + //}, nil } -func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { - return nil, nil -} +func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { + f.logger.Info("Handling refund not supported") -func (f *FacebookPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { - f.logger.Info("Handling refund not implemented yet") - - return nil, nil + return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } -func (f *FacebookPurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { - if f.config.GetFacebookInstant().GetAppSecret() == "" { - return status.Error(codes.FailedPrecondition, "Facebook Instant IAP is not configured.") - } - - if len(in.SignedRequest) < 1 { - return status.Error(codes.InvalidArgument, "SignedRequest cannot be empty.") - } +func (f *FacebookPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { + f.logger.Info("Handling refund not supported") - return nil + return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } func NewFacebookPurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { diff --git a/iap/google.go b/iap/google.go index 9512e15499..8f010d915d 100644 --- a/iap/google.go +++ b/iap/google.go @@ -15,7 +15,6 @@ import ( "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" "io" "net/http" "strconv" @@ -37,7 +36,20 @@ func (g *GooglePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, g.subscriptionFn = subscriptionRefundFn } -func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { +func (g *GooglePurchaseProvider) GetProviderString() string { + platform := Google + return platform.String() +} + +func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { + if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { + return nil, status.Error(codes.FailedPrecondition, "Google IAP is not configured.") + } + + if len(in.Purchase) < 1 { + return nil, status.Error(codes.InvalidArgument, "Purchase cannot be empty.") + } + uuidUserID, err := uuid.FromString(userID) if err != nil { g.logger.Error("Error parsing user ID, error: %v", err) @@ -67,7 +79,7 @@ func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V return nil, status.Error(codes.FailedPrecondition, fmt.Sprintf("Invalid Receipt. State: %d", gReceipt.PurchaseState)) } - sPurchase := &StoragePurchase{ + sPurchase := &runtime.StoragePurchase{ UserID: uuidUserID, Store: api.StoreProvider_GOOGLE_PLAY_STORE, ProductId: gReceipt.ProductID, @@ -77,56 +89,10 @@ func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V Environment: purchaseEnv, } - if !persist { - validatedPurchases := []*api.ValidatedPurchase{ - { - UserId: userID, - ProductId: sPurchase.ProductId, - TransactionId: sPurchase.TransactionId, - Store: sPurchase.Store, - PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), - ProviderResponse: string(raw), - Environment: sPurchase.Environment, - }, - } - - return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil - } - - purchases, err := UpsertPurchases(ctx, g.db, []*StoragePurchase{sPurchase}) - if err != nil { - if err != context.Canceled { - g.logger.Error("Error storing Google receipt", err) - } - return nil, err - } - - validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) - for _, p := range purchases { - suid := p.UserID.String() - if p.UserID.IsNil() { - suid = "" - } - validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ - UserId: suid, - ProductId: p.ProductId, - TransactionId: p.TransactionId, - Store: p.Store, - PurchaseTime: timestamppb.New(p.PurchaseTime), - CreateTime: timestamppb.New(p.CreateTime), - UpdateTime: timestamppb.New(p.UpdateTime), - ProviderResponse: string(raw), - SeenBefore: p.SeenBefore, - Environment: p.Environment, - }) - } - - return &api.ValidatePurchaseResponse{ - ValidatedPurchases: validatedPurchases, - }, nil + return []*runtime.StoragePurchase{sPurchase}, nil } -func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { +func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { return nil, nil } @@ -257,7 +223,7 @@ func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) (http.Handler return } - storageSub := &StorageSubscription{ + storageSub := &runtime.StorageSubscription{ OriginalTransactionId: googleNotification.SubscriptionNotification.PurchaseToken, UserID: uid, Store: api.StoreProvider_GOOGLE_PLAY_STORE, @@ -290,17 +256,17 @@ func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) (http.Handler }, nil } -func (g *GooglePurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { - if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { - return status.Error(codes.FailedPrecondition, "Google IAP is not configured.") - } - - if len(in.Purchase) < 1 { - return status.Error(codes.InvalidArgument, "Purchase cannot be empty.") - } - - return nil -} +//func (g *GooglePurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { +// if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { +// return status.Error(codes.FailedPrecondition, "Google IAP is not configured.") +// } +// +// if len(in.Purchase) < 1 { +// return status.Error(codes.InvalidArgument, "Purchase cannot be empty.") +// } +// +// return nil +//} func NewGooglePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { purchaseProvider := &GooglePurchaseProvider{ diff --git a/iap/huawei.go b/iap/huawei.go index d2aa740863..63210898d2 100644 --- a/iap/huawei.go +++ b/iap/huawei.go @@ -11,7 +11,6 @@ import ( "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" "net/http" "strconv" ) @@ -31,7 +30,26 @@ func (h *HuaweiPurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, h.subscriptionFn = subscriptionRefundFn } -func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) { +func (h *HuaweiPurchaseProvider) GetProviderString() string { + platform := Huawei + return platform.String() +} + +func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { + if h.config.GetHuawei().GetPublicKey() == "" || + h.config.GetHuawei().GetClientID() == "" || + h.config.GetHuawei().GetClientSecret() == "" { + return nil, status.Error(codes.FailedPrecondition, "Huawei IAP is not configured.") + } + + if len(in.Purchase) < 1 { + return nil, status.Error(codes.InvalidArgument, "Purchase cannot be empty.") + } + + if len(in.Signature) < 1 { + return nil, status.Error(codes.InvalidArgument, "Signature cannot be empty.") + } + uuidUserID, err := uuid.FromString(userID) if err != nil { h.logger.Error("Error parsing user ID, error: %v", err) @@ -60,7 +78,7 @@ func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V env = api.StoreEnvironment_SANDBOX } - sPurchase := &StoragePurchase{ + sPurchase := &runtime.StoragePurchase{ UserID: uuidUserID, Store: api.StoreProvider_HUAWEI_APP_GALLERY, ProductId: validation.PurchaseTokenData.ProductId, @@ -70,79 +88,65 @@ func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V Environment: env, } - if !persist { - validatedPurchases := []*api.ValidatedPurchase{ - { - ProductId: sPurchase.ProductId, - TransactionId: sPurchase.TransactionId, - Store: sPurchase.Store, - PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), - ProviderResponse: string(raw), - Environment: sPurchase.Environment, - }, - } - return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil - } - - purchases, err := UpsertPurchases(ctx, h.db, []*StoragePurchase{sPurchase}) - if err != nil { - if err != context.Canceled { - h.logger.Error("Error storing Huawei receipt, error: %v", err) - } - return nil, err - } - - validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) - for _, p := range purchases { - suid := p.UserID.String() - if p.UserID.IsNil() { - suid = "" - } - validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ - UserId: suid, - ProductId: p.ProductId, - TransactionId: p.TransactionId, - Store: p.Store, - PurchaseTime: timestamppb.New(p.PurchaseTime), - CreateTime: timestamppb.New(p.CreateTime), - UpdateTime: timestamppb.New(p.UpdateTime), - ProviderResponse: string(raw), - SeenBefore: p.SeenBefore, - Environment: p.Environment, - }) - } - - return &api.ValidatePurchaseResponse{ - ValidatedPurchases: validatedPurchases, - }, nil + //if !persist { + // validatedPurchases := []*api.PurchaseProviderValidatedPurchase{ + // { + // ProductId: sPurchase.ProductId, + // TransactionId: sPurchase.TransactionId, + // Store: sPurchase.Store, + // PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), + // ProviderResponse: string(raw), + // Environment: sPurchase.Environment, + // }, + // } + // return &api.ValidatePurchaseProviderResponse{ValidatedPurchases: validatedPurchases}, nil + //} + // + //purchases, err := UpsertPurchases(ctx, h.db, []*StoragePurchase{sPurchase}) + //if err != nil { + // if err != context.Canceled { + // h.logger.Error("Error storing Huawei receipt, error: %v", err) + // } + // return nil, err + //} + // + //validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(purchases)) + //for _, p := range purchases { + // suid := p.UserID.String() + // if p.UserID.IsNil() { + // suid = "" + // } + // validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ + // UserId: suid, + // ProductId: p.ProductId, + // TransactionId: p.TransactionId, + // Store: p.Store, + // PurchaseTime: timestamppb.New(p.PurchaseTime), + // CreateTime: timestamppb.New(p.CreateTime), + // UpdateTime: timestamppb.New(p.UpdateTime), + // ProviderResponse: string(raw), + // Environment: p.Environment, + // }) + //} + // + //return &api.ValidatePurchaseProviderResponse{ + // ValidatedPurchases: validatedPurchases, + // Persist: persist, + //}, nil + + return []*runtime.StoragePurchase{sPurchase}, nil } -func (h *HuaweiPurchaseProvider) SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { - return nil, nil -} - -func (h *HuaweiPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { - h.logger.Info("Handling refund not implemented yet") +func (h *HuaweiPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { + h.logger.Info("Handling refund not supported") - return nil, nil + return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } -func (h *HuaweiPurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { - if h.config.GetHuawei().GetPublicKey() == "" || - h.config.GetHuawei().GetClientID() == "" || - h.config.GetHuawei().GetClientSecret() == "" { - return status.Error(codes.FailedPrecondition, "Huawei IAP is not configured.") - } - - if len(in.Purchase) < 1 { - return status.Error(codes.InvalidArgument, "Purchase cannot be empty.") - } - - if len(in.Signature) < 1 { - return status.Error(codes.InvalidArgument, "Signature cannot be empty.") - } +func (h *HuaweiPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { + h.logger.Info("Handling refund not supported") - return nil + return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } func NewHuaweiPurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { diff --git a/iap/iap.go b/iap/iap.go index 4acf97285c..a660cc657b 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -121,35 +121,6 @@ type AppleNotificationTransactionInfo struct { const AppleNotificationTypeRefund = "REFUND" -type StoragePurchase struct { - UserID uuid.UUID - Store api.StoreProvider - ProductId string - TransactionId string - RawResponse string - PurchaseTime time.Time - CreateTime time.Time // Set by upsertPurchases - UpdateTime time.Time // Set by upsertPurchases - RefundTime time.Time - Environment api.StoreEnvironment - SeenBefore bool // Set by upsertPurchases -} - -type StorageSubscription struct { - OriginalTransactionId string - UserID uuid.UUID - Store api.StoreProvider - ProductId string - PurchaseTime time.Time - CreateTime time.Time // Set by upsertSubscription - UpdateTime time.Time // Set by upsertSubscription - RefundTime time.Time - Environment api.StoreEnvironment - ExpireTime time.Time - RawResponse string - RawNotification string -} - type Platform int const ( @@ -166,23 +137,23 @@ const ( ) func (enum Platform) String() string { - return [...]string{"unknown", "apple", "google", "facebook", "huawei", "xbox", "playstation", "steam", "epic", "discord"}[enum] + return [...]string{runtime.UNKNOWN_PLATFORM_STRING, runtime.APPLE_PLATFORM_STRING, runtime.GOOGLE_PLATFORM_STRING, runtime.FACEBOOK_PLATFORM_STRING, runtime.HUAWEI_PLATFORM_STRING, runtime.XBOX_PLATFORM_STRING, runtime.PLAYSTATION_PLATFORM_STRING, runtime.STEAM_PLATFORM_STRING, runtime.EPIC_PLATFORM_STRING, runtime.DISCORD_PLATFORM_STRING}[enum] } var AllPlatforms = []Platform{Unknown, Apple, Google, Facebook, Huawei, Xbox, Playstation, Steam, Epic, Discord} func FromString(s string) Platform { return map[string]Platform{ - "unknown": Unknown, - "apple": Apple, - "google": Google, - "facebook": Facebook, - "huawei": Huawei, - "xbox": Xbox, - "playstation": Playstation, - "epic": Epic, - "steam": Steam, - "discord": Discord, + runtime.UNKNOWN_PLATFORM_STRING: Unknown, + runtime.APPLE_PLATFORM_STRING: Apple, + runtime.GOOGLE_PLATFORM_STRING: Google, + runtime.FACEBOOK_PLATFORM_STRING: Facebook, + runtime.HUAWEI_PLATFORM_STRING: Huawei, + runtime.XBOX_PLATFORM_STRING: Xbox, + runtime.PLAYSTATION_PLATFORM_STRING: Playstation, + runtime.EPIC_PLATFORM_STRING: Epic, + runtime.STEAM_PLATFORM_STRING: Steam, + runtime.DISCORD_PLATFORM_STRING: Discord, }[s] } @@ -1120,12 +1091,12 @@ func ValidateReceiptFacebookInstant(appSecret, signedRequest string) (*FacebookI return payment, string(payload), nil } -func UpsertPurchases(ctx context.Context, db *sql.DB, purchases []*StoragePurchase) ([]*StoragePurchase, error) { +func UpsertPurchases(ctx context.Context, db *sql.DB, purchases []*runtime.StoragePurchase) ([]*runtime.StoragePurchase, error) { if len(purchases) < 1 { return nil, errors.New("expects at least one receipt") } - transactionIDsToPurchase := make(map[string]*StoragePurchase) + transactionIDsToPurchase := make(map[string]*runtime.StoragePurchase) userIdParams := make([]uuid.UUID, 0, len(purchases)) storeParams := make([]api.StoreProvider, 0, len(purchases)) @@ -1209,7 +1180,7 @@ RETURNING return nil, err } - storedPurchases := make([]*StoragePurchase, 0, len(transactionIDsToPurchase)) + storedPurchases := make([]*runtime.StoragePurchase, 0, len(transactionIDsToPurchase)) for _, purchase := range transactionIDsToPurchase { storedPurchases = append(storedPurchases, purchase) } @@ -1278,7 +1249,20 @@ func GetPurchaseByTransactionId(ctx context.Context, logger *zap.Logger, db *sql }, nil } -func UpsertSubscription(ctx context.Context, db *sql.DB, sub *StorageSubscription) error { +func UpsertSubscriptions(ctx context.Context, db *sql.DB, subs []*runtime.StorageSubscription) error { + var err error + for _, sub := range subs { + err = UpsertSubscription(ctx, db, sub) + } + + if err != nil { + return fmt.Errorf("UpsertSubscriptions failed: %w", err) + } + + return nil +} + +func UpsertSubscription(ctx context.Context, db *sql.DB, sub *runtime.StorageSubscription) error { if sub.RefundTime.IsZero() { // Refund time not set, init as default value. sub.RefundTime = time.Unix(0, 0) diff --git a/server/api_purchase.go b/server/api_purchase.go index a534a7af62..2c01845984 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -16,34 +16,73 @@ package server import ( "context" + "database/sql" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" + "github.com/heroiclabs/nakama-common/runtime" "github.com/heroiclabs/nakama/v3/iap" "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" ) -func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseResponse, error) { - userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) - purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) - if err != nil { - s.logger.Warn("Purchase provider not found", zap.Error(err)) - return nil, status.Error(codes.Internal, "failed to get purchase provider") +func handleValidatedPurchases(ctx context.Context, db *sql.DB, storagePurchases []*runtime.StoragePurchase, persist bool) (*api.ValidatePurchaseProviderResponse, error) { + + if !persist { + //Skip storing the receipts + validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(storagePurchases)) + for _, p := range storagePurchases { + validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ + UserId: p.UserID.String(), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + ProviderResponse: p.RawResponse, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseProviderResponse{ValidatedPurchases: validatedPurchases}, nil } - err = purchaseProvider.ValidateRequest(in) + purchases, err := iap.UpsertPurchases(ctx, db, storagePurchases) if err != nil { return nil, err } - if iap.FromString(in.Platform) != iap.Steam && len(in.Receipt) < 1 { - return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") - } + validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(purchases)) + for _, p := range purchases { + suid := p.UserID.String() + if p.UserID.IsNil() { + suid = "" + } + validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ + UserId: suid, + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), + ProviderResponse: p.RawResponse, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseProviderResponse{ + ValidatedPurchases: validatedPurchases, + Persist: persist, + }, nil +} +func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseProviderResponse, error) { + userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) if err != nil { - s.logger.Warn("Purchase request validation failed", zap.Error(err)) - return nil, status.Error(codes.Internal, err.Error()) + s.logger.Warn("Purchase provider not found", zap.Error(err)) + return nil, status.Error(codes.Internal, "failed to get purchase provider") } if fn := s.runtime.BeforeValidatePurchase(); fn != nil { @@ -68,16 +107,17 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha } } - if iap.FromString(in.Platform) != iap.Steam && len(in.Receipt) < 1 { - return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") - } - persist := true if in.Persist != nil { persist = in.Persist.GetValue() } - validation, err := purchaseProvider.PurchaseValidate(ctx, in, userID.String(), persist) + validationPurchases, err := purchaseProvider.PurchaseValidate(ctx, in, userID.String()) + if err != nil { + return nil, err + } + + validatedPurchasesResponse, err := handleValidatedPurchases(ctx, s.db, validationPurchases, persist) if err != nil { return nil, err } @@ -91,7 +131,7 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } - return validation, err + return validatedPurchasesResponse, err } func (s *ApiServer) ValidatePurchaseApple(ctx context.Context, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseResponse, error) { diff --git a/server/api_subscription.go b/server/api_subscription.go index be1416b18b..da3cad331d 100644 --- a/server/api_subscription.go +++ b/server/api_subscription.go @@ -16,6 +16,10 @@ package server import ( "context" + "database/sql" + "github.com/heroiclabs/nakama-common/runtime" + "github.com/heroiclabs/nakama/v3/iap" + "google.golang.org/protobuf/types/known/timestamppb" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" @@ -24,6 +28,114 @@ import ( "google.golang.org/grpc/status" ) +func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscriptions []*runtime.StorageSubscription, persist bool) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { + + if !persist { + validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) + for _, s := range storageSubscriptions { + validatedSubs = append(validatedSubs, &api.ValidatedSubscription{ + UserId: s.UserID.String(), + ProductId: s.ProductId, + OriginalTransactionId: s.OriginalTransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + PurchaseTime: timestamppb.New(s.PurchaseTime), + Environment: s.Environment, + Active: s.Active, + ExpiryTime: timestamppb.New(s.ExpireTime), + ProviderResponse: s.RawResponse, + ProviderNotification: s.RawNotification, + }) + } + + return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs, Persist: persist}, nil + } + + if err := iap.UpsertSubscriptions(ctx, db, storageSubscriptions); err != nil { + return nil, err + } + + validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) + + for _, sub := range storageSubscriptions { + var validatedSub *api.ValidatedSubscription + suid := sub.UserID.String() + if sub.UserID.IsNil() { + suid = "" + } + + validatedSub.UserId = suid + validatedSub.CreateTime = timestamppb.New(sub.CreateTime) + validatedSub.UpdateTime = timestamppb.New(sub.UpdateTime) + validatedSub.ProviderResponse = sub.RawResponse + validatedSub.ProviderNotification = sub.RawNotification + + validatedSubs = append(validatedSubs, &api.ValidatedSubscription{}) + } + + return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs, Persist: persist}, nil +} + +func (s *ApiServer) ValidateSubscription(ctx context.Context, in *api.ValidateSubscriptionRequest) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { + userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + + purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) + if err != nil { + s.logger.Warn("Purchase provider not found", zap.Error(err)) + return nil, status.Error(codes.Internal, "failed to get purchase provider") + } + + // Before hook. + if fn := s.runtime.BeforeValidateSubscription(); fn != nil { + beforeFn := func(clientIP, clientPort string) error { + result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + if err != nil { + return status.Error(code, err.Error()) + } + if result == nil { + // If result is nil, requested resource is disabled. + s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) + return status.Error(codes.NotFound, "Requested resource was not found.") + } + in = result + return nil + } + + // Execute the before function lambda wrapped in a trace for stats measurement. + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + if err != nil { + return nil, err + } + } + + persist := true + if in.Persist != nil { + persist = in.Persist.GetValue() + } + + validation, err := purchaseProvider.SubscriptionValidate(ctx, in, userID.String()) + if err != nil { + return nil, err + } + + // handle upsert and persist here + response, err := handleValidatedSubscriptions(ctx, s.db, validation, persist) + if err != nil { + return nil, err + } + + // After hook. + if fn := s.runtime.AfterValidateSubscription(); fn != nil { + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, response, in) + } + + // Execute the after function lambda wrapped in a trace for stats measurement. + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + } + + return response, nil +} + func (s *ApiServer) ValidateSubscriptionApple(ctx context.Context, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) diff --git a/server/core_purchase.go b/server/core_purchase.go index 00b91a1984..d3db1a2aa4 100644 --- a/server/core_purchase.go +++ b/server/core_purchase.go @@ -22,6 +22,7 @@ import ( "encoding/gob" "errors" "fmt" + "github.com/heroiclabs/nakama-common/runtime" "slices" "strconv" "time" @@ -66,7 +67,7 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, } seenTransactionIDs := make(map[string]struct{}, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) - storagePurchases := make([]*iap.StoragePurchase, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) + storagePurchases := make([]*runtime.StoragePurchase, 0, len(validation.Receipt.InApp)+len(validation.LatestReceiptInfo)) for _, purchase := range validation.Receipt.InApp { if purchase.ExpiresDateMs != "" { continue @@ -81,7 +82,7 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, } seenTransactionIDs[purchase.TransactionId] = struct{}{} - storagePurchases = append(storagePurchases, &iap.StoragePurchase{ + storagePurchases = append(storagePurchases, &runtime.StoragePurchase{ UserID: userID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: purchase.ProductID, @@ -107,7 +108,7 @@ func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, } seenTransactionIDs[purchase.TransactionId] = struct{}{} - storagePurchases = append(storagePurchases, &iap.StoragePurchase{ + storagePurchases = append(storagePurchases, &runtime.StoragePurchase{ UserID: userID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: purchase.ProductId, @@ -196,7 +197,7 @@ func ValidatePurchaseGoogle(ctx context.Context, logger *zap.Logger, db *sql.DB, return nil, status.Error(codes.FailedPrecondition, fmt.Sprintf("Invalid Receipt. State: %d", gReceipt.PurchaseState)) } - sPurchase := &iap.StoragePurchase{ + sPurchase := &runtime.StoragePurchase{ UserID: userID, Store: api.StoreProvider_GOOGLE_PLAY_STORE, ProductId: gReceipt.ProductID, @@ -222,7 +223,7 @@ func ValidatePurchaseGoogle(ctx context.Context, logger *zap.Logger, db *sql.DB, return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := iap.UpsertPurchases(ctx, db, []*iap.StoragePurchase{sPurchase}) + purchases, err := iap.UpsertPurchases(ctx, db, []*runtime.StoragePurchase{sPurchase}) if err != nil { if err != context.Canceled { logger.Error("Error storing Google receipt", zap.Error(err)) @@ -279,7 +280,7 @@ func ValidatePurchaseHuawei(ctx context.Context, logger *zap.Logger, db *sql.DB, env = api.StoreEnvironment_SANDBOX } - sPurchase := &iap.StoragePurchase{ + sPurchase := &runtime.StoragePurchase{ UserID: userID, Store: api.StoreProvider_HUAWEI_APP_GALLERY, ProductId: validation.PurchaseTokenData.ProductId, @@ -304,7 +305,7 @@ func ValidatePurchaseHuawei(ctx context.Context, logger *zap.Logger, db *sql.DB, return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := iap.UpsertPurchases(ctx, db, []*iap.StoragePurchase{sPurchase}) + purchases, err := iap.UpsertPurchases(ctx, db, []*runtime.StoragePurchase{sPurchase}) if err != nil { if err != context.Canceled { logger.Error("Error storing Huawei receipt", zap.Error(err)) @@ -346,7 +347,7 @@ func ValidatePurchaseFacebookInstant(ctx context.Context, logger *zap.Logger, db return nil, err } - sPurchase := &iap.StoragePurchase{ + sPurchase := &runtime.StoragePurchase{ UserID: userID, Store: api.StoreProvider_FACEBOOK_INSTANT_STORE, ProductId: payment.ProductId, @@ -372,7 +373,7 @@ func ValidatePurchaseFacebookInstant(ctx context.Context, logger *zap.Logger, db return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil } - purchases, err := iap.UpsertPurchases(ctx, db, []*iap.StoragePurchase{sPurchase}) + purchases, err := iap.UpsertPurchases(ctx, db, []*runtime.StoragePurchase{sPurchase}) if err != nil { if err != context.Canceled { logger.Error("Error storing Facebook Instant receipt", zap.Error(err)) diff --git a/server/core_subscription.go b/server/core_subscription.go index 2f33faed71..121c2c9f6e 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -24,6 +24,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/heroiclabs/nakama-common/runtime" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "io" @@ -305,7 +306,7 @@ func ValidateSubscriptionApple(ctx context.Context, logger *zap.Logger, db *sql. active = true } - storageSub := &iap.StorageSubscription{ + storageSub := &runtime.StorageSubscription{ UserID: userID, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: receiptInfo.ProductId, @@ -383,7 +384,7 @@ func ValidateSubscriptionGoogle(ctx context.Context, logger *zap.Logger, db *sql active = true } - storageSub := &iap.StorageSubscription{ + storageSub := &runtime.StorageSubscription{ OriginalTransactionId: gReceipt.PurchaseToken, UserID: userID, Store: api.StoreProvider_GOOGLE_PLAY_STORE, @@ -669,7 +670,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati uid = uuid.Must(uuid.FromString(s.UserId)) } - sub := &iap.StorageSubscription{ + sub := &runtime.StorageSubscription{ UserID: uid, OriginalTransactionId: signedTransactionInfo.OriginalTransactionId, Store: api.StoreProvider_APPLE_APP_STORE, @@ -743,7 +744,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati } if strings.ToUpper(notificationPayload.NotificationType) == iap.AppleNotificationTypeRefund { - purchase := &iap.StoragePurchase{ + purchase := &runtime.StoragePurchase{ UserID: uid, Store: api.StoreProvider_APPLE_APP_STORE, ProductId: signedTransactionInfo.ProductId, @@ -753,7 +754,7 @@ func appleNotificationHandler(logger *zap.Logger, db *sql.DB, purchaseNotificati Environment: env, } - dbPurchases, err := iap.UpsertPurchases(r.Context(), db, []*iap.StoragePurchase{purchase}) + dbPurchases, err := iap.UpsertPurchases(r.Context(), db, []*runtime.StoragePurchase{purchase}) if err != nil { logger.Error("Failed to store App Store notification purchase data") w.WriteHeader(http.StatusInternalServerError) @@ -920,7 +921,7 @@ func googleNotificationHandler(logger *zap.Logger, db *sql.DB, config *IAPGoogle return } - storageSub := &iap.StorageSubscription{ + storageSub := &runtime.StorageSubscription{ OriginalTransactionId: googleNotification.SubscriptionNotification.PurchaseToken, UserID: uid, Store: api.StoreProvider_GOOGLE_PLAY_STORE, diff --git a/server/google_refund_scheduler.go b/server/google_refund_scheduler.go index 55d785367c..39183f4c6b 100644 --- a/server/google_refund_scheduler.go +++ b/server/google_refund_scheduler.go @@ -24,6 +24,8 @@ import ( "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" + ncRuntime "github.com/heroiclabs/nakama-common/runtime" + "github.com/heroiclabs/nakama/v3/iap" "go.uber.org/atomic" "go.uber.org/zap" @@ -123,7 +125,7 @@ func (g *LocalGoogleRefundScheduler) Start(runtime *Runtime) { refundTime := iap.ParseMillisecondUnixTimestamp(refundTimeInt) - sPurchase := &iap.StoragePurchase{ + sPurchase := &ncRuntime.StoragePurchase{ UserID: uuid.Must(uuid.FromString(purchase.UserId)), Store: purchase.Store, ProductId: purchase.ProductId, @@ -135,7 +137,7 @@ func (g *LocalGoogleRefundScheduler) Start(runtime *Runtime) { Environment: purchase.Environment, } - dbPurchases, err := iap.UpsertPurchases(g.ctx, g.db, []*iap.StoragePurchase{sPurchase}) + dbPurchases, err := iap.UpsertPurchases(g.ctx, g.db, []*ncRuntime.StoragePurchase{sPurchase}) if err != nil { g.logger.Error("Failed to upsert Google voided purchase", zap.Error(err), zap.String("purchase_token", vr.PurchaseToken)) continue @@ -200,7 +202,7 @@ func (g *LocalGoogleRefundScheduler) Start(runtime *Runtime) { refundTime := iap.ParseMillisecondUnixTimestamp(refundTimeInt) - sSubscription := &iap.StorageSubscription{ + sSubscription := &ncRuntime.StorageSubscription{ OriginalTransactionId: subscription.OriginalTransactionId, UserID: uuid.Must(uuid.FromString(subscription.UserId)), Store: subscription.Store, diff --git a/server/runtime.go b/server/runtime.go index c13b6bbd11..29806df340 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -198,7 +198,9 @@ type ( RuntimeBeforeEventFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.Event) (*api.Event, error, codes.Code) RuntimeAfterEventFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.Event) error RuntimeBeforeValidatePurchaseFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error, codes.Code) - RuntimeAfterValidatePurchaseFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error + RuntimeAfterValidatePurchaseFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseProviderResponse, in *api.ValidatePurchaseRequest) error + RuntimeBeforeValidateSubscriptionFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionRequest) (*api.ValidateSubscriptionRequest, error, codes.Code) + RuntimeAfterValidateSubscriptionFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseProviderSubscriptionResponse, in *api.ValidateSubscriptionRequest) error RuntimeBeforeValidatePurchaseAppleFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error, codes.Code) RuntimeAfterValidatePurchaseAppleFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseAppleRequest) error RuntimeBeforeValidateSubscriptionAppleFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) @@ -430,6 +432,7 @@ type RuntimeBeforeReqFunctions struct { beforeGetUsersFunction RuntimeBeforeGetUsersFunction beforeEventFunction RuntimeBeforeEventFunction beforeValidatePurchaseFunction RuntimeBeforeValidatePurchaseFunction + beforeValidateSubscriptionFunction RuntimeBeforeValidateSubscriptionFunction beforeValidatePurchaseAppleFunction RuntimeBeforeValidatePurchaseAppleFunction beforeValidateSubscriptionAppleFunction RuntimeBeforeValidateSubscriptionAppleFunction beforeValidatePurchaseGoogleFunction RuntimeBeforeValidatePurchaseGoogleFunction @@ -515,6 +518,7 @@ type RuntimeAfterReqFunctions struct { afterGetUsersFunction RuntimeAfterGetUsersFunction afterEventFunction RuntimeAfterEventFunction afterValidatePurchaseFunction RuntimeAfterValidatePurchaseFunction + afterValidateSubscriptionFunction RuntimeAfterValidateSubscriptionFunction afterValidatePurchaseAppleFunction RuntimeAfterValidatePurchaseAppleFunction afterValidateSubscriptionAppleFunction RuntimeAfterValidateSubscriptionAppleFunction afterValidatePurchaseGoogleFunction RuntimeAfterValidatePurchaseGoogleFunction @@ -1005,6 +1009,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if allBeforeReqFunctions.beforeValidateSubscriptionFunction != nil { + startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscription")) + } if allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -1326,6 +1333,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = luaBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if luaBeforeReqFns.beforeValidateSubscriptionFunction != nil { + allBeforeReqFunctions.beforeValidateSubscriptionFunction = luaBeforeReqFns.beforeValidateSubscriptionFunction + startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatesubscription")) + } if luaBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = luaBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1652,6 +1663,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = goBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if goBeforeReqFns.beforeValidateSubscriptionFunction != nil { + allBeforeReqFunctions.beforeValidateSubscriptionFunction = goBeforeReqFns.beforeValidateSubscriptionFunction + startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscription")) + } if goBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = goBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1903,6 +1918,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction != nil { startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if allAfterReqFunctions.afterValidateSubscriptionFunction != nil { + startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscription")) + } if allAfterReqFunctions.afterValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -2220,6 +2238,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = luaAfterReqFns.afterValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if luaAfterReqFns.afterValidateSubscriptionFunction != nil { + allAfterReqFunctions.afterValidateSubscriptionFunction = luaAfterReqFns.afterValidateSubscriptionFunction + startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatesubscription")) + } if luaAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = luaAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2546,6 +2568,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = goAfterReqFns.afterValidatePurchaseFacebookInstantFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) } + if goAfterReqFns.afterValidateSubscriptionFunction != nil { + allAfterReqFunctions.afterValidateSubscriptionFunction = goAfterReqFns.afterValidateSubscriptionFunction + startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscription")) + } if goAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = goAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -3422,6 +3448,14 @@ func (r *Runtime) AfterValidatePurchase() RuntimeAfterValidatePurchaseFunction { return r.afterReqFunctions.afterValidatePurchaseFunction } +func (r *Runtime) BeforeValidateSubscription() RuntimeBeforeValidateSubscriptionFunction { + return r.beforeReqFunctions.beforeValidateSubscriptionFunction +} + +func (r *Runtime) AfterValidateSubscription() RuntimeAfterValidateSubscriptionFunction { + return r.afterReqFunctions.afterValidateSubscriptionFunction +} + func (r *Runtime) BeforeValidatePurchaseApple() RuntimeBeforeValidatePurchaseAppleFunction { return r.beforeReqFunctions.beforeValidatePurchaseAppleFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index 3f98e5156d..1479cd9cfa 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -2374,8 +2374,8 @@ func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchase(fn func(ctx conte return nil } -func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchase(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error) error { - ri.afterReq.afterValidatePurchaseFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error { +func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchase(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseProviderResponse, in *api.ValidatePurchaseRequest) error) error { + ri.afterReq.afterValidatePurchaseFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseProviderResponse, in *api.ValidatePurchaseRequest) error { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") loggerFields := map[string]interface{}{"api_id": "validatepurchase", "mode": RuntimeExecutionModeAfter.String()} return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) @@ -2383,6 +2383,37 @@ func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchase(fn func(ctx contex return nil } +func (ri *RuntimeGoInitializer) RegisterBeforeValidateSubscription(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidateSubscriptionRequest) (*api.ValidateSubscriptionRequest, error)) error { + ri.beforeReq.beforeValidateSubscriptionFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionRequest) (*api.ValidateSubscriptionRequest, error, codes.Code) { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatesubscription", "mode": RuntimeExecutionModeBefore.String()} + result, fnErr := fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, in) + if fnErr != nil { + var runtimeErr *runtime.Error + if errors.As(fnErr, &runtimeErr) { + if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { + // If error is present but code is invalid then default to 13 (Internal) as the error code. + return result, runtimeErr, codes.Internal + } + return result, runtimeErr, codes.Code(runtimeErr.Code) + } + // Not a runtime error that contains a code. + return result, fnErr, codes.Internal + } + return result, nil, codes.OK + } + return nil +} + +func (ri *RuntimeGoInitializer) RegisterAfterValidateSubscription(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseProviderSubscriptionResponse, in *api.ValidateSubscriptionRequest) error) error { + ri.afterReq.afterValidateSubscriptionFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseProviderSubscriptionResponse, in *api.ValidateSubscriptionRequest) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatesubscription", "mode": RuntimeExecutionModeAfter.String()} + return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) + } + return nil +} + func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchaseApple(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error)) error { ri.beforeReq.beforeValidatePurchaseAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") @@ -2831,6 +2862,13 @@ func (ri *RuntimeGoInitializer) RegisterFleetManager(fleetManager runtime.FleetM } func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purchaseProvider runtime.PurchaseProvider) error { + platformEnum := iap.FromString(platform) + if platformEnum == iap.Unknown { + ri.logger.Error("platform %v is not valid", platform) + + return errors.New("platform unknown") + } + _, exists := ri.purchaseProviders[platform] if exists { @@ -2848,12 +2886,27 @@ func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purcha ri.purchaseProviders[platform] = purchaseProvider nk.purchaseProviders[platform] = purchaseProvider + + ri.logger.Info("Purchase provider %v registered", purchaseProvider.GetProviderString()) } return nil } func (ri *RuntimeGoInitializer) RegisterRefundHandler(platform string, purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) error { + platformEnum := iap.FromString(platform) + if platformEnum == iap.Unknown { + ri.logger.Error("platform %v is not valid", platform) + + return errors.New("platform unknown") + } + + _, exists := ri.refundFns[platform] + + if exists { + return errors.New("platform already registered") + } + if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { if ri.refundFns == nil { ri.refundFns = make(map[string]runtime.RefundFns) diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index 82e3694d15..c98d47e217 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -7282,6 +7282,66 @@ func (x *ValidatePurchaseRequest) GetPersist() *wrapperspb.BoolValue { return nil } +type ValidateSubscriptionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` + Receipt string `protobuf:"bytes,2,opt,name=receipt,proto3" json:"receipt,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidateSubscriptionRequest) Reset() { + *x = ValidateSubscriptionRequest{} + mi := &file_api_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidateSubscriptionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateSubscriptionRequest) ProtoMessage() {} + +func (x *ValidateSubscriptionRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[98] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateSubscriptionRequest.ProtoReflect.Descriptor instead. +func (*ValidateSubscriptionRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{98} +} + +func (x *ValidateSubscriptionRequest) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +func (x *ValidateSubscriptionRequest) GetReceipt() string { + if x != nil { + return x.Receipt + } + return "" +} + +func (x *ValidateSubscriptionRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + // Apple IAP Purchases validation request type ValidatePurchaseAppleRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -7295,7 +7355,7 @@ type ValidatePurchaseAppleRequest struct { func (x *ValidatePurchaseAppleRequest) Reset() { *x = ValidatePurchaseAppleRequest{} - mi := &file_api_proto_msgTypes[98] + mi := &file_api_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7307,7 +7367,7 @@ func (x *ValidatePurchaseAppleRequest) String() string { func (*ValidatePurchaseAppleRequest) ProtoMessage() {} func (x *ValidatePurchaseAppleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[98] + mi := &file_api_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7320,7 +7380,7 @@ func (x *ValidatePurchaseAppleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseAppleRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseAppleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{98} + return file_api_proto_rawDescGZIP(), []int{99} } func (x *ValidatePurchaseAppleRequest) GetReceipt() string { @@ -7350,7 +7410,7 @@ type ValidateSubscriptionAppleRequest struct { func (x *ValidateSubscriptionAppleRequest) Reset() { *x = ValidateSubscriptionAppleRequest{} - mi := &file_api_proto_msgTypes[99] + mi := &file_api_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7362,7 +7422,7 @@ func (x *ValidateSubscriptionAppleRequest) String() string { func (*ValidateSubscriptionAppleRequest) ProtoMessage() {} func (x *ValidateSubscriptionAppleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[99] + mi := &file_api_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7375,7 +7435,7 @@ func (x *ValidateSubscriptionAppleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionAppleRequest.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionAppleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{99} + return file_api_proto_rawDescGZIP(), []int{100} } func (x *ValidateSubscriptionAppleRequest) GetReceipt() string { @@ -7405,7 +7465,7 @@ type ValidatePurchaseGoogleRequest struct { func (x *ValidatePurchaseGoogleRequest) Reset() { *x = ValidatePurchaseGoogleRequest{} - mi := &file_api_proto_msgTypes[100] + mi := &file_api_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7417,7 +7477,7 @@ func (x *ValidatePurchaseGoogleRequest) String() string { func (*ValidatePurchaseGoogleRequest) ProtoMessage() {} func (x *ValidatePurchaseGoogleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[100] + mi := &file_api_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7430,7 +7490,7 @@ func (x *ValidatePurchaseGoogleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseGoogleRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseGoogleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{100} + return file_api_proto_rawDescGZIP(), []int{101} } func (x *ValidatePurchaseGoogleRequest) GetPurchase() string { @@ -7460,7 +7520,7 @@ type ValidateSubscriptionGoogleRequest struct { func (x *ValidateSubscriptionGoogleRequest) Reset() { *x = ValidateSubscriptionGoogleRequest{} - mi := &file_api_proto_msgTypes[101] + mi := &file_api_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7472,7 +7532,7 @@ func (x *ValidateSubscriptionGoogleRequest) String() string { func (*ValidateSubscriptionGoogleRequest) ProtoMessage() {} func (x *ValidateSubscriptionGoogleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[101] + mi := &file_api_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7485,7 +7545,7 @@ func (x *ValidateSubscriptionGoogleRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ValidateSubscriptionGoogleRequest.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionGoogleRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{101} + return file_api_proto_rawDescGZIP(), []int{102} } func (x *ValidateSubscriptionGoogleRequest) GetReceipt() string { @@ -7517,7 +7577,7 @@ type ValidatePurchaseHuaweiRequest struct { func (x *ValidatePurchaseHuaweiRequest) Reset() { *x = ValidatePurchaseHuaweiRequest{} - mi := &file_api_proto_msgTypes[102] + mi := &file_api_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7529,7 +7589,7 @@ func (x *ValidatePurchaseHuaweiRequest) String() string { func (*ValidatePurchaseHuaweiRequest) ProtoMessage() {} func (x *ValidatePurchaseHuaweiRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[102] + mi := &file_api_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7542,7 +7602,7 @@ func (x *ValidatePurchaseHuaweiRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseHuaweiRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseHuaweiRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{102} + return file_api_proto_rawDescGZIP(), []int{103} } func (x *ValidatePurchaseHuaweiRequest) GetPurchase() string { @@ -7579,7 +7639,7 @@ type ValidatePurchaseFacebookInstantRequest struct { func (x *ValidatePurchaseFacebookInstantRequest) Reset() { *x = ValidatePurchaseFacebookInstantRequest{} - mi := &file_api_proto_msgTypes[103] + mi := &file_api_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7591,7 +7651,7 @@ func (x *ValidatePurchaseFacebookInstantRequest) String() string { func (*ValidatePurchaseFacebookInstantRequest) ProtoMessage() {} func (x *ValidatePurchaseFacebookInstantRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[103] + mi := &file_api_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7604,7 +7664,7 @@ func (x *ValidatePurchaseFacebookInstantRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use ValidatePurchaseFacebookInstantRequest.ProtoReflect.Descriptor instead. func (*ValidatePurchaseFacebookInstantRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{103} + return file_api_proto_rawDescGZIP(), []int{104} } func (x *ValidatePurchaseFacebookInstantRequest) GetSignedRequest() string { @@ -7652,7 +7712,7 @@ type ValidatedPurchase struct { func (x *ValidatedPurchase) Reset() { *x = ValidatedPurchase{} - mi := &file_api_proto_msgTypes[104] + mi := &file_api_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7664,7 +7724,7 @@ func (x *ValidatedPurchase) String() string { func (*ValidatedPurchase) ProtoMessage() {} func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[104] + mi := &file_api_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7677,7 +7737,7 @@ func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedPurchase.ProtoReflect.Descriptor instead. func (*ValidatedPurchase) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{104} + return file_api_proto_rawDescGZIP(), []int{105} } func (x *ValidatedPurchase) GetUserId() string { @@ -7757,6 +7817,132 @@ func (x *ValidatedPurchase) GetSeenBefore() bool { return false } +type PurchaseProviderValidatedPurchase struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Purchase User ID. + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // Purchase Product ID. + ProductId string `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` + // Purchase Transaction ID. + TransactionId string `protobuf:"bytes,3,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + // Store identifier + Store StoreProvider `protobuf:"varint,4,opt,name=store,proto3,enum=nakama.api.StoreProvider" json:"store,omitempty"` + // Timestamp when the purchase was done. + PurchaseTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=purchase_time,json=purchaseTime,proto3" json:"purchase_time,omitempty"` + // Timestamp when the receipt validation was stored in DB. + CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // Timestamp when the receipt validation was updated in DB. + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + // Timestamp when the purchase was refunded. Set to UNIX + RefundTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=refund_time,json=refundTime,proto3" json:"refund_time,omitempty"` + // Raw provider validation response. + ProviderResponse string `protobuf:"bytes,9,opt,name=provider_response,json=providerResponse,proto3" json:"provider_response,omitempty"` + // Whether the purchase was done in production or sandbox environment. + Environment StoreEnvironment `protobuf:"varint,10,opt,name=environment,proto3,enum=nakama.api.StoreEnvironment" json:"environment,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PurchaseProviderValidatedPurchase) Reset() { + *x = PurchaseProviderValidatedPurchase{} + mi := &file_api_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PurchaseProviderValidatedPurchase) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PurchaseProviderValidatedPurchase) ProtoMessage() {} + +func (x *PurchaseProviderValidatedPurchase) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[106] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PurchaseProviderValidatedPurchase.ProtoReflect.Descriptor instead. +func (*PurchaseProviderValidatedPurchase) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{106} +} + +func (x *PurchaseProviderValidatedPurchase) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *PurchaseProviderValidatedPurchase) GetProductId() string { + if x != nil { + return x.ProductId + } + return "" +} + +func (x *PurchaseProviderValidatedPurchase) GetTransactionId() string { + if x != nil { + return x.TransactionId + } + return "" +} + +func (x *PurchaseProviderValidatedPurchase) GetStore() StoreProvider { + if x != nil { + return x.Store + } + return StoreProvider_APPLE_APP_STORE +} + +func (x *PurchaseProviderValidatedPurchase) GetPurchaseTime() *timestamppb.Timestamp { + if x != nil { + return x.PurchaseTime + } + return nil +} + +func (x *PurchaseProviderValidatedPurchase) GetCreateTime() *timestamppb.Timestamp { + if x != nil { + return x.CreateTime + } + return nil +} + +func (x *PurchaseProviderValidatedPurchase) GetUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.UpdateTime + } + return nil +} + +func (x *PurchaseProviderValidatedPurchase) GetRefundTime() *timestamppb.Timestamp { + if x != nil { + return x.RefundTime + } + return nil +} + +func (x *PurchaseProviderValidatedPurchase) GetProviderResponse() string { + if x != nil { + return x.ProviderResponse + } + return "" +} + +func (x *PurchaseProviderValidatedPurchase) GetEnvironment() StoreEnvironment { + if x != nil { + return x.Environment + } + return StoreEnvironment_UNKNOWN +} + // Validate IAP response. type ValidatePurchaseResponse struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -7768,7 +7954,7 @@ type ValidatePurchaseResponse struct { func (x *ValidatePurchaseResponse) Reset() { *x = ValidatePurchaseResponse{} - mi := &file_api_proto_msgTypes[105] + mi := &file_api_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7780,7 +7966,7 @@ func (x *ValidatePurchaseResponse) String() string { func (*ValidatePurchaseResponse) ProtoMessage() {} func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[105] + mi := &file_api_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7793,7 +7979,7 @@ func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseResponse.ProtoReflect.Descriptor instead. func (*ValidatePurchaseResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{105} + return file_api_proto_rawDescGZIP(), []int{107} } func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase { @@ -7803,6 +7989,58 @@ func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase return nil } +type ValidatePurchaseProviderResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ValidatedPurchases []*PurchaseProviderValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` + Persist bool `protobuf:"varint,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchaseProviderResponse) Reset() { + *x = ValidatePurchaseProviderResponse{} + mi := &file_api_proto_msgTypes[108] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseProviderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseProviderResponse) ProtoMessage() {} + +func (x *ValidatePurchaseProviderResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[108] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseProviderResponse.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseProviderResponse) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{108} +} + +func (x *ValidatePurchaseProviderResponse) GetValidatedPurchases() []*PurchaseProviderValidatedPurchase { + if x != nil { + return x.ValidatedPurchases + } + return nil +} + +func (x *ValidatePurchaseProviderResponse) GetPersist() bool { + if x != nil { + return x.Persist + } + return false +} + // Validate Subscription response. type ValidateSubscriptionResponse struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -7813,7 +8051,7 @@ type ValidateSubscriptionResponse struct { func (x *ValidateSubscriptionResponse) Reset() { *x = ValidateSubscriptionResponse{} - mi := &file_api_proto_msgTypes[106] + mi := &file_api_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7825,7 +8063,7 @@ func (x *ValidateSubscriptionResponse) String() string { func (*ValidateSubscriptionResponse) ProtoMessage() {} func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[106] + mi := &file_api_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7838,7 +8076,7 @@ func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{106} + return file_api_proto_rawDescGZIP(), []int{109} } func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubscription { @@ -7848,6 +8086,58 @@ func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubs return nil } +type ValidatePurchaseProviderSubscriptionResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ValidatedSubscription []*ValidatedSubscription `protobuf:"bytes,1,rep,name=validated_subscription,json=validatedSubscription,proto3" json:"validated_subscription,omitempty"` + Persist bool `protobuf:"varint,2,opt,name=persist,proto3" json:"persist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePurchaseProviderSubscriptionResponse) Reset() { + *x = ValidatePurchaseProviderSubscriptionResponse{} + mi := &file_api_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePurchaseProviderSubscriptionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseProviderSubscriptionResponse) ProtoMessage() {} + +func (x *ValidatePurchaseProviderSubscriptionResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[110] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseProviderSubscriptionResponse.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseProviderSubscriptionResponse) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{110} +} + +func (x *ValidatePurchaseProviderSubscriptionResponse) GetValidatedSubscription() []*ValidatedSubscription { + if x != nil { + return x.ValidatedSubscription + } + return nil +} + +func (x *ValidatePurchaseProviderSubscriptionResponse) GetPersist() bool { + if x != nil { + return x.Persist + } + return false +} + type ValidatedSubscription struct { state protoimpl.MessageState `protogen:"open.v1"` // Subscription User ID. @@ -7882,7 +8172,7 @@ type ValidatedSubscription struct { func (x *ValidatedSubscription) Reset() { *x = ValidatedSubscription{} - mi := &file_api_proto_msgTypes[107] + mi := &file_api_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7894,7 +8184,7 @@ func (x *ValidatedSubscription) String() string { func (*ValidatedSubscription) ProtoMessage() {} func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[107] + mi := &file_api_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7907,7 +8197,7 @@ func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedSubscription.ProtoReflect.Descriptor instead. func (*ValidatedSubscription) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{107} + return file_api_proto_rawDescGZIP(), []int{111} } func (x *ValidatedSubscription) GetUserId() string { @@ -8016,7 +8306,7 @@ type PurchaseList struct { func (x *PurchaseList) Reset() { *x = PurchaseList{} - mi := &file_api_proto_msgTypes[108] + mi := &file_api_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8028,7 +8318,7 @@ func (x *PurchaseList) String() string { func (*PurchaseList) ProtoMessage() {} func (x *PurchaseList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[108] + mi := &file_api_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8041,7 +8331,7 @@ func (x *PurchaseList) ProtoReflect() protoreflect.Message { // Deprecated: Use PurchaseList.ProtoReflect.Descriptor instead. func (*PurchaseList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{108} + return file_api_proto_rawDescGZIP(), []int{112} } func (x *PurchaseList) GetValidatedPurchases() []*ValidatedPurchase { @@ -8080,7 +8370,7 @@ type SubscriptionList struct { func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - mi := &file_api_proto_msgTypes[109] + mi := &file_api_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8092,7 +8382,7 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[109] + mi := &file_api_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8105,7 +8395,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{109} + return file_api_proto_rawDescGZIP(), []int{113} } func (x *SubscriptionList) GetValidatedSubscriptions() []*ValidatedSubscription { @@ -8142,7 +8432,7 @@ type WriteLeaderboardRecordRequest struct { func (x *WriteLeaderboardRecordRequest) Reset() { *x = WriteLeaderboardRecordRequest{} - mi := &file_api_proto_msgTypes[110] + mi := &file_api_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8154,7 +8444,7 @@ func (x *WriteLeaderboardRecordRequest) String() string { func (*WriteLeaderboardRecordRequest) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[110] + mi := &file_api_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8167,7 +8457,7 @@ func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteLeaderboardRecordRequest.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{110} + return file_api_proto_rawDescGZIP(), []int{114} } func (x *WriteLeaderboardRecordRequest) GetLeaderboardId() string { @@ -8205,7 +8495,7 @@ type WriteStorageObject struct { func (x *WriteStorageObject) Reset() { *x = WriteStorageObject{} - mi := &file_api_proto_msgTypes[111] + mi := &file_api_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8217,7 +8507,7 @@ func (x *WriteStorageObject) String() string { func (*WriteStorageObject) ProtoMessage() {} func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[111] + mi := &file_api_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8230,7 +8520,7 @@ func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObject.ProtoReflect.Descriptor instead. func (*WriteStorageObject) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{111} + return file_api_proto_rawDescGZIP(), []int{115} } func (x *WriteStorageObject) GetCollection() string { @@ -8286,7 +8576,7 @@ type WriteStorageObjectsRequest struct { func (x *WriteStorageObjectsRequest) Reset() { *x = WriteStorageObjectsRequest{} - mi := &file_api_proto_msgTypes[112] + mi := &file_api_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8298,7 +8588,7 @@ func (x *WriteStorageObjectsRequest) String() string { func (*WriteStorageObjectsRequest) ProtoMessage() {} func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[112] + mi := &file_api_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8311,7 +8601,7 @@ func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObjectsRequest.ProtoReflect.Descriptor instead. func (*WriteStorageObjectsRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{112} + return file_api_proto_rawDescGZIP(), []int{116} } func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { @@ -8334,7 +8624,7 @@ type WriteTournamentRecordRequest struct { func (x *WriteTournamentRecordRequest) Reset() { *x = WriteTournamentRecordRequest{} - mi := &file_api_proto_msgTypes[113] + mi := &file_api_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8346,7 +8636,7 @@ func (x *WriteTournamentRecordRequest) String() string { func (*WriteTournamentRecordRequest) ProtoMessage() {} func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[113] + mi := &file_api_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8359,7 +8649,7 @@ func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteTournamentRecordRequest.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{113} + return file_api_proto_rawDescGZIP(), []int{117} } func (x *WriteTournamentRecordRequest) GetTournamentId() string { @@ -8389,7 +8679,7 @@ type FriendsOfFriendsList_FriendOfFriend struct { func (x *FriendsOfFriendsList_FriendOfFriend) Reset() { *x = FriendsOfFriendsList_FriendOfFriend{} - mi := &file_api_proto_msgTypes[126] + mi := &file_api_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8401,7 +8691,7 @@ func (x *FriendsOfFriendsList_FriendOfFriend) String() string { func (*FriendsOfFriendsList_FriendOfFriend) ProtoMessage() {} func (x *FriendsOfFriendsList_FriendOfFriend) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[126] + mi := &file_api_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8444,7 +8734,7 @@ type GroupUserList_GroupUser struct { func (x *GroupUserList_GroupUser) Reset() { *x = GroupUserList_GroupUser{} - mi := &file_api_proto_msgTypes[127] + mi := &file_api_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8456,7 +8746,7 @@ func (x *GroupUserList_GroupUser) String() string { func (*GroupUserList_GroupUser) ProtoMessage() {} func (x *GroupUserList_GroupUser) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[127] + mi := &file_api_proto_msgTypes[131] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8499,7 +8789,7 @@ type UserGroupList_UserGroup struct { func (x *UserGroupList_UserGroup) Reset() { *x = UserGroupList_UserGroup{} - mi := &file_api_proto_msgTypes[128] + mi := &file_api_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8511,7 +8801,7 @@ func (x *UserGroupList_UserGroup) String() string { func (*UserGroupList_UserGroup) ProtoMessage() {} func (x *UserGroupList_UserGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[128] + mi := &file_api_proto_msgTypes[132] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8558,7 +8848,7 @@ type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Reset() { *x = WriteLeaderboardRecordRequest_LeaderboardRecordWrite{} - mi := &file_api_proto_msgTypes[129] + mi := &file_api_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8570,7 +8860,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[129] + mi := &file_api_proto_msgTypes[133] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8583,7 +8873,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() pr // Deprecated: Use WriteLeaderboardRecordRequest_LeaderboardRecordWrite.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{110, 0} + return file_api_proto_rawDescGZIP(), []int{114, 0} } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetScore() int64 { @@ -8631,7 +8921,7 @@ type WriteTournamentRecordRequest_TournamentRecordWrite struct { func (x *WriteTournamentRecordRequest_TournamentRecordWrite) Reset() { *x = WriteTournamentRecordRequest_TournamentRecordWrite{} - mi := &file_api_proto_msgTypes[130] + mi := &file_api_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8643,7 +8933,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { func (*WriteTournamentRecordRequest_TournamentRecordWrite) ProtoMessage() {} func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[130] + mi := &file_api_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8656,7 +8946,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() prot // Deprecated: Use WriteTournamentRecordRequest_TournamentRecordWrite.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest_TournamentRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{113, 0} + return file_api_proto_rawDescGZIP(), []int{117, 0} } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetScore() int64 { @@ -9294,7 +9584,11 @@ const file_api_proto_rawDesc = "" + "\x0esigned_request\x18\x03 \x01(\tR\rsignedRequest\x12\x1c\n" + "\tsignature\x18\x04 \x01(\tR\tsignature\x12\x1a\n" + "\bplatform\x18\x05 \x01(\tR\bplatform\x124\n" + - "\apersist\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"n\n" + + "\apersist\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x89\x01\n" + + "\x1bValidateSubscriptionRequest\x12\x1a\n" + + "\bplatform\x18\x01 \x01(\tR\bplatform\x12\x18\n" + + "\areceipt\x18\x02 \x01(\tR\areceipt\x124\n" + + "\apersist\x18\x03 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"n\n" + "\x1cValidatePurchaseAppleRequest\x12\x18\n" + "\areceipt\x18\x01 \x01(\tR\areceipt\x124\n" + "\apersist\x18\x02 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"r\n" + @@ -9331,11 +9625,33 @@ const file_api_proto_rawDesc = "" + "\venvironment\x18\n" + " \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\x12\x1f\n" + "\vseen_before\x18\v \x01(\bR\n" + - "seenBefore\"j\n" + + "seenBefore\"\x98\x04\n" + + "!PurchaseProviderValidatedPurchase\x12\x17\n" + + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + + "\n" + + "product_id\x18\x02 \x01(\tR\tproductId\x12%\n" + + "\x0etransaction_id\x18\x03 \x01(\tR\rtransactionId\x12/\n" + + "\x05store\x18\x04 \x01(\x0e2\x19.nakama.api.StoreProviderR\x05store\x12?\n" + + "\rpurchase_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\fpurchaseTime\x12;\n" + + "\vcreate_time\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12;\n" + + "\vupdate_time\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "updateTime\x12;\n" + + "\vrefund_time\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "refundTime\x12+\n" + + "\x11provider_response\x18\t \x01(\tR\x10providerResponse\x12>\n" + + "\venvironment\x18\n" + + " \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\"j\n" + "\x18ValidatePurchaseResponse\x12N\n" + - "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\"x\n" + + "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\"\x9c\x01\n" + + " ValidatePurchaseProviderResponse\x12^\n" + + "\x13validated_purchases\x18\x01 \x03(\v2-.nakama.api.PurchaseProviderValidatedPurchaseR\x12validatedPurchases\x12\x18\n" + + "\apersist\x18\x02 \x01(\bR\apersist\"x\n" + "\x1cValidateSubscriptionResponse\x12X\n" + - "\x16validated_subscription\x18\x01 \x01(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\xa7\x05\n" + + "\x16validated_subscription\x18\x01 \x01(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\xa2\x01\n" + + ",ValidatePurchaseProviderSubscriptionResponse\x12X\n" + + "\x16validated_subscription\x18\x01 \x03(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\x12\x18\n" + + "\apersist\x18\x02 \x01(\bR\apersist\"\xa7\x05\n" + "\x15ValidatedSubscription\x12\x17\n" + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + "\n" + @@ -9431,336 +9747,349 @@ func file_api_proto_rawDescGZIP() []byte { } var file_api_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 131) +var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 135) var file_api_proto_goTypes = []any{ - (StoreProvider)(0), // 0: nakama.api.StoreProvider - (StoreEnvironment)(0), // 1: nakama.api.StoreEnvironment - (Operator)(0), // 2: nakama.api.Operator - (Friend_State)(0), // 3: nakama.api.Friend.State - (GroupUserList_GroupUser_State)(0), // 4: nakama.api.GroupUserList.GroupUser.State - (UserGroupList_UserGroup_State)(0), // 5: nakama.api.UserGroupList.UserGroup.State - (*Account)(nil), // 6: nakama.api.Account - (*AccountRefresh)(nil), // 7: nakama.api.AccountRefresh - (*AccountApple)(nil), // 8: nakama.api.AccountApple - (*AccountCustom)(nil), // 9: nakama.api.AccountCustom - (*AccountDevice)(nil), // 10: nakama.api.AccountDevice - (*AccountEmail)(nil), // 11: nakama.api.AccountEmail - (*AccountFacebook)(nil), // 12: nakama.api.AccountFacebook - (*AccountFacebookInstantGame)(nil), // 13: nakama.api.AccountFacebookInstantGame - (*AccountGameCenter)(nil), // 14: nakama.api.AccountGameCenter - (*AccountGoogle)(nil), // 15: nakama.api.AccountGoogle - (*AccountSteam)(nil), // 16: nakama.api.AccountSteam - (*AddFriendsRequest)(nil), // 17: nakama.api.AddFriendsRequest - (*AddGroupUsersRequest)(nil), // 18: nakama.api.AddGroupUsersRequest - (*SessionRefreshRequest)(nil), // 19: nakama.api.SessionRefreshRequest - (*SessionLogoutRequest)(nil), // 20: nakama.api.SessionLogoutRequest - (*AuthenticateAppleRequest)(nil), // 21: nakama.api.AuthenticateAppleRequest - (*AuthenticateCustomRequest)(nil), // 22: nakama.api.AuthenticateCustomRequest - (*AuthenticateDeviceRequest)(nil), // 23: nakama.api.AuthenticateDeviceRequest - (*AuthenticateEmailRequest)(nil), // 24: nakama.api.AuthenticateEmailRequest - (*AuthenticateFacebookRequest)(nil), // 25: nakama.api.AuthenticateFacebookRequest - (*AuthenticateFacebookInstantGameRequest)(nil), // 26: nakama.api.AuthenticateFacebookInstantGameRequest - (*AuthenticateGameCenterRequest)(nil), // 27: nakama.api.AuthenticateGameCenterRequest - (*AuthenticateGoogleRequest)(nil), // 28: nakama.api.AuthenticateGoogleRequest - (*AuthenticateSteamRequest)(nil), // 29: nakama.api.AuthenticateSteamRequest - (*BanGroupUsersRequest)(nil), // 30: nakama.api.BanGroupUsersRequest - (*BlockFriendsRequest)(nil), // 31: nakama.api.BlockFriendsRequest - (*ChannelMessage)(nil), // 32: nakama.api.ChannelMessage - (*ChannelMessageList)(nil), // 33: nakama.api.ChannelMessageList - (*CreateGroupRequest)(nil), // 34: nakama.api.CreateGroupRequest - (*DeleteFriendsRequest)(nil), // 35: nakama.api.DeleteFriendsRequest - (*DeleteGroupRequest)(nil), // 36: nakama.api.DeleteGroupRequest - (*DeleteLeaderboardRecordRequest)(nil), // 37: nakama.api.DeleteLeaderboardRecordRequest - (*DeleteNotificationsRequest)(nil), // 38: nakama.api.DeleteNotificationsRequest - (*DeleteTournamentRecordRequest)(nil), // 39: nakama.api.DeleteTournamentRecordRequest - (*DeleteStorageObjectId)(nil), // 40: nakama.api.DeleteStorageObjectId - (*DeleteStorageObjectsRequest)(nil), // 41: nakama.api.DeleteStorageObjectsRequest - (*Event)(nil), // 42: nakama.api.Event - (*Friend)(nil), // 43: nakama.api.Friend - (*FriendList)(nil), // 44: nakama.api.FriendList - (*FriendsOfFriendsList)(nil), // 45: nakama.api.FriendsOfFriendsList - (*GetUsersRequest)(nil), // 46: nakama.api.GetUsersRequest - (*GetSubscriptionRequest)(nil), // 47: nakama.api.GetSubscriptionRequest - (*Group)(nil), // 48: nakama.api.Group - (*GroupList)(nil), // 49: nakama.api.GroupList - (*GroupUserList)(nil), // 50: nakama.api.GroupUserList - (*ImportFacebookFriendsRequest)(nil), // 51: nakama.api.ImportFacebookFriendsRequest - (*ImportSteamFriendsRequest)(nil), // 52: nakama.api.ImportSteamFriendsRequest - (*JoinGroupRequest)(nil), // 53: nakama.api.JoinGroupRequest - (*JoinTournamentRequest)(nil), // 54: nakama.api.JoinTournamentRequest - (*KickGroupUsersRequest)(nil), // 55: nakama.api.KickGroupUsersRequest - (*Leaderboard)(nil), // 56: nakama.api.Leaderboard - (*LeaderboardList)(nil), // 57: nakama.api.LeaderboardList - (*LeaderboardRecord)(nil), // 58: nakama.api.LeaderboardRecord - (*LeaderboardRecordList)(nil), // 59: nakama.api.LeaderboardRecordList - (*LeaveGroupRequest)(nil), // 60: nakama.api.LeaveGroupRequest - (*LinkFacebookRequest)(nil), // 61: nakama.api.LinkFacebookRequest - (*LinkSteamRequest)(nil), // 62: nakama.api.LinkSteamRequest - (*ListChannelMessagesRequest)(nil), // 63: nakama.api.ListChannelMessagesRequest - (*ListFriendsRequest)(nil), // 64: nakama.api.ListFriendsRequest - (*ListFriendsOfFriendsRequest)(nil), // 65: nakama.api.ListFriendsOfFriendsRequest - (*ListGroupsRequest)(nil), // 66: nakama.api.ListGroupsRequest - (*ListGroupUsersRequest)(nil), // 67: nakama.api.ListGroupUsersRequest - (*ListLeaderboardRecordsAroundOwnerRequest)(nil), // 68: nakama.api.ListLeaderboardRecordsAroundOwnerRequest - (*ListLeaderboardRecordsRequest)(nil), // 69: nakama.api.ListLeaderboardRecordsRequest - (*ListMatchesRequest)(nil), // 70: nakama.api.ListMatchesRequest - (*ListNotificationsRequest)(nil), // 71: nakama.api.ListNotificationsRequest - (*ListStorageObjectsRequest)(nil), // 72: nakama.api.ListStorageObjectsRequest - (*ListSubscriptionsRequest)(nil), // 73: nakama.api.ListSubscriptionsRequest - (*ListTournamentRecordsAroundOwnerRequest)(nil), // 74: nakama.api.ListTournamentRecordsAroundOwnerRequest - (*ListTournamentRecordsRequest)(nil), // 75: nakama.api.ListTournamentRecordsRequest - (*ListTournamentsRequest)(nil), // 76: nakama.api.ListTournamentsRequest - (*ListUserGroupsRequest)(nil), // 77: nakama.api.ListUserGroupsRequest - (*Match)(nil), // 78: nakama.api.Match - (*MatchList)(nil), // 79: nakama.api.MatchList - (*MatchmakerCompletionStats)(nil), // 80: nakama.api.MatchmakerCompletionStats - (*MatchmakerStats)(nil), // 81: nakama.api.MatchmakerStats - (*Notification)(nil), // 82: nakama.api.Notification - (*NotificationList)(nil), // 83: nakama.api.NotificationList - (*PromoteGroupUsersRequest)(nil), // 84: nakama.api.PromoteGroupUsersRequest - (*DemoteGroupUsersRequest)(nil), // 85: nakama.api.DemoteGroupUsersRequest - (*ReadStorageObjectId)(nil), // 86: nakama.api.ReadStorageObjectId - (*ReadStorageObjectsRequest)(nil), // 87: nakama.api.ReadStorageObjectsRequest - (*Rpc)(nil), // 88: nakama.api.Rpc - (*Session)(nil), // 89: nakama.api.Session - (*StorageObject)(nil), // 90: nakama.api.StorageObject - (*StorageObjectAck)(nil), // 91: nakama.api.StorageObjectAck - (*StorageObjectAcks)(nil), // 92: nakama.api.StorageObjectAcks - (*StorageObjects)(nil), // 93: nakama.api.StorageObjects - (*StorageObjectList)(nil), // 94: nakama.api.StorageObjectList - (*Tournament)(nil), // 95: nakama.api.Tournament - (*TournamentList)(nil), // 96: nakama.api.TournamentList - (*TournamentRecordList)(nil), // 97: nakama.api.TournamentRecordList - (*UpdateAccountRequest)(nil), // 98: nakama.api.UpdateAccountRequest - (*UpdateGroupRequest)(nil), // 99: nakama.api.UpdateGroupRequest - (*User)(nil), // 100: nakama.api.User - (*UserGroupList)(nil), // 101: nakama.api.UserGroupList - (*Users)(nil), // 102: nakama.api.Users - (*ValidatePurchaseRequest)(nil), // 103: nakama.api.ValidatePurchaseRequest - (*ValidatePurchaseAppleRequest)(nil), // 104: nakama.api.ValidatePurchaseAppleRequest - (*ValidateSubscriptionAppleRequest)(nil), // 105: nakama.api.ValidateSubscriptionAppleRequest - (*ValidatePurchaseGoogleRequest)(nil), // 106: nakama.api.ValidatePurchaseGoogleRequest - (*ValidateSubscriptionGoogleRequest)(nil), // 107: nakama.api.ValidateSubscriptionGoogleRequest - (*ValidatePurchaseHuaweiRequest)(nil), // 108: nakama.api.ValidatePurchaseHuaweiRequest - (*ValidatePurchaseFacebookInstantRequest)(nil), // 109: nakama.api.ValidatePurchaseFacebookInstantRequest - (*ValidatedPurchase)(nil), // 110: nakama.api.ValidatedPurchase - (*ValidatePurchaseResponse)(nil), // 111: nakama.api.ValidatePurchaseResponse - (*ValidateSubscriptionResponse)(nil), // 112: nakama.api.ValidateSubscriptionResponse - (*ValidatedSubscription)(nil), // 113: nakama.api.ValidatedSubscription - (*PurchaseList)(nil), // 114: nakama.api.PurchaseList - (*SubscriptionList)(nil), // 115: nakama.api.SubscriptionList - (*WriteLeaderboardRecordRequest)(nil), // 116: nakama.api.WriteLeaderboardRecordRequest - (*WriteStorageObject)(nil), // 117: nakama.api.WriteStorageObject - (*WriteStorageObjectsRequest)(nil), // 118: nakama.api.WriteStorageObjectsRequest - (*WriteTournamentRecordRequest)(nil), // 119: nakama.api.WriteTournamentRecordRequest - nil, // 120: nakama.api.AccountRefresh.VarsEntry - nil, // 121: nakama.api.AccountApple.VarsEntry - nil, // 122: nakama.api.AccountCustom.VarsEntry - nil, // 123: nakama.api.AccountDevice.VarsEntry - nil, // 124: nakama.api.AccountEmail.VarsEntry - nil, // 125: nakama.api.AccountFacebook.VarsEntry - nil, // 126: nakama.api.AccountFacebookInstantGame.VarsEntry - nil, // 127: nakama.api.AccountGameCenter.VarsEntry - nil, // 128: nakama.api.AccountGoogle.VarsEntry - nil, // 129: nakama.api.AccountSteam.VarsEntry - nil, // 130: nakama.api.SessionRefreshRequest.VarsEntry - nil, // 131: nakama.api.Event.PropertiesEntry - (*FriendsOfFriendsList_FriendOfFriend)(nil), // 132: nakama.api.FriendsOfFriendsList.FriendOfFriend - (*GroupUserList_GroupUser)(nil), // 133: nakama.api.GroupUserList.GroupUser - (*UserGroupList_UserGroup)(nil), // 134: nakama.api.UserGroupList.UserGroup - (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 135: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 136: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - (*timestamppb.Timestamp)(nil), // 137: google.protobuf.Timestamp - (*wrapperspb.BoolValue)(nil), // 138: google.protobuf.BoolValue - (*wrapperspb.Int32Value)(nil), // 139: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 140: google.protobuf.StringValue - (*wrapperspb.UInt32Value)(nil), // 141: google.protobuf.UInt32Value - (*wrapperspb.Int64Value)(nil), // 142: google.protobuf.Int64Value + (StoreProvider)(0), // 0: nakama.api.StoreProvider + (StoreEnvironment)(0), // 1: nakama.api.StoreEnvironment + (Operator)(0), // 2: nakama.api.Operator + (Friend_State)(0), // 3: nakama.api.Friend.State + (GroupUserList_GroupUser_State)(0), // 4: nakama.api.GroupUserList.GroupUser.State + (UserGroupList_UserGroup_State)(0), // 5: nakama.api.UserGroupList.UserGroup.State + (*Account)(nil), // 6: nakama.api.Account + (*AccountRefresh)(nil), // 7: nakama.api.AccountRefresh + (*AccountApple)(nil), // 8: nakama.api.AccountApple + (*AccountCustom)(nil), // 9: nakama.api.AccountCustom + (*AccountDevice)(nil), // 10: nakama.api.AccountDevice + (*AccountEmail)(nil), // 11: nakama.api.AccountEmail + (*AccountFacebook)(nil), // 12: nakama.api.AccountFacebook + (*AccountFacebookInstantGame)(nil), // 13: nakama.api.AccountFacebookInstantGame + (*AccountGameCenter)(nil), // 14: nakama.api.AccountGameCenter + (*AccountGoogle)(nil), // 15: nakama.api.AccountGoogle + (*AccountSteam)(nil), // 16: nakama.api.AccountSteam + (*AddFriendsRequest)(nil), // 17: nakama.api.AddFriendsRequest + (*AddGroupUsersRequest)(nil), // 18: nakama.api.AddGroupUsersRequest + (*SessionRefreshRequest)(nil), // 19: nakama.api.SessionRefreshRequest + (*SessionLogoutRequest)(nil), // 20: nakama.api.SessionLogoutRequest + (*AuthenticateAppleRequest)(nil), // 21: nakama.api.AuthenticateAppleRequest + (*AuthenticateCustomRequest)(nil), // 22: nakama.api.AuthenticateCustomRequest + (*AuthenticateDeviceRequest)(nil), // 23: nakama.api.AuthenticateDeviceRequest + (*AuthenticateEmailRequest)(nil), // 24: nakama.api.AuthenticateEmailRequest + (*AuthenticateFacebookRequest)(nil), // 25: nakama.api.AuthenticateFacebookRequest + (*AuthenticateFacebookInstantGameRequest)(nil), // 26: nakama.api.AuthenticateFacebookInstantGameRequest + (*AuthenticateGameCenterRequest)(nil), // 27: nakama.api.AuthenticateGameCenterRequest + (*AuthenticateGoogleRequest)(nil), // 28: nakama.api.AuthenticateGoogleRequest + (*AuthenticateSteamRequest)(nil), // 29: nakama.api.AuthenticateSteamRequest + (*BanGroupUsersRequest)(nil), // 30: nakama.api.BanGroupUsersRequest + (*BlockFriendsRequest)(nil), // 31: nakama.api.BlockFriendsRequest + (*ChannelMessage)(nil), // 32: nakama.api.ChannelMessage + (*ChannelMessageList)(nil), // 33: nakama.api.ChannelMessageList + (*CreateGroupRequest)(nil), // 34: nakama.api.CreateGroupRequest + (*DeleteFriendsRequest)(nil), // 35: nakama.api.DeleteFriendsRequest + (*DeleteGroupRequest)(nil), // 36: nakama.api.DeleteGroupRequest + (*DeleteLeaderboardRecordRequest)(nil), // 37: nakama.api.DeleteLeaderboardRecordRequest + (*DeleteNotificationsRequest)(nil), // 38: nakama.api.DeleteNotificationsRequest + (*DeleteTournamentRecordRequest)(nil), // 39: nakama.api.DeleteTournamentRecordRequest + (*DeleteStorageObjectId)(nil), // 40: nakama.api.DeleteStorageObjectId + (*DeleteStorageObjectsRequest)(nil), // 41: nakama.api.DeleteStorageObjectsRequest + (*Event)(nil), // 42: nakama.api.Event + (*Friend)(nil), // 43: nakama.api.Friend + (*FriendList)(nil), // 44: nakama.api.FriendList + (*FriendsOfFriendsList)(nil), // 45: nakama.api.FriendsOfFriendsList + (*GetUsersRequest)(nil), // 46: nakama.api.GetUsersRequest + (*GetSubscriptionRequest)(nil), // 47: nakama.api.GetSubscriptionRequest + (*Group)(nil), // 48: nakama.api.Group + (*GroupList)(nil), // 49: nakama.api.GroupList + (*GroupUserList)(nil), // 50: nakama.api.GroupUserList + (*ImportFacebookFriendsRequest)(nil), // 51: nakama.api.ImportFacebookFriendsRequest + (*ImportSteamFriendsRequest)(nil), // 52: nakama.api.ImportSteamFriendsRequest + (*JoinGroupRequest)(nil), // 53: nakama.api.JoinGroupRequest + (*JoinTournamentRequest)(nil), // 54: nakama.api.JoinTournamentRequest + (*KickGroupUsersRequest)(nil), // 55: nakama.api.KickGroupUsersRequest + (*Leaderboard)(nil), // 56: nakama.api.Leaderboard + (*LeaderboardList)(nil), // 57: nakama.api.LeaderboardList + (*LeaderboardRecord)(nil), // 58: nakama.api.LeaderboardRecord + (*LeaderboardRecordList)(nil), // 59: nakama.api.LeaderboardRecordList + (*LeaveGroupRequest)(nil), // 60: nakama.api.LeaveGroupRequest + (*LinkFacebookRequest)(nil), // 61: nakama.api.LinkFacebookRequest + (*LinkSteamRequest)(nil), // 62: nakama.api.LinkSteamRequest + (*ListChannelMessagesRequest)(nil), // 63: nakama.api.ListChannelMessagesRequest + (*ListFriendsRequest)(nil), // 64: nakama.api.ListFriendsRequest + (*ListFriendsOfFriendsRequest)(nil), // 65: nakama.api.ListFriendsOfFriendsRequest + (*ListGroupsRequest)(nil), // 66: nakama.api.ListGroupsRequest + (*ListGroupUsersRequest)(nil), // 67: nakama.api.ListGroupUsersRequest + (*ListLeaderboardRecordsAroundOwnerRequest)(nil), // 68: nakama.api.ListLeaderboardRecordsAroundOwnerRequest + (*ListLeaderboardRecordsRequest)(nil), // 69: nakama.api.ListLeaderboardRecordsRequest + (*ListMatchesRequest)(nil), // 70: nakama.api.ListMatchesRequest + (*ListNotificationsRequest)(nil), // 71: nakama.api.ListNotificationsRequest + (*ListStorageObjectsRequest)(nil), // 72: nakama.api.ListStorageObjectsRequest + (*ListSubscriptionsRequest)(nil), // 73: nakama.api.ListSubscriptionsRequest + (*ListTournamentRecordsAroundOwnerRequest)(nil), // 74: nakama.api.ListTournamentRecordsAroundOwnerRequest + (*ListTournamentRecordsRequest)(nil), // 75: nakama.api.ListTournamentRecordsRequest + (*ListTournamentsRequest)(nil), // 76: nakama.api.ListTournamentsRequest + (*ListUserGroupsRequest)(nil), // 77: nakama.api.ListUserGroupsRequest + (*Match)(nil), // 78: nakama.api.Match + (*MatchList)(nil), // 79: nakama.api.MatchList + (*MatchmakerCompletionStats)(nil), // 80: nakama.api.MatchmakerCompletionStats + (*MatchmakerStats)(nil), // 81: nakama.api.MatchmakerStats + (*Notification)(nil), // 82: nakama.api.Notification + (*NotificationList)(nil), // 83: nakama.api.NotificationList + (*PromoteGroupUsersRequest)(nil), // 84: nakama.api.PromoteGroupUsersRequest + (*DemoteGroupUsersRequest)(nil), // 85: nakama.api.DemoteGroupUsersRequest + (*ReadStorageObjectId)(nil), // 86: nakama.api.ReadStorageObjectId + (*ReadStorageObjectsRequest)(nil), // 87: nakama.api.ReadStorageObjectsRequest + (*Rpc)(nil), // 88: nakama.api.Rpc + (*Session)(nil), // 89: nakama.api.Session + (*StorageObject)(nil), // 90: nakama.api.StorageObject + (*StorageObjectAck)(nil), // 91: nakama.api.StorageObjectAck + (*StorageObjectAcks)(nil), // 92: nakama.api.StorageObjectAcks + (*StorageObjects)(nil), // 93: nakama.api.StorageObjects + (*StorageObjectList)(nil), // 94: nakama.api.StorageObjectList + (*Tournament)(nil), // 95: nakama.api.Tournament + (*TournamentList)(nil), // 96: nakama.api.TournamentList + (*TournamentRecordList)(nil), // 97: nakama.api.TournamentRecordList + (*UpdateAccountRequest)(nil), // 98: nakama.api.UpdateAccountRequest + (*UpdateGroupRequest)(nil), // 99: nakama.api.UpdateGroupRequest + (*User)(nil), // 100: nakama.api.User + (*UserGroupList)(nil), // 101: nakama.api.UserGroupList + (*Users)(nil), // 102: nakama.api.Users + (*ValidatePurchaseRequest)(nil), // 103: nakama.api.ValidatePurchaseRequest + (*ValidateSubscriptionRequest)(nil), // 104: nakama.api.ValidateSubscriptionRequest + (*ValidatePurchaseAppleRequest)(nil), // 105: nakama.api.ValidatePurchaseAppleRequest + (*ValidateSubscriptionAppleRequest)(nil), // 106: nakama.api.ValidateSubscriptionAppleRequest + (*ValidatePurchaseGoogleRequest)(nil), // 107: nakama.api.ValidatePurchaseGoogleRequest + (*ValidateSubscriptionGoogleRequest)(nil), // 108: nakama.api.ValidateSubscriptionGoogleRequest + (*ValidatePurchaseHuaweiRequest)(nil), // 109: nakama.api.ValidatePurchaseHuaweiRequest + (*ValidatePurchaseFacebookInstantRequest)(nil), // 110: nakama.api.ValidatePurchaseFacebookInstantRequest + (*ValidatedPurchase)(nil), // 111: nakama.api.ValidatedPurchase + (*PurchaseProviderValidatedPurchase)(nil), // 112: nakama.api.PurchaseProviderValidatedPurchase + (*ValidatePurchaseResponse)(nil), // 113: nakama.api.ValidatePurchaseResponse + (*ValidatePurchaseProviderResponse)(nil), // 114: nakama.api.ValidatePurchaseProviderResponse + (*ValidateSubscriptionResponse)(nil), // 115: nakama.api.ValidateSubscriptionResponse + (*ValidatePurchaseProviderSubscriptionResponse)(nil), // 116: nakama.api.ValidatePurchaseProviderSubscriptionResponse + (*ValidatedSubscription)(nil), // 117: nakama.api.ValidatedSubscription + (*PurchaseList)(nil), // 118: nakama.api.PurchaseList + (*SubscriptionList)(nil), // 119: nakama.api.SubscriptionList + (*WriteLeaderboardRecordRequest)(nil), // 120: nakama.api.WriteLeaderboardRecordRequest + (*WriteStorageObject)(nil), // 121: nakama.api.WriteStorageObject + (*WriteStorageObjectsRequest)(nil), // 122: nakama.api.WriteStorageObjectsRequest + (*WriteTournamentRecordRequest)(nil), // 123: nakama.api.WriteTournamentRecordRequest + nil, // 124: nakama.api.AccountRefresh.VarsEntry + nil, // 125: nakama.api.AccountApple.VarsEntry + nil, // 126: nakama.api.AccountCustom.VarsEntry + nil, // 127: nakama.api.AccountDevice.VarsEntry + nil, // 128: nakama.api.AccountEmail.VarsEntry + nil, // 129: nakama.api.AccountFacebook.VarsEntry + nil, // 130: nakama.api.AccountFacebookInstantGame.VarsEntry + nil, // 131: nakama.api.AccountGameCenter.VarsEntry + nil, // 132: nakama.api.AccountGoogle.VarsEntry + nil, // 133: nakama.api.AccountSteam.VarsEntry + nil, // 134: nakama.api.SessionRefreshRequest.VarsEntry + nil, // 135: nakama.api.Event.PropertiesEntry + (*FriendsOfFriendsList_FriendOfFriend)(nil), // 136: nakama.api.FriendsOfFriendsList.FriendOfFriend + (*GroupUserList_GroupUser)(nil), // 137: nakama.api.GroupUserList.GroupUser + (*UserGroupList_UserGroup)(nil), // 138: nakama.api.UserGroupList.UserGroup + (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 139: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 140: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + (*timestamppb.Timestamp)(nil), // 141: google.protobuf.Timestamp + (*wrapperspb.BoolValue)(nil), // 142: google.protobuf.BoolValue + (*wrapperspb.Int32Value)(nil), // 143: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 144: google.protobuf.StringValue + (*wrapperspb.UInt32Value)(nil), // 145: google.protobuf.UInt32Value + (*wrapperspb.Int64Value)(nil), // 146: google.protobuf.Int64Value } var file_api_proto_depIdxs = []int32{ 100, // 0: nakama.api.Account.user:type_name -> nakama.api.User 10, // 1: nakama.api.Account.devices:type_name -> nakama.api.AccountDevice - 137, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp - 137, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp - 120, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry - 121, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry - 122, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry - 123, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry - 124, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry - 125, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry - 126, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry - 127, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry - 128, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry - 129, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry - 130, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry + 141, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp + 141, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp + 124, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry + 125, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry + 126, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry + 127, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry + 128, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry + 129, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry + 130, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry + 131, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry + 132, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry + 133, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry + 134, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry 8, // 15: nakama.api.AuthenticateAppleRequest.account:type_name -> nakama.api.AccountApple - 138, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue + 142, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue 9, // 17: nakama.api.AuthenticateCustomRequest.account:type_name -> nakama.api.AccountCustom - 138, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue + 142, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue 10, // 19: nakama.api.AuthenticateDeviceRequest.account:type_name -> nakama.api.AccountDevice - 138, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue + 142, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue 11, // 21: nakama.api.AuthenticateEmailRequest.account:type_name -> nakama.api.AccountEmail - 138, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue + 142, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue 12, // 23: nakama.api.AuthenticateFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 138, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue - 138, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 142, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue + 142, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue 13, // 26: nakama.api.AuthenticateFacebookInstantGameRequest.account:type_name -> nakama.api.AccountFacebookInstantGame - 138, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue + 142, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue 14, // 28: nakama.api.AuthenticateGameCenterRequest.account:type_name -> nakama.api.AccountGameCenter - 138, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue + 142, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue 15, // 30: nakama.api.AuthenticateGoogleRequest.account:type_name -> nakama.api.AccountGoogle - 138, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue + 142, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue 16, // 32: nakama.api.AuthenticateSteamRequest.account:type_name -> nakama.api.AccountSteam - 138, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue - 138, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue - 139, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value - 137, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp - 137, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp - 138, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue + 142, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue + 142, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue + 143, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value + 141, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp + 141, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp + 142, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue 32, // 39: nakama.api.ChannelMessageList.messages:type_name -> nakama.api.ChannelMessage 40, // 40: nakama.api.DeleteStorageObjectsRequest.object_ids:type_name -> nakama.api.DeleteStorageObjectId - 131, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry - 137, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp + 135, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry + 141, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp 100, // 43: nakama.api.Friend.user:type_name -> nakama.api.User - 139, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value - 137, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp + 143, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value + 141, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp 43, // 46: nakama.api.FriendList.friends:type_name -> nakama.api.Friend - 132, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend - 138, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue - 137, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp - 137, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp + 136, // 47: nakama.api.FriendsOfFriendsList.friends_of_friends:type_name -> nakama.api.FriendsOfFriendsList.FriendOfFriend + 142, // 48: nakama.api.Group.open:type_name -> google.protobuf.BoolValue + 141, // 49: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp + 141, // 50: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp 48, // 51: nakama.api.GroupList.groups:type_name -> nakama.api.Group - 133, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser + 137, // 52: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser 12, // 53: nakama.api.ImportFacebookFriendsRequest.account:type_name -> nakama.api.AccountFacebook - 138, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 142, // 54: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue 16, // 55: nakama.api.ImportSteamFriendsRequest.account:type_name -> nakama.api.AccountSteam - 138, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 142, // 56: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue 2, // 57: nakama.api.Leaderboard.operator:type_name -> nakama.api.Operator - 137, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp + 141, // 58: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp 56, // 59: nakama.api.LeaderboardList.leaderboards:type_name -> nakama.api.Leaderboard - 140, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue - 137, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp - 137, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp - 137, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp + 144, // 60: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue + 141, // 61: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp + 141, // 62: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp + 141, // 63: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp 58, // 64: nakama.api.LeaderboardRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 65: nakama.api.LeaderboardRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord 12, // 66: nakama.api.LinkFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 138, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 142, // 67: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue 16, // 68: nakama.api.LinkSteamRequest.account:type_name -> nakama.api.AccountSteam - 138, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue - 139, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue - 139, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value - 139, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value - 138, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue - 139, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value - 141, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 142, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 139, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 142, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 139, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value - 138, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue - 140, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue - 139, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value - 139, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value - 140, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue - 139, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value - 141, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 142, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 139, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 142, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 141, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value - 141, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value - 141, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value - 141, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value - 139, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 139, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value - 140, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue + 142, // 69: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue + 143, // 70: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value + 142, // 71: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue + 143, // 72: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 73: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value + 143, // 74: nakama.api.ListFriendsOfFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 75: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 76: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value + 142, // 77: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue + 143, // 78: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 79: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value + 145, // 80: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 146, // 81: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 143, // 82: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 146, // 83: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 143, // 84: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value + 142, // 85: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue + 144, // 86: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue + 143, // 87: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value + 143, // 88: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value + 144, // 89: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue + 143, // 90: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 91: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 92: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value + 145, // 93: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 146, // 94: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 143, // 95: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 146, // 96: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 145, // 97: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value + 145, // 98: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value + 145, // 99: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value + 145, // 100: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value + 143, // 101: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 102: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 143, // 103: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value + 144, // 104: nakama.api.Match.label:type_name -> google.protobuf.StringValue 78, // 105: nakama.api.MatchList.matches:type_name -> nakama.api.Match - 137, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp - 137, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp - 137, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp + 141, // 106: nakama.api.MatchmakerCompletionStats.create_time:type_name -> google.protobuf.Timestamp + 141, // 107: nakama.api.MatchmakerCompletionStats.complete_time:type_name -> google.protobuf.Timestamp + 141, // 108: nakama.api.MatchmakerStats.oldest_ticket_create_time:type_name -> google.protobuf.Timestamp 80, // 109: nakama.api.MatchmakerStats.completions:type_name -> nakama.api.MatchmakerCompletionStats - 137, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp + 141, // 110: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp 82, // 111: nakama.api.NotificationList.notifications:type_name -> nakama.api.Notification 86, // 112: nakama.api.ReadStorageObjectsRequest.object_ids:type_name -> nakama.api.ReadStorageObjectId - 137, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp - 137, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp - 137, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp - 137, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp + 141, // 113: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp + 141, // 114: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp + 141, // 115: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp + 141, // 116: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp 91, // 117: nakama.api.StorageObjectAcks.acks:type_name -> nakama.api.StorageObjectAck 90, // 118: nakama.api.StorageObjects.objects:type_name -> nakama.api.StorageObject 90, // 119: nakama.api.StorageObjectList.objects:type_name -> nakama.api.StorageObject - 137, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp - 137, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp - 137, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp + 141, // 120: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp + 141, // 121: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp + 141, // 122: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp 2, // 123: nakama.api.Tournament.operator:type_name -> nakama.api.Operator 95, // 124: nakama.api.TournamentList.tournaments:type_name -> nakama.api.Tournament 58, // 125: nakama.api.TournamentRecordList.records:type_name -> nakama.api.LeaderboardRecord 58, // 126: nakama.api.TournamentRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord - 140, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue - 140, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue - 140, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue - 140, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue - 140, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue - 140, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue - 140, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue - 140, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue - 140, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue - 140, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue - 138, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue - 137, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp - 137, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp - 134, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup + 144, // 127: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue + 144, // 128: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue + 144, // 129: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue + 144, // 130: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue + 144, // 131: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue + 144, // 132: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue + 144, // 133: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue + 144, // 134: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue + 144, // 135: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue + 144, // 136: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue + 142, // 137: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue + 141, // 138: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp + 141, // 139: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp + 138, // 140: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup 100, // 141: nakama.api.Users.users:type_name -> nakama.api.User - 138, // 142: nakama.api.ValidatePurchaseRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 143: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 144: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 145: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 146: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 147: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue - 138, // 148: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue - 0, // 149: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider - 137, // 150: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp - 137, // 151: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp - 137, // 152: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp - 137, // 153: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp - 1, // 154: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment - 110, // 155: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 113, // 156: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription - 0, // 157: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider - 137, // 158: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp - 137, // 159: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp - 137, // 160: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp - 1, // 161: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment - 137, // 162: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp - 137, // 163: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp - 110, // 164: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 113, // 165: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription - 135, // 166: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - 139, // 167: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value - 139, // 168: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value - 117, // 169: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject - 136, // 170: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - 100, // 171: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User - 100, // 172: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User - 139, // 173: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value - 48, // 174: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group - 139, // 175: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value - 2, // 176: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator - 2, // 177: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator - 178, // [178:178] is the sub-list for method output_type - 178, // [178:178] is the sub-list for method input_type - 178, // [178:178] is the sub-list for extension type_name - 178, // [178:178] is the sub-list for extension extendee - 0, // [0:178] is the sub-list for field type_name + 142, // 142: nakama.api.ValidatePurchaseRequest.persist:type_name -> google.protobuf.BoolValue + 142, // 143: nakama.api.ValidateSubscriptionRequest.persist:type_name -> google.protobuf.BoolValue + 142, // 144: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue + 142, // 145: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue + 142, // 146: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 142, // 147: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 142, // 148: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue + 142, // 149: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue + 0, // 150: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider + 141, // 151: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp + 141, // 152: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp + 141, // 153: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp + 141, // 154: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp + 1, // 155: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment + 0, // 156: nakama.api.PurchaseProviderValidatedPurchase.store:type_name -> nakama.api.StoreProvider + 141, // 157: nakama.api.PurchaseProviderValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp + 141, // 158: nakama.api.PurchaseProviderValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp + 141, // 159: nakama.api.PurchaseProviderValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp + 141, // 160: nakama.api.PurchaseProviderValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp + 1, // 161: nakama.api.PurchaseProviderValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment + 111, // 162: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 112, // 163: nakama.api.ValidatePurchaseProviderResponse.validated_purchases:type_name -> nakama.api.PurchaseProviderValidatedPurchase + 117, // 164: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription + 117, // 165: nakama.api.ValidatePurchaseProviderSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription + 0, // 166: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider + 141, // 167: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp + 141, // 168: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp + 141, // 169: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp + 1, // 170: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment + 141, // 171: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp + 141, // 172: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp + 111, // 173: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 117, // 174: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription + 139, // 175: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + 143, // 176: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value + 143, // 177: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value + 121, // 178: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject + 140, // 179: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + 100, // 180: nakama.api.FriendsOfFriendsList.FriendOfFriend.user:type_name -> nakama.api.User + 100, // 181: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User + 143, // 182: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value + 48, // 183: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group + 143, // 184: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value + 2, // 185: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator + 2, // 186: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator + 187, // [187:187] is the sub-list for method output_type + 187, // [187:187] is the sub-list for method input_type + 187, // [187:187] is the sub-list for extension type_name + 187, // [187:187] is the sub-list for extension extendee + 0, // [0:187] is the sub-list for field type_name } func init() { file_api_proto_init() } @@ -9774,7 +10103,7 @@ func file_api_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_proto_rawDesc), len(file_api_proto_rawDesc)), NumEnums: 6, - NumMessages: 131, + NumMessages: 135, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index 6f41480fd6..58862e1111 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1196,6 +1196,12 @@ message ValidatePurchaseRequest { google.protobuf.BoolValue persist = 6; } +message ValidateSubscriptionRequest { + string platform = 1; + string receipt = 2; + google.protobuf.BoolValue persist = 3; +} + // Apple IAP Purchases validation request message ValidatePurchaseAppleRequest { // Base64 encoded Apple receipt data payload. @@ -1272,17 +1278,50 @@ message ValidatedPurchase { bool seen_before = 11; } +message PurchaseProviderValidatedPurchase { + // Purchase User ID. + string user_id = 1; + // Purchase Product ID. + string product_id = 2; + // Purchase Transaction ID. + string transaction_id = 3; + // Store identifier + StoreProvider store = 4; + // Timestamp when the purchase was done. + google.protobuf.Timestamp purchase_time = 5; + // Timestamp when the receipt validation was stored in DB. + google.protobuf.Timestamp create_time = 6; + // Timestamp when the receipt validation was updated in DB. + google.protobuf.Timestamp update_time = 7; + // Timestamp when the purchase was refunded. Set to UNIX + google.protobuf.Timestamp refund_time = 8; + // Raw provider validation response. + string provider_response = 9; + // Whether the purchase was done in production or sandbox environment. + StoreEnvironment environment = 10; +} + // Validate IAP response. message ValidatePurchaseResponse { // Newly seen validated purchases. repeated ValidatedPurchase validated_purchases = 1; } +message ValidatePurchaseProviderResponse { + repeated PurchaseProviderValidatedPurchase validated_purchases = 1; + bool persist = 2; +} + // Validate Subscription response. message ValidateSubscriptionResponse { ValidatedSubscription validated_subscription = 1; } +message ValidatePurchaseProviderSubscriptionResponse { + repeated ValidatedSubscription validated_subscription = 1; + bool persist = 2; +} + // Validation Provider, enum StoreProvider { // Apple App Store diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index ba10e1a665..96928f60db 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -94,6 +94,7 @@ import ( "os" "time" + "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama-common/rtapi" "google.golang.org/protobuf/types/known/timestamppb" @@ -157,6 +158,17 @@ const ( // Tick rate defined for this match. Only applicable to server authoritative multiplayer. RUNTIME_CTX_MATCH_TICK_RATE = "match_tick_rate" + + UNKNOWN_PLATFORM_STRING = "unknown" + APPLE_PLATFORM_STRING = "apple" + GOOGLE_PLATFORM_STRING = "google" + FACEBOOK_PLATFORM_STRING = "facebook" + HUAWEI_PLATFORM_STRING = "huawei" + XBOX_PLATFORM_STRING = "xbox" + PLAYSTATION_PLATFORM_STRING = "playstation" + STEAM_PLATFORM_STRING = "steam" + EPIC_PLATFORM_STRING = "epic" + DISCORD_PLATFORM_STRING = "discord" ) var ( @@ -227,6 +239,8 @@ var ( ErrDeferredBroadcastFull = errors.New("too many deferred message broadcasts per tick") ErrSatoriConfigurationInvalid = errors.New("satori configuration is invalid") + + ErrPurchaseProviderFunctionalityNotSupported = errors.New("purchase provider functionality not supported") ) const ( @@ -766,7 +780,13 @@ type Initializer interface { RegisterBeforeValidatePurchase(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error)) error // RegisterAfterValidatePurchase can be used to perform additional logic after generic validate purchase call - RegisterAfterValidatePurchase(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseRequest) error) error + RegisterAfterValidatePurchase(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseProviderResponse, in *api.ValidatePurchaseRequest) error) error + + // RegisterBeforeValidateSubscription can be used to perform additional logic before generic validate subscription call + RegisterBeforeValidateSubscription(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidateSubscriptionRequest) (*api.ValidateSubscriptionRequest, error)) error + + // RegisterAfterValidateSubscription can be used to perform additional logic after generic validate subscription call + RegisterAfterValidateSubscription(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseProviderSubscriptionResponse, in *api.ValidateSubscriptionRequest) error) error // RegisterBeforeValidatePurchaseApple can be used to perform additional logic before validating an Apple Store IAP receipt. RegisterBeforeValidatePurchaseApple(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error)) error @@ -1352,14 +1372,15 @@ type FleetManagerInitializer interface { type PurchaseProvider interface { Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) - PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, persist bool) (*api.ValidatePurchaseResponse, error) - SubscriptionValidate(ctx context.Context, userID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) + PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*StoragePurchase, error) + SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*StorageSubscription, error) HandleRefund(ctx context.Context) (http.HandlerFunc, error) - ValidateRequest(in *api.ValidatePurchaseRequest) error + GetProviderString() string } /* Satori runtime integration definitions. +Satori runtime integration definitions. */ type Satori interface { Authenticate(ctx context.Context, id string, defaultProperties, customProperties map[string]string, noSession bool, ipAddress ...string) (*Properties, error) @@ -1478,3 +1499,33 @@ type MessageUpdate struct { ReadTime int64 `json:"read_time,omitempty"` ConsumeTime int64 `json:"consume_time,omitempty"` } + +type StoragePurchase struct { + UserID uuid.UUID + Store api.StoreProvider + ProductId string + TransactionId string + RawResponse string + PurchaseTime time.Time + CreateTime time.Time // Set by upsertPurchases + UpdateTime time.Time // Set by upsertPurchases + RefundTime time.Time + Environment api.StoreEnvironment + SeenBefore bool // Set by upsertPurchases +} + +type StorageSubscription struct { + OriginalTransactionId string + UserID uuid.UUID + Store api.StoreProvider + ProductId string + PurchaseTime time.Time + CreateTime time.Time // Set by upsertSubscription + UpdateTime time.Time // Set by upsertSubscription + RefundTime time.Time + Environment api.StoreEnvironment + ExpireTime time.Time + RawResponse string + RawNotification string + Active bool +} From a5d79b0aba583d98e099b85369a449277c4714de Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Mon, 11 Aug 2025 11:50:41 +0100 Subject: [PATCH 20/28] google sub validate implemented --- iap/google.go | 64 ++++++++++++++++++++++++++++++++++++- server/api_subscription.go | 13 ++++---- server/core_subscription.go | 4 --- 3 files changed, 69 insertions(+), 12 deletions(-) diff --git a/iap/google.go b/iap/google.go index 8f010d915d..b2a5025b27 100644 --- a/iap/google.go +++ b/iap/google.go @@ -19,6 +19,7 @@ import ( "net/http" "strconv" "strings" + "time" ) type GooglePurchaseProvider struct { @@ -93,7 +94,68 @@ func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V } func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { - return nil, nil + uuidUserID, err := uuid.FromString(userID) + if err != nil { + g.logger.Error("Error parsing user ID, error: %v", err) + } + + if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { + return nil, status.Error(codes.FailedPrecondition, "Google IAP is not configured.") + } + + if len(in.Receipt) < 1 { + return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") + } + + gResponse, gReceipt, rawResponse, err := ValidateSubscriptionReceiptGoogle(ctx, Httpc, g.config.GetGoogle().GetClientEmail(), g.config.GetGoogle().GetPrivateKey(), in.Receipt) + if err != nil { + if err != context.Canceled { + var vErr *ValidationError + if errors.As(err, &vErr) { + g.logger.Error("Error validating Google receipt", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) + return nil, vErr + } else { + g.logger.Error("Error validating Google receipt", zap.Error(err)) + } + } + return nil, err + } + + purchaseEnv := api.StoreEnvironment_PRODUCTION + if gResponse.PurchaseType == 0 { + purchaseEnv = api.StoreEnvironment_SANDBOX + } + + expireTimeInt, err := strconv.ParseInt(gResponse.ExpiryTimeMillis, 10, 64) + if err != nil { + return nil, err + } + + expireTime := ParseMillisecondUnixTimestamp(expireTimeInt) + + active := false + if expireTime.After(time.Now()) { + active = true + } + + storageSub := &runtime.StorageSubscription{ + OriginalTransactionId: gReceipt.PurchaseToken, + UserID: uuidUserID, + Store: api.StoreProvider_GOOGLE_PLAY_STORE, + ProductId: gReceipt.ProductID, + PurchaseTime: ParseMillisecondUnixTimestamp(gReceipt.PurchaseTime), + Environment: purchaseEnv, + ExpireTime: expireTime, + RawResponse: string(rawResponse), + Active: active, + } + + if gResponse.LinkedPurchaseToken != "" { + // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da + storageSub.OriginalTransactionId = gResponse.LinkedPurchaseToken + } + + return []*runtime.StorageSubscription{storageSub}, nil } func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { diff --git a/server/api_subscription.go b/server/api_subscription.go index da3cad331d..9ea36210b0 100644 --- a/server/api_subscription.go +++ b/server/api_subscription.go @@ -28,8 +28,7 @@ import ( "google.golang.org/grpc/status" ) -func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscriptions []*runtime.StorageSubscription, persist bool) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { - +func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscriptions []*runtime.StorageSubscription, persist bool, logger *zap.Logger) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { if !persist { validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) for _, s := range storageSubscriptions { @@ -57,7 +56,7 @@ func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscr validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) for _, sub := range storageSubscriptions { - var validatedSub *api.ValidatedSubscription + var validatedSub api.ValidatedSubscription suid := sub.UserID.String() if sub.UserID.IsNil() { suid = "" @@ -69,7 +68,7 @@ func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscr validatedSub.ProviderResponse = sub.RawResponse validatedSub.ProviderNotification = sub.RawNotification - validatedSubs = append(validatedSubs, &api.ValidatedSubscription{}) + validatedSubs = append(validatedSubs, &validatedSub) } return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs, Persist: persist}, nil @@ -112,13 +111,13 @@ func (s *ApiServer) ValidateSubscription(ctx context.Context, in *api.ValidateSu persist = in.Persist.GetValue() } - validation, err := purchaseProvider.SubscriptionValidate(ctx, in, userID.String()) + storageSubs, err := purchaseProvider.SubscriptionValidate(ctx, in, userID.String()) if err != nil { return nil, err } // handle upsert and persist here - response, err := handleValidatedSubscriptions(ctx, s.db, validation, persist) + response, err := handleValidatedSubscriptions(ctx, s.db, storageSubs, persist, s.logger) if err != nil { return nil, err } @@ -132,7 +131,7 @@ func (s *ApiServer) ValidateSubscription(ctx context.Context, in *api.ValidateSu // Execute the after function lambda wrapped in a trace for stats measurement. traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } - + return response, nil } diff --git a/server/core_subscription.go b/server/core_subscription.go index 121c2c9f6e..ae18c84d44 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -243,10 +243,6 @@ func ListSubscriptions(ctx context.Context, logger *zap.Logger, db *sql.DB, user return &api.SubscriptionList{ValidatedSubscriptions: subscriptions, Cursor: nextCursorStr, PrevCursor: prevCursorStr}, nil } -func ValidateSubscription(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) { - -} - func ValidateSubscriptionApple(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { validation, rawResponse, err := iap.ValidateReceiptApple(ctx, iap.Httpc, receipt, password) if err != nil { From 621f2337a06b58f67014db8a8019804a5b955487 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 19 Aug 2025 11:38:51 +0100 Subject: [PATCH 21/28] GetProviderString now called platform.String() func in nakama common, generic string passed into validatePurchase func, unused comments removed, platform enum moved to nakama common, google handleRefund flow comment out and revert config file path func changes --- iap/apple.go | 4 +- iap/facebook.go | 57 ++--------------- iap/google.go | 19 +----- iap/huawei.go | 55 ++--------------- iap/iap.go | 36 ----------- server/config.go | 6 -- server/console.go | 22 +++---- server/runtime_config.go | 4 -- server/runtime_go.go | 8 +-- .../heroiclabs/nakama-common/api/api.pb.go | 34 +++-------- .../heroiclabs/nakama-common/api/api.proto | 8 +-- .../nakama-common/runtime/config.go | 1 - .../nakama-common/runtime/runtime.go | 61 +++++++++++++++---- 13 files changed, 87 insertions(+), 228 deletions(-) diff --git a/iap/apple.go b/iap/apple.go index be9bafc058..1899b232fc 100644 --- a/iap/apple.go +++ b/iap/apple.go @@ -40,9 +40,7 @@ func (a *ApplePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, } func (a *ApplePurchaseProvider) GetProviderString() string { - platform := Apple - - return platform.String() + return runtime.Apple.String() } func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { diff --git a/iap/facebook.go b/iap/facebook.go index 5c5cd8074a..986c9b93b5 100644 --- a/iap/facebook.go +++ b/iap/facebook.go @@ -29,8 +29,7 @@ func (f *FacebookPurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundF } func (f *FacebookPurchaseProvider) GetProviderString() string { - platform := Facebook - return platform.String() + return runtime.Facebook.String() } func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { @@ -38,7 +37,9 @@ func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api return nil, status.Error(codes.FailedPrecondition, "Facebook Instant IAP is not configured.") } - if len(in.SignedRequest) < 1 { + signedRequest := in.Receipt + + if len(signedRequest) < 1 { return nil, status.Error(codes.InvalidArgument, "SignedRequest cannot be empty.") } @@ -47,7 +48,7 @@ func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api f.logger.Error("Error parsing user ID, error: %v", err) } - payment, rawResponse, err := ValidateReceiptFacebookInstant(f.config.GetFacebookInstant().GetAppSecret(), in.SignedRequest) + payment, rawResponse, err := ValidateReceiptFacebookInstant(f.config.GetFacebookInstant().GetAppSecret(), signedRequest) if err != nil { if err != context.Canceled { f.logger.Error("Error validating Facebook Instant receipt", zap.Error(err)) @@ -66,54 +67,6 @@ func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api } return []*runtime.StoragePurchase{sPurchase}, nil - - //if !persist { - // validatedPurchases := []*api.PurchaseProviderValidatedPurchase{ - // { - // UserId: userID, - // ProductId: sPurchase.ProductId, - // TransactionId: sPurchase.TransactionId, - // Store: sPurchase.Store, - // PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), - // ProviderResponse: rawResponse, - // Environment: sPurchase.Environment, - // }, - // } - // - // return &api.ValidatePurchaseProviderResponse{ValidatedPurchases: validatedPurchases}, nil - //} - - //purchases, err := UpsertPurchases(ctx, f.db, []*runtime.StoragePurchase{sPurchase}) - //if err != nil { - // if err != context.Canceled { - // f.logger.Error("Error storing Facebook Instant receipt, error: %v", err) - // } - // return nil, err - //} - // - //validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(purchases)) - //for _, p := range purchases { - // suid := p.UserID.String() - // if p.UserID.IsNil() { - // suid = "" - // } - // validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ - // UserId: suid, - // ProductId: p.ProductId, - // TransactionId: p.TransactionId, - // Store: p.Store, - // PurchaseTime: timestamppb.New(p.PurchaseTime), - // CreateTime: timestamppb.New(p.CreateTime), - // UpdateTime: timestamppb.New(p.UpdateTime), - // ProviderResponse: rawResponse, - // Environment: p.Environment, - // }) - //} - // - //return &api.ValidatePurchaseProviderResponse{ - // ValidatedPurchases: validatedPurchases, - // Persist: persist, - //}, nil } func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { diff --git a/iap/google.go b/iap/google.go index b2a5025b27..afbd296112 100644 --- a/iap/google.go +++ b/iap/google.go @@ -38,8 +38,7 @@ func (g *GooglePurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, } func (g *GooglePurchaseProvider) GetProviderString() string { - platform := Google - return platform.String() + return runtime.Google.String() } func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { @@ -47,8 +46,8 @@ func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V return nil, status.Error(codes.FailedPrecondition, "Google IAP is not configured.") } - if len(in.Purchase) < 1 { - return nil, status.Error(codes.InvalidArgument, "Purchase cannot be empty.") + if len(in.Receipt) < 1 { + return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") } uuidUserID, err := uuid.FromString(userID) @@ -318,18 +317,6 @@ func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) (http.Handler }, nil } -//func (g *GooglePurchaseProvider) ValidateRequest(in *api.ValidatePurchaseRequest) error { -// if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { -// return status.Error(codes.FailedPrecondition, "Google IAP is not configured.") -// } -// -// if len(in.Purchase) < 1 { -// return status.Error(codes.InvalidArgument, "Purchase cannot be empty.") -// } -// -// return nil -//} - func NewGooglePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { purchaseProvider := &GooglePurchaseProvider{ nk: nk, diff --git a/iap/huawei.go b/iap/huawei.go index 63210898d2..f245be66e3 100644 --- a/iap/huawei.go +++ b/iap/huawei.go @@ -31,8 +31,7 @@ func (h *HuaweiPurchaseProvider) Init(purchaseRefundFn runtime.PurchaseRefundFn, } func (h *HuaweiPurchaseProvider) GetProviderString() string { - platform := Huawei - return platform.String() + return runtime.Huawei.String() } func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { @@ -42,8 +41,8 @@ func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V return nil, status.Error(codes.FailedPrecondition, "Huawei IAP is not configured.") } - if len(in.Purchase) < 1 { - return nil, status.Error(codes.InvalidArgument, "Purchase cannot be empty.") + if len(in.Receipt) < 1 { + return nil, status.Error(codes.InvalidArgument, "Receipt cannot be empty.") } if len(in.Signature) < 1 { @@ -55,7 +54,7 @@ func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V h.logger.Error("Error parsing user ID, error: %v", err) } - validation, data, raw, err := ValidateReceiptHuawei(ctx, Httpc, h.config.GetHuawei().GetPublicKey(), h.config.GetHuawei().GetClientID(), h.config.GetHuawei().GetClientSecret(), in.Purchase, in.Signature) + validation, data, raw, err := ValidateReceiptHuawei(ctx, Httpc, h.config.GetHuawei().GetPublicKey(), h.config.GetHuawei().GetClientID(), h.config.GetHuawei().GetClientSecret(), in.Receipt, in.Signature) if err != nil { if err != context.Canceled { var vErr *ValidationError @@ -88,52 +87,6 @@ func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V Environment: env, } - //if !persist { - // validatedPurchases := []*api.PurchaseProviderValidatedPurchase{ - // { - // ProductId: sPurchase.ProductId, - // TransactionId: sPurchase.TransactionId, - // Store: sPurchase.Store, - // PurchaseTime: timestamppb.New(sPurchase.PurchaseTime), - // ProviderResponse: string(raw), - // Environment: sPurchase.Environment, - // }, - // } - // return &api.ValidatePurchaseProviderResponse{ValidatedPurchases: validatedPurchases}, nil - //} - // - //purchases, err := UpsertPurchases(ctx, h.db, []*StoragePurchase{sPurchase}) - //if err != nil { - // if err != context.Canceled { - // h.logger.Error("Error storing Huawei receipt, error: %v", err) - // } - // return nil, err - //} - // - //validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(purchases)) - //for _, p := range purchases { - // suid := p.UserID.String() - // if p.UserID.IsNil() { - // suid = "" - // } - // validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ - // UserId: suid, - // ProductId: p.ProductId, - // TransactionId: p.TransactionId, - // Store: p.Store, - // PurchaseTime: timestamppb.New(p.PurchaseTime), - // CreateTime: timestamppb.New(p.CreateTime), - // UpdateTime: timestamppb.New(p.UpdateTime), - // ProviderResponse: string(raw), - // Environment: p.Environment, - // }) - //} - // - //return &api.ValidatePurchaseProviderResponse{ - // ValidatedPurchases: validatedPurchases, - // Persist: persist, - //}, nil - return []*runtime.StoragePurchase{sPurchase}, nil } diff --git a/iap/iap.go b/iap/iap.go index a660cc657b..a479085671 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -121,42 +121,6 @@ type AppleNotificationTransactionInfo struct { const AppleNotificationTypeRefund = "REFUND" -type Platform int - -const ( - Unknown Platform = iota - Apple - Google - Facebook - Huawei - Xbox - Playstation - Steam - Epic - Discord -) - -func (enum Platform) String() string { - return [...]string{runtime.UNKNOWN_PLATFORM_STRING, runtime.APPLE_PLATFORM_STRING, runtime.GOOGLE_PLATFORM_STRING, runtime.FACEBOOK_PLATFORM_STRING, runtime.HUAWEI_PLATFORM_STRING, runtime.XBOX_PLATFORM_STRING, runtime.PLAYSTATION_PLATFORM_STRING, runtime.STEAM_PLATFORM_STRING, runtime.EPIC_PLATFORM_STRING, runtime.DISCORD_PLATFORM_STRING}[enum] -} - -var AllPlatforms = []Platform{Unknown, Apple, Google, Facebook, Huawei, Xbox, Playstation, Steam, Epic, Discord} - -func FromString(s string) Platform { - return map[string]Platform{ - runtime.UNKNOWN_PLATFORM_STRING: Unknown, - runtime.APPLE_PLATFORM_STRING: Apple, - runtime.GOOGLE_PLATFORM_STRING: Google, - runtime.FACEBOOK_PLATFORM_STRING: Facebook, - runtime.HUAWEI_PLATFORM_STRING: Huawei, - runtime.XBOX_PLATFORM_STRING: Xbox, - runtime.PLAYSTATION_PLATFORM_STRING: Playstation, - runtime.EPIC_PLATFORM_STRING: Epic, - runtime.STEAM_PLATFORM_STRING: Steam, - runtime.DISCORD_PLATFORM_STRING: Discord, - }[s] -} - func GetPurchaseProvider(platform string, purchaseProviders map[string]runtime.PurchaseProvider) (runtime.PurchaseProvider, error) { purchaseProvider, exists := purchaseProviders[platform] if !exists || purchaseProvider == nil { diff --git a/server/config.go b/server/config.go index e3ee4b08ca..64685de72f 100644 --- a/server/config.go +++ b/server/config.go @@ -34,7 +34,6 @@ import ( // Config interface is the Nakama core configuration. type Config interface { GetName() string - GetConfigFilePath() []string GetDataDir() string GetShutdownGraceSec() int GetLogger() *LoggerConfig @@ -552,10 +551,6 @@ func (c *config) GetName() string { return c.Name } -func (c *config) GetConfigFilePath() []string { - return c.Config -} - func (c *config) GetDataDir() string { return c.Datadir } @@ -649,7 +644,6 @@ func (c *config) GetRuntimeConfig() (runtime.Config, error) { cn := &RuntimeConfigClone{ Name: clone.GetName(), - FilePaths: clone.GetConfigFilePath(), ShutdownGrace: clone.GetShutdownGraceSec(), Logger: lc, Session: sc, diff --git a/server/console.go b/server/console.go index 2a7decbdb4..a40ba617a4 100644 --- a/server/console.go +++ b/server/console.go @@ -284,16 +284,16 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D if config.GetIAP().Apple.NotificationsEndpointId != "" { endpoint := fmt.Sprintf("/v2/console/apple/subscriptions/%s", config.GetIAP().Apple.NotificationsEndpointId) // uncomment when built in iap are switched to new purchaseprovider flow - provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) - if err != nil && provider == nil { - startupLogger.Error("Console registration failed", zap.Error(err)) - } else { - handler, err := provider.HandleRefund(ctx) - if err != nil { - startupLogger.Error("Console registration failed", zap.Error(err)) - } - grpcGatewayRouter.HandleFunc(endpoint, handler) - } + //provider, err := iap.GetPurchaseProvider("apple", runtime.purchaseProviders) + //if err != nil && provider == nil { + // startupLogger.Error("Console registration failed", zap.Error(err)) + //} else { + // handler, err := provider.HandleRefund(ctx) + // if err != nil { + // startupLogger.Error("Console registration failed", zap.Error(err)) + // } + // grpcGatewayRouter.HandleFunc(endpoint, handler) + //} grpcGatewayRouter.HandleFunc(endpoint, appleNotificationHandler(logger, db, runtime.PurchaseNotificationApple(), runtime.SubscriptionNotificationApple())) logger.Info("Registered endpoint for Apple subscription notifications callback", zap.String("endpoint", endpoint)) @@ -442,7 +442,7 @@ func initPurchaseProviderRefundHooks(logger *zap.Logger, config Config, refundFn return nil } - for _, platform := range iap.AllPlatforms { + for _, platform := range runtime.AllPlatforms { refundFn, err := iap.GetRefundFn(platform.String(), refundFns) if err != nil { logger.Error("error getting refund function", zap.Error(err)) diff --git a/server/runtime_config.go b/server/runtime_config.go index 124d3f7c2f..df8a98026a 100644 --- a/server/runtime_config.go +++ b/server/runtime_config.go @@ -34,10 +34,6 @@ func (c *RuntimeConfigClone) GetName() string { return c.Name } -func (c *RuntimeConfigClone) GetConfigFilePath() []string { - return c.FilePaths -} - func (c *RuntimeConfigClone) GetShutdownGraceSec() int { return c.ShutdownGrace } diff --git a/server/runtime_go.go b/server/runtime_go.go index 1479cd9cfa..d598d82dcf 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -2862,8 +2862,8 @@ func (ri *RuntimeGoInitializer) RegisterFleetManager(fleetManager runtime.FleetM } func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purchaseProvider runtime.PurchaseProvider) error { - platformEnum := iap.FromString(platform) - if platformEnum == iap.Unknown { + platformEnum := runtime.PlatformFromString(platform) + if platformEnum == runtime.Unknown { ri.logger.Error("platform %v is not valid", platform) return errors.New("platform unknown") @@ -2894,8 +2894,8 @@ func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purcha } func (ri *RuntimeGoInitializer) RegisterRefundHandler(platform string, purchaseRefundFn runtime.PurchaseRefundFn, subscriptionRefundFn runtime.SubscriptionRefundFn) error { - platformEnum := iap.FromString(platform) - if platformEnum == iap.Unknown { + platformEnum := runtime.PlatformFromString(platform) + if platformEnum == runtime.Unknown { ri.logger.Error("platform %v is not valid", platform) return errors.New("platform unknown") diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index c98d47e217..5e5f46d56f 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -7201,11 +7201,9 @@ func (x *Users) GetUsers() []*User { type ValidatePurchaseRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Receipt string `protobuf:"bytes,1,opt,name=receipt,proto3" json:"receipt,omitempty"` - Purchase string `protobuf:"bytes,2,opt,name=purchase,proto3" json:"purchase,omitempty"` - SignedRequest string `protobuf:"bytes,3,opt,name=signed_request,json=signedRequest,proto3" json:"signed_request,omitempty"` - Signature string `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` - Platform string `protobuf:"bytes,5,opt,name=platform,proto3" json:"platform,omitempty"` - Persist *wrapperspb.BoolValue `protobuf:"bytes,6,opt,name=persist,proto3" json:"persist,omitempty"` + Signature string `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + Platform string `protobuf:"bytes,3,opt,name=platform,proto3" json:"platform,omitempty"` + Persist *wrapperspb.BoolValue `protobuf:"bytes,4,opt,name=persist,proto3" json:"persist,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -7247,20 +7245,6 @@ func (x *ValidatePurchaseRequest) GetReceipt() string { return "" } -func (x *ValidatePurchaseRequest) GetPurchase() string { - if x != nil { - return x.Purchase - } - return "" -} - -func (x *ValidatePurchaseRequest) GetSignedRequest() string { - if x != nil { - return x.SignedRequest - } - return "" -} - func (x *ValidatePurchaseRequest) GetSignature() string { if x != nil { return x.Signature @@ -9577,14 +9561,12 @@ const file_api_proto_rawDesc = "" + "\x06MEMBER\x10\x02\x12\x10\n" + "\fJOIN_REQUEST\x10\x03\"/\n" + "\x05Users\x12&\n" + - "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\"\xe6\x01\n" + + "\x05users\x18\x01 \x03(\v2\x10.nakama.api.UserR\x05users\"\xa3\x01\n" + "\x17ValidatePurchaseRequest\x12\x18\n" + - "\areceipt\x18\x01 \x01(\tR\areceipt\x12\x1a\n" + - "\bpurchase\x18\x02 \x01(\tR\bpurchase\x12%\n" + - "\x0esigned_request\x18\x03 \x01(\tR\rsignedRequest\x12\x1c\n" + - "\tsignature\x18\x04 \x01(\tR\tsignature\x12\x1a\n" + - "\bplatform\x18\x05 \x01(\tR\bplatform\x124\n" + - "\apersist\x18\x06 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x89\x01\n" + + "\areceipt\x18\x01 \x01(\tR\areceipt\x12\x1c\n" + + "\tsignature\x18\x02 \x01(\tR\tsignature\x12\x1a\n" + + "\bplatform\x18\x03 \x01(\tR\bplatform\x124\n" + + "\apersist\x18\x04 \x01(\v2\x1a.google.protobuf.BoolValueR\apersist\"\x89\x01\n" + "\x1bValidateSubscriptionRequest\x12\x1a\n" + "\bplatform\x18\x01 \x01(\tR\bplatform\x12\x18\n" + "\areceipt\x18\x02 \x01(\tR\areceipt\x124\n" + diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index 58862e1111..18c566c12b 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1189,11 +1189,9 @@ message Users { message ValidatePurchaseRequest { string receipt = 1; - string purchase = 2; - string signed_request = 3; - string signature = 4; - string platform = 5; - google.protobuf.BoolValue persist = 6; + string signature = 2; + string platform = 3; + google.protobuf.BoolValue persist = 4; } message ValidateSubscriptionRequest { diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go index 792892f72f..6784eaffab 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/config.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/config.go @@ -17,7 +17,6 @@ package runtime // Config interface is the Nakama core configuration. type Config interface { GetName() string - GetConfigFilePath() []string GetShutdownGraceSec() int GetLogger() LoggerConfig GetSession() SessionConfig diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 96928f60db..784fbacaed 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -90,11 +90,11 @@ import ( "database/sql" "errors" "fmt" + "github.com/gofrs/uuid/v5" "net/http" "os" "time" - "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" "github.com/heroiclabs/nakama-common/rtapi" "google.golang.org/protobuf/types/known/timestamppb" @@ -158,17 +158,6 @@ const ( // Tick rate defined for this match. Only applicable to server authoritative multiplayer. RUNTIME_CTX_MATCH_TICK_RATE = "match_tick_rate" - - UNKNOWN_PLATFORM_STRING = "unknown" - APPLE_PLATFORM_STRING = "apple" - GOOGLE_PLATFORM_STRING = "google" - FACEBOOK_PLATFORM_STRING = "facebook" - HUAWEI_PLATFORM_STRING = "huawei" - XBOX_PLATFORM_STRING = "xbox" - PLAYSTATION_PLATFORM_STRING = "playstation" - STEAM_PLATFORM_STRING = "steam" - EPIC_PLATFORM_STRING = "epic" - DISCORD_PLATFORM_STRING = "discord" ) var ( @@ -241,6 +230,17 @@ var ( ErrSatoriConfigurationInvalid = errors.New("satori configuration is invalid") ErrPurchaseProviderFunctionalityNotSupported = errors.New("purchase provider functionality not supported") + + UnknownPlatformString = "unknown" + ApplePlatformString = "apple" + GooglePlatformString = "google" + FacebookPlatformString = "facebook" + HuaweiPlatformString = "huawei" + XboxPlatformString = "xbox" + PlaystationPlatformString = "playstation" + SteamPlatformString = "steam" + EpicPlatformString = "epic" + DiscordPlatformString = "discord" ) const ( @@ -275,6 +275,42 @@ type Error struct { Code int } +type Platform int + +const ( + Unknown Platform = iota + Apple + Google + Facebook + Huawei + Xbox + Playstation + Steam + Epic + Discord +) + +func (enum Platform) String() string { + return [...]string{UnknownPlatformString, ApplePlatformString, GooglePlatformString, FacebookPlatformString, HuaweiPlatformString, XboxPlatformString, PlaystationPlatformString, SteamPlatformString, EpicPlatformString, DiscordPlatformString}[enum] +} + +var AllPlatforms = []Platform{Unknown, Apple, Google, Facebook, Huawei, Xbox, Playstation, Steam, Epic, Discord} + +func PlatformFromString(s string) Platform { + return map[string]Platform{ + UnknownPlatformString: Unknown, + ApplePlatformString: Apple, + GooglePlatformString: Google, + FacebookPlatformString: Facebook, + HuaweiPlatformString: Huawei, + XboxPlatformString: Xbox, + PlaystationPlatformString: Playstation, + EpicPlatformString: Epic, + SteamPlatformString: Steam, + DiscordPlatformString: Discord, + }[s] +} + // Error returns the encapsulated error message. func (e *Error) Error() string { return e.Message @@ -1380,7 +1416,6 @@ type PurchaseProvider interface { /* Satori runtime integration definitions. -Satori runtime integration definitions. */ type Satori interface { Authenticate(ctx context.Context, id string, defaultProperties, customProperties map[string]string, noSession bool, ipAddress ...string) (*Properties, error) From f5a3c9999455958ffcb21c20be209e3c97298c02 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 19 Aug 2025 11:40:32 +0100 Subject: [PATCH 22/28] revert config file path changes --- server/config.go | 1 - 1 file changed, 1 deletion(-) diff --git a/server/config.go b/server/config.go index 64685de72f..b78b048bf4 100644 --- a/server/config.go +++ b/server/config.go @@ -521,7 +521,6 @@ func (c *config) Clone() (Config, error) { nc := &config{ Name: c.Name, - Config: c.Config, Datadir: c.Datadir, ShutdownGraceSec: c.ShutdownGraceSec, Logger: c.Logger.Clone(), From c93c5eba9c5c23e26d6c4af3f6a4567ca3ea3f73 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Wed, 20 Aug 2025 12:03:13 +0100 Subject: [PATCH 23/28] PR comments address: reverted unused config changes and initialized the purchase providers and refund funcs maps where the struct is initialized --- server/runtime_config.go | 1 - server/runtime_go.go | 19 +++---------------- server/runtime_go_nakama.go | 3 +++ 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/server/runtime_config.go b/server/runtime_config.go index df8a98026a..f837a5c2b8 100644 --- a/server/runtime_config.go +++ b/server/runtime_config.go @@ -18,7 +18,6 @@ import "github.com/heroiclabs/nakama-common/runtime" type RuntimeConfigClone struct { Name string - FilePaths []string ShutdownGrace int Logger runtime.LoggerConfig Session runtime.SessionConfig diff --git a/server/runtime_go.go b/server/runtime_go.go index d598d82dcf..74e2bacfe1 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -2876,14 +2876,6 @@ func (ri *RuntimeGoInitializer) RegisterPurchaseProvider(platform string, purcha } if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - if ri.purchaseProviders == nil { - ri.purchaseProviders = make(map[string]runtime.PurchaseProvider) - } - - if nk.purchaseProviders == nil { - nk.purchaseProviders = make(map[string]runtime.PurchaseProvider) - } - ri.purchaseProviders[platform] = purchaseProvider nk.purchaseProviders[platform] = purchaseProvider @@ -2908,14 +2900,6 @@ func (ri *RuntimeGoInitializer) RegisterRefundHandler(platform string, purchaseR } if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { - if ri.refundFns == nil { - ri.refundFns = make(map[string]runtime.RefundFns) - } - - if nk.refundFns == nil { - nk.refundFns = make(map[string]runtime.RefundFns) - } - purchasefuncWrapper := func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, purchase *api.ValidatedPurchase, providerPayload string) error { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModePurchaseNotification, nil, nil, 0, "", "", nil, "", "", "", "") return purchaseRefundFn(ctx, ri.logger.WithField("mode", RuntimeExecutionModePurchaseNotification.String()+platform), ri.db, ri.nk, purchase, providerPayload) @@ -3034,6 +3018,9 @@ func NewRuntimeProviderGo(ctx context.Context, logger, startupLogger *zap.Logger matchLock: matchLock, fmCallbackHandler: fmCallbackHandler, + + purchaseProviders: make(map[string]runtime.PurchaseProvider), + refundFns: make(map[string]runtime.RefundFns), } // The baseline context that will be passed to all InitModule calls. diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index 1de1d5c68a..784c53b03d 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -92,6 +92,9 @@ func NewRuntimeGoNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler node: config.GetName(), satori: satoriClient, + + purchaseProviders: make(map[string]runtime.PurchaseProvider), + refundFns: make(map[string]runtime.RefundFns), } } From e057c6edb9e1ee99c6f279c297a18098c44941ba Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Wed, 20 Aug 2025 12:20:56 +0100 Subject: [PATCH 24/28] removed persisit from client purchase and subscription validate response --- server/api_purchase.go | 1 - server/api_subscription.go | 6 ++--- .../heroiclabs/nakama-common/api/api.pb.go | 26 +++---------------- .../heroiclabs/nakama-common/api/api.proto | 2 -- 4 files changed, 7 insertions(+), 28 deletions(-) diff --git a/server/api_purchase.go b/server/api_purchase.go index 2c01845984..38b12911b9 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -73,7 +73,6 @@ func handleValidatedPurchases(ctx context.Context, db *sql.DB, storagePurchases return &api.ValidatePurchaseProviderResponse{ ValidatedPurchases: validatedPurchases, - Persist: persist, }, nil } diff --git a/server/api_subscription.go b/server/api_subscription.go index 9ea36210b0..23115e079e 100644 --- a/server/api_subscription.go +++ b/server/api_subscription.go @@ -46,7 +46,7 @@ func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscr }) } - return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs, Persist: persist}, nil + return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs}, nil } if err := iap.UpsertSubscriptions(ctx, db, storageSubscriptions); err != nil { @@ -71,7 +71,7 @@ func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscr validatedSubs = append(validatedSubs, &validatedSub) } - return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs, Persist: persist}, nil + return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs}, nil } func (s *ApiServer) ValidateSubscription(ctx context.Context, in *api.ValidateSubscriptionRequest) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { @@ -131,7 +131,7 @@ func (s *ApiServer) ValidateSubscription(ctx context.Context, in *api.ValidateSu // Execute the after function lambda wrapped in a trace for stats measurement. traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } - + return response, nil } diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index 5e5f46d56f..6bcf9c65eb 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -7976,7 +7976,6 @@ func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase type ValidatePurchaseProviderResponse struct { state protoimpl.MessageState `protogen:"open.v1"` ValidatedPurchases []*PurchaseProviderValidatedPurchase `protobuf:"bytes,1,rep,name=validated_purchases,json=validatedPurchases,proto3" json:"validated_purchases,omitempty"` - Persist bool `protobuf:"varint,2,opt,name=persist,proto3" json:"persist,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -8018,13 +8017,6 @@ func (x *ValidatePurchaseProviderResponse) GetValidatedPurchases() []*PurchasePr return nil } -func (x *ValidatePurchaseProviderResponse) GetPersist() bool { - if x != nil { - return x.Persist - } - return false -} - // Validate Subscription response. type ValidateSubscriptionResponse struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -8073,7 +8065,6 @@ func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubs type ValidatePurchaseProviderSubscriptionResponse struct { state protoimpl.MessageState `protogen:"open.v1"` ValidatedSubscription []*ValidatedSubscription `protobuf:"bytes,1,rep,name=validated_subscription,json=validatedSubscription,proto3" json:"validated_subscription,omitempty"` - Persist bool `protobuf:"varint,2,opt,name=persist,proto3" json:"persist,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -8115,13 +8106,6 @@ func (x *ValidatePurchaseProviderSubscriptionResponse) GetValidatedSubscription( return nil } -func (x *ValidatePurchaseProviderSubscriptionResponse) GetPersist() bool { - if x != nil { - return x.Persist - } - return false -} - type ValidatedSubscription struct { state protoimpl.MessageState `protogen:"open.v1"` // Subscription User ID. @@ -9625,15 +9609,13 @@ const file_api_proto_rawDesc = "" + "\venvironment\x18\n" + " \x01(\x0e2\x1c.nakama.api.StoreEnvironmentR\venvironment\"j\n" + "\x18ValidatePurchaseResponse\x12N\n" + - "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\"\x9c\x01\n" + + "\x13validated_purchases\x18\x01 \x03(\v2\x1d.nakama.api.ValidatedPurchaseR\x12validatedPurchases\"\x82\x01\n" + " ValidatePurchaseProviderResponse\x12^\n" + - "\x13validated_purchases\x18\x01 \x03(\v2-.nakama.api.PurchaseProviderValidatedPurchaseR\x12validatedPurchases\x12\x18\n" + - "\apersist\x18\x02 \x01(\bR\apersist\"x\n" + + "\x13validated_purchases\x18\x01 \x03(\v2-.nakama.api.PurchaseProviderValidatedPurchaseR\x12validatedPurchases\"x\n" + "\x1cValidateSubscriptionResponse\x12X\n" + - "\x16validated_subscription\x18\x01 \x01(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\xa2\x01\n" + + "\x16validated_subscription\x18\x01 \x01(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\x88\x01\n" + ",ValidatePurchaseProviderSubscriptionResponse\x12X\n" + - "\x16validated_subscription\x18\x01 \x03(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\x12\x18\n" + - "\apersist\x18\x02 \x01(\bR\apersist\"\xa7\x05\n" + + "\x16validated_subscription\x18\x01 \x03(\v2!.nakama.api.ValidatedSubscriptionR\x15validatedSubscription\"\xa7\x05\n" + "\x15ValidatedSubscription\x12\x17\n" + "\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1d\n" + "\n" + diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index 18c566c12b..43290dab94 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1307,7 +1307,6 @@ message ValidatePurchaseResponse { message ValidatePurchaseProviderResponse { repeated PurchaseProviderValidatedPurchase validated_purchases = 1; - bool persist = 2; } // Validate Subscription response. @@ -1317,7 +1316,6 @@ message ValidateSubscriptionResponse { message ValidatePurchaseProviderSubscriptionResponse { repeated ValidatedSubscription validated_subscription = 1; - bool persist = 2; } // Validation Provider, From 98b800307b97a51d5c3dbf4686d3d302fd93db24 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Fri, 22 Aug 2025 10:21:26 +0100 Subject: [PATCH 25/28] handle refund wrapper implemented --- go.mod | 2 +- go.sum | 4 +- iap/apple.go | 491 +++++++++--------- iap/facebook.go | 10 +- iap/google.go | 279 +++++----- iap/huawei.go | 8 +- server/console.go | 4 +- .../nakama-common/runtime/runtime.go | 3 +- .../x/sys/windows/security_windows.go | 49 +- .../x/sys/windows/syscall_windows.go | 6 +- .../golang.org/x/sys/windows/types_windows.go | 212 ++++++++ .../x/sys/windows/zsyscall_windows.go | 9 + vendor/modules.txt | 2 +- 13 files changed, 694 insertions(+), 385 deletions(-) diff --git a/go.mod b/go.mod index f78736fa7b..727fb15437 100644 --- a/go.mod +++ b/go.mod @@ -71,7 +71,7 @@ require ( go.uber.org/multierr v1.10.0 // indirect golang.org/x/net v0.38.0 // indirect golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect + golang.org/x/sys v0.33.0 // indirect golang.org/x/text v0.24.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 // indirect ) diff --git a/go.sum b/go.sum index e96561f36a..bbdcaaa6cb 100644 --- a/go.sum +++ b/go.sum @@ -219,8 +219,8 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/iap/apple.go b/iap/apple.go index 1899b232fc..f96e51055c 100644 --- a/iap/apple.go +++ b/iap/apple.go @@ -236,297 +236,314 @@ func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, in *ap return storageSubscriptions, nil } -func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { +func (a *ApplePurchaseProvider) HandleRefundWrapper(ctx context.Context) (http.HandlerFunc, error) { return func(w http.ResponseWriter, r *http.Request) { - body, err := io.ReadAll(r.Body) - if err != nil { - a.logger.Error("Failed to decode App Store notification body", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } - defer r.Body.Close() + ctx = context.WithValue(ctx, "w", w) + ctx = context.WithValue(ctx, "r", r) + a.HandleRefund(ctx) + }, nil +} - var applePayload *AppleNotificationSignedPayload - if err := json.Unmarshal(body, &applePayload); err != nil { - a.logger.Error("Failed to unmarshal App Store notification", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } +func (a *ApplePurchaseProvider) HandleRefund(ctx context.Context) error { + var w http.ResponseWriter + if v := ctx.Value("w"); v != nil { + w = v.(http.ResponseWriter) + } - tokens := strings.Split(applePayload.SignedPayload, ".") - if len(tokens) < 3 { - a.logger.Error("Unexpected App Store notification JWS token length") - w.WriteHeader(http.StatusInternalServerError) - return - } + var r *http.Request + if v := ctx.Value("w"); v != nil { + r = v.(*http.Request) + } - seg := tokens[0] - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } + body, err := io.ReadAll(r.Body) + if err != nil { + a.logger.Error("Failed to decode App Store notification body", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + defer r.Body.Close() - headerByte, err := base64.StdEncoding.DecodeString(seg) - if err != nil { - a.logger.Error("Failed to decode Apple notification JWS header", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + var applePayload *AppleNotificationSignedPayload + if err := json.Unmarshal(body, &applePayload); err != nil { + a.logger.Error("Failed to unmarshal App Store notification", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - type Header struct { - Alg string `json:"alg"` - X5c []string `json:"x5c"` - } - var header Header + tokens := strings.Split(applePayload.SignedPayload, ".") + if len(tokens) < 3 { + a.logger.Error("Unexpected App Store notification JWS token length") + w.WriteHeader(http.StatusInternalServerError) + return nil + } - if err = json.Unmarshal(headerByte, &header); err != nil { - a.logger.Error("Failed to unmarshal Apple notification JWS header", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + seg := tokens[0] + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } - certs := make([][]byte, 0) - for _, encodedCert := range header.X5c { - cert, err := base64.StdEncoding.DecodeString(encodedCert) - if err != nil { - a.logger.Error("Failed to decode Apple notification JWS header certificate", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } - certs = append(certs, cert) - } + headerByte, err := base64.StdEncoding.DecodeString(seg) + if err != nil { + a.logger.Error("Failed to decode Apple notification JWS header", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - rootCert := x509.NewCertPool() - ok := rootCert.AppendCertsFromPEM([]byte(AppleRootPEM)) - if !ok { - a.logger.Error("Failed to parse Apple root certificate", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + type Header struct { + Alg string `json:"alg"` + X5c []string `json:"x5c"` + } + var header Header - interCert, err := x509.ParseCertificate(certs[1]) - if err != nil { - a.logger.Error("Failed to parse Apple notification intermediate certificate", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } - intermedia := x509.NewCertPool() - intermedia.AddCert(interCert) + if err = json.Unmarshal(headerByte, &header); err != nil { + a.logger.Error("Failed to unmarshal Apple notification JWS header", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - cert, err := x509.ParseCertificate(certs[2]) + certs := make([][]byte, 0) + for _, encodedCert := range header.X5c { + cert, err := base64.StdEncoding.DecodeString(encodedCert) if err != nil { - a.logger.Error("Failed to parse Apple notification certificate", zap.Error(err)) + a.logger.Error("Failed to decode Apple notification JWS header certificate", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) - return + return nil } + certs = append(certs, cert) + } - opts := x509.VerifyOptions{ - Roots: rootCert, - Intermediates: intermedia, - } + rootCert := x509.NewCertPool() + ok := rootCert.AppendCertsFromPEM([]byte(AppleRootPEM)) + if !ok { + a.logger.Error("Failed to parse Apple root certificate", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - _, err = cert.Verify(opts) - if err != nil { - a.logger.Error("Failed to validate Apple notification signature", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + interCert, err := x509.ParseCertificate(certs[1]) + if err != nil { + a.logger.Error("Failed to parse Apple notification intermediate certificate", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + intermedia := x509.NewCertPool() + intermedia.AddCert(interCert) - seg = tokens[1] - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } + cert, err := x509.ParseCertificate(certs[2]) + if err != nil { + a.logger.Error("Failed to parse Apple notification certificate", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - jsonPayload, err := base64.StdEncoding.DecodeString(seg) - if err != nil { - a.logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + opts := x509.VerifyOptions{ + Roots: rootCert, + Intermediates: intermedia, + } - var notificationPayload *AppleNotificationPayload - if err = json.Unmarshal(jsonPayload, ¬ificationPayload); err != nil { - a.logger.Error("Failed to json unmarshal App Store notification payload", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + _, err = cert.Verify(opts) + if err != nil { + a.logger.Error("Failed to validate Apple notification signature", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - tokens = strings.Split(notificationPayload.Data.SignedTransactionInfo, ".") - if len(tokens) < 3 { - a.logger.Error("Unexpected App Store notification SignedTransactionInfo JWS token length") - w.WriteHeader(http.StatusInternalServerError) - return - } + seg = tokens[1] + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } - seg = tokens[1] - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } + jsonPayload, err := base64.StdEncoding.DecodeString(seg) + if err != nil { + a.logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + var notificationPayload *AppleNotificationPayload + if err = json.Unmarshal(jsonPayload, ¬ificationPayload); err != nil { + a.logger.Error("Failed to json unmarshal App Store notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + tokens = strings.Split(notificationPayload.Data.SignedTransactionInfo, ".") + if len(tokens) < 3 { + a.logger.Error("Unexpected App Store notification SignedTransactionInfo JWS token length") + w.WriteHeader(http.StatusInternalServerError) + return nil + } - jsonPayload, err = base64.StdEncoding.DecodeString(seg) + seg = tokens[1] + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } + + jsonPayload, err = base64.StdEncoding.DecodeString(seg) + if err != nil { + a.logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + var signedTransactionInfo *AppleNotificationTransactionInfo + if err = json.Unmarshal(jsonPayload, &signedTransactionInfo); err != nil { + a.logger.Error("Failed to json unmarshal App Store notification SignedTransactionInfo JWS token", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + a.logger.Debug("Apple IAP notification received", zap.Any("notification_payload", signedTransactionInfo)) + + uid := uuid.Nil + if signedTransactionInfo.AppAccountToken != "" { + tokenUID, err := uuid.FromString(signedTransactionInfo.AppAccountToken) if err != nil { - a.logger.Error("Failed to base64 decode App Store notification payload", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return + a.logger.Warn("App Store subscription notification AppAccountToken is an invalid uuid", zap.String("app_account_token", signedTransactionInfo.AppAccountToken), zap.Error(err), zap.String("payload", string(body))) + } else { + uid = tokenUID } + } - var signedTransactionInfo *AppleNotificationTransactionInfo - if err = json.Unmarshal(jsonPayload, &signedTransactionInfo); err != nil { - a.logger.Error("Failed to json unmarshal App Store notification SignedTransactionInfo JWS token", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return + env := api.StoreEnvironment_PRODUCTION + if notificationPayload.Data.Environment == AppleSandboxEnvironment { + env = api.StoreEnvironment_SANDBOX + } + + if signedTransactionInfo.ExpiresDateMs != 0 { + // Notification regarding a subscription. + if uid.IsNil() { + // No user ID was found in receipt, lookup a validated subscription. + s, err := GetSubscriptionByOriginalTransactionId(r.Context(), a.zapLogger, a.db, signedTransactionInfo.OriginalTransactionId) + if err != nil || s == nil { + w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. + return nil + } + uid = uuid.Must(uuid.FromString(s.UserId)) } - a.logger.Debug("Apple IAP notification received", zap.Any("notification_payload", signedTransactionInfo)) + sub := &runtime.StorageSubscription{ + UserID: uid, + OriginalTransactionId: signedTransactionInfo.OriginalTransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: signedTransactionInfo.ProductId, + PurchaseTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.OriginalPurchaseDateMs), + Environment: env, + ExpireTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.ExpiresDateMs), + RawNotification: string(body), + RefundTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), + } - uid := uuid.Nil - if signedTransactionInfo.AppAccountToken != "" { - tokenUID, err := uuid.FromString(signedTransactionInfo.AppAccountToken) - if err != nil { - a.logger.Warn("App Store subscription notification AppAccountToken is an invalid uuid", zap.String("app_account_token", signedTransactionInfo.AppAccountToken), zap.Error(err), zap.String("payload", string(body))) - } else { - uid = tokenUID + if err = UpsertSubscription(r.Context(), a.db, sub); err != nil { + var pgErr *pgconn.PgError + if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { + // User id was not found, ignore this notification + w.WriteHeader(http.StatusOK) + return nil } + a.logger.Error("Failed to store App Store notification subscription data", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil } - env := api.StoreEnvironment_PRODUCTION - if notificationPayload.Data.Environment == AppleSandboxEnvironment { - env = api.StoreEnvironment_SANDBOX + active := false + if sub.ExpireTime.After(time.Now()) && sub.RefundTime.Unix() == 0 { + active = true } - if signedTransactionInfo.ExpiresDateMs != 0 { - // Notification regarding a subscription. - if uid.IsNil() { - // No user ID was found in receipt, lookup a validated subscription. - s, err := GetSubscriptionByOriginalTransactionId(r.Context(), a.zapLogger, a.db, signedTransactionInfo.OriginalTransactionId) - if err != nil || s == nil { - w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. - return - } - uid = uuid.Must(uuid.FromString(s.UserId)) - } + var suid string + if !sub.UserID.IsNil() { + suid = sub.UserID.String() + } - sub := &runtime.StorageSubscription{ - UserID: uid, - OriginalTransactionId: signedTransactionInfo.OriginalTransactionId, + if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { + validatedSub := &api.ValidatedSubscription{ + UserId: suid, + ProductId: sub.ProductId, + OriginalTransactionId: sub.OriginalTransactionId, Store: api.StoreProvider_APPLE_APP_STORE, - ProductId: signedTransactionInfo.ProductId, - PurchaseTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.OriginalPurchaseDateMs), + PurchaseTime: timestamppb.New(sub.PurchaseTime), + CreateTime: timestamppb.New(sub.CreateTime), + UpdateTime: timestamppb.New(sub.UpdateTime), Environment: env, - ExpireTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.ExpiresDateMs), - RawNotification: string(body), - RefundTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), + ExpiryTime: timestamppb.New(sub.ExpireTime), + RefundTime: timestamppb.New(sub.RefundTime), + ProviderResponse: sub.RawResponse, + ProviderNotification: sub.RawNotification, + Active: active, } - if err = UpsertSubscription(r.Context(), a.db, sub); err != nil { - var pgErr *pgconn.PgError - if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { - // User id was not found, ignore this notification + if a.subscriptionFn != nil { + if err = a.subscriptionFn(r.Context(), a.logger, a.db, a.nk, validatedSub, string(body)); err != nil { + a.logger.Error("Error invoking Apple subscription refund runtime function", zap.Error(err)) w.WriteHeader(http.StatusOK) - return + return nil } - a.logger.Error("Failed to store App Store notification subscription data", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } - - active := false - if sub.ExpireTime.After(time.Now()) && sub.RefundTime.Unix() == 0 { - active = true } + } - var suid string - if !sub.UserID.IsNil() { - suid = sub.UserID.String() + } else { + // Notification regarding a purchase. + if uid.IsNil() { + // No user ID was found in receipt, lookup a validated subscription. + p, err := GetPurchaseByTransactionId(r.Context(), a.zapLogger, a.db, signedTransactionInfo.TransactionId) + if err != nil || p == nil { + // User validated purchase not found. + w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. + return nil } - - if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { - validatedSub := &api.ValidatedSubscription{ - UserId: suid, - ProductId: sub.ProductId, - OriginalTransactionId: sub.OriginalTransactionId, - Store: api.StoreProvider_APPLE_APP_STORE, - PurchaseTime: timestamppb.New(sub.PurchaseTime), - CreateTime: timestamppb.New(sub.CreateTime), - UpdateTime: timestamppb.New(sub.UpdateTime), - Environment: env, - ExpiryTime: timestamppb.New(sub.ExpireTime), - RefundTime: timestamppb.New(sub.RefundTime), - ProviderResponse: sub.RawResponse, - ProviderNotification: sub.RawNotification, - Active: active, - } - - if a.subscriptionFn != nil { - if err = a.subscriptionFn(r.Context(), a.logger, a.db, a.nk, validatedSub, string(body)); err != nil { - a.logger.Error("Error invoking Apple subscription refund runtime function", zap.Error(err)) - w.WriteHeader(http.StatusOK) - return - } - } + uid = uuid.Must(uuid.FromString(p.UserId)) + } + + if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { + purchase := &runtime.StoragePurchase{ + UserID: uid, + Store: api.StoreProvider_APPLE_APP_STORE, + ProductId: signedTransactionInfo.ProductId, + TransactionId: signedTransactionInfo.TransactionId, + PurchaseTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.PurchaseDateMs), + RefundTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), + Environment: env, } - } else { - // Notification regarding a purchase. - if uid.IsNil() { - // No user ID was found in receipt, lookup a validated subscription. - p, err := GetPurchaseByTransactionId(r.Context(), a.zapLogger, a.db, signedTransactionInfo.TransactionId) - if err != nil || p == nil { - // User validated purchase not found. - w.WriteHeader(http.StatusInternalServerError) // Return error to keep retrying. - return - } - uid = uuid.Must(uuid.FromString(p.UserId)) + dbPurchases, err := UpsertPurchases(r.Context(), a.db, []*runtime.StoragePurchase{purchase}) + if err != nil { + a.logger.Error("Failed to store App Store notification purchase data") + w.WriteHeader(http.StatusInternalServerError) + return nil } - if strings.ToUpper(notificationPayload.NotificationType) == AppleNotificationTypeRefund { - purchase := &runtime.StoragePurchase{ - UserID: uid, - Store: api.StoreProvider_APPLE_APP_STORE, - ProductId: signedTransactionInfo.ProductId, - TransactionId: signedTransactionInfo.TransactionId, - PurchaseTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.PurchaseDateMs), - RefundTime: ParseMillisecondUnixTimestamp(signedTransactionInfo.RevocationDateMs), - Environment: env, + if a.purchaseFn != nil { + dbPurchase := dbPurchases[0] + suid := dbPurchase.UserID.String() + if dbPurchase.UserID.IsNil() { + suid = "" } - - dbPurchases, err := UpsertPurchases(r.Context(), a.db, []*runtime.StoragePurchase{purchase}) - if err != nil { - a.logger.Error("Failed to store App Store notification purchase data") - w.WriteHeader(http.StatusInternalServerError) - return + validatedPurchase := &api.ValidatedPurchase{ + UserId: suid, + ProductId: signedTransactionInfo.ProductId, + TransactionId: signedTransactionInfo.TransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + CreateTime: timestamppb.New(dbPurchase.CreateTime), + UpdateTime: timestamppb.New(dbPurchase.UpdateTime), + PurchaseTime: timestamppb.New(dbPurchase.PurchaseTime), + RefundTime: timestamppb.New(dbPurchase.RefundTime), + ProviderResponse: string(body), + Environment: env, + SeenBefore: dbPurchase.SeenBefore, } - if a.purchaseFn != nil { - dbPurchase := dbPurchases[0] - suid := dbPurchase.UserID.String() - if dbPurchase.UserID.IsNil() { - suid = "" - } - validatedPurchase := &api.ValidatedPurchase{ - UserId: suid, - ProductId: signedTransactionInfo.ProductId, - TransactionId: signedTransactionInfo.TransactionId, - Store: api.StoreProvider_APPLE_APP_STORE, - CreateTime: timestamppb.New(dbPurchase.CreateTime), - UpdateTime: timestamppb.New(dbPurchase.UpdateTime), - PurchaseTime: timestamppb.New(dbPurchase.PurchaseTime), - RefundTime: timestamppb.New(dbPurchase.RefundTime), - ProviderResponse: string(body), - Environment: env, - SeenBefore: dbPurchase.SeenBefore, - } - - if err = a.purchaseFn(r.Context(), a.logger, a.db, a.nk, validatedPurchase, string(body)); err != nil { - a.logger.Error("Error invoking Apple purchase refund runtime function", zap.Error(err)) - w.WriteHeader(http.StatusOK) - return - } + if err = a.purchaseFn(r.Context(), a.logger, a.db, a.nk, validatedPurchase, string(body)); err != nil { + a.logger.Error("Error invoking Apple purchase refund runtime function", zap.Error(err)) + w.WriteHeader(http.StatusOK) + return nil } } } + } - w.WriteHeader(http.StatusOK) - }, nil + w.WriteHeader(http.StatusOK) + return nil } func NewApplePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { diff --git a/iap/facebook.go b/iap/facebook.go index 986c9b93b5..33a2c29b7c 100644 --- a/iap/facebook.go +++ b/iap/facebook.go @@ -70,17 +70,23 @@ func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api } func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { - f.logger.Info("Handling refund not supported") + f.logger.Info("sub validate not supported") return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } -func (f *FacebookPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { +func (f *FacebookPurchaseProvider) HandleRefundWrapper(ctx context.Context) (http.HandlerFunc, error) { f.logger.Info("Handling refund not supported") return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } +func (f *FacebookPurchaseProvider) HandleRefund(ctx context.Context) error { + f.logger.Info("Handling refund not supported") + + return runtime.ErrPurchaseProviderFunctionalityNotSupported +} + func NewFacebookPurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { purchaseProvider := &FacebookPurchaseProvider{ nk: nk, diff --git a/iap/google.go b/iap/google.go index afbd296112..b21dde5c18 100644 --- a/iap/google.go +++ b/iap/google.go @@ -157,164 +157,181 @@ func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, in *a return []*runtime.StorageSubscription{storageSub}, nil } -func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { +func (g *GooglePurchaseProvider) HandleRefundWrapper(ctx context.Context) (http.HandlerFunc, error) { return func(w http.ResponseWriter, r *http.Request) { - body, err := io.ReadAll(r.Body) - if err != nil { - g.logger.Error("Failed to decode App Store notification body, error: %v", err) - w.WriteHeader(http.StatusInternalServerError) - return - } - defer r.Body.Close() + ctx = context.WithValue(ctx, "w", w) + ctx = context.WithValue(ctx, "r", r) + g.HandleRefund(ctx) + }, nil +} - g.zapLogger = g.zapLogger.With(zap.String("notification_body", string(body))) +func (g *GooglePurchaseProvider) HandleRefund(ctx context.Context) error { + var w http.ResponseWriter + if v := ctx.Value("w"); v != nil { + w = v.(http.ResponseWriter) + } - var notification *GoogleStoreNotification - if err := json.Unmarshal(body, ¬ification); err != nil { - g.zapLogger.Error("Failed to unmarshal Google Play Billing notification", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + var r *http.Request + if v := ctx.Value("w"); v != nil { + r = v.(*http.Request) + } - jsonData, err := base64.URLEncoding.DecodeString(notification.Message.Data) - if err != nil { - g.zapLogger.Error("Failed to base64 decode Google Play Billing notification data") - w.WriteHeader(http.StatusInternalServerError) - return - } + body, err := io.ReadAll(r.Body) + if err != nil { + g.logger.Error("Failed to decode App Store notification body, error: %v", err) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + defer r.Body.Close() - var googleNotification *GoogleDeveloperNotification - if err = json.Unmarshal(jsonData, &googleNotification); err != nil { - g.zapLogger.Error("Failed to json unmarshal Google Play Billing notification payload", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + g.zapLogger = g.zapLogger.With(zap.String("notification_body", string(body))) - if googleNotification.SubscriptionNotification == nil { - // Notification is not for subscription, ack and return. https://developer.android.com/google/play/billing/rtdn-reference#one-time - w.WriteHeader(http.StatusOK) - return - } + var notification *GoogleStoreNotification + if err := json.Unmarshal(body, ¬ification); err != nil { + g.zapLogger.Error("Failed to unmarshal Google Play Billing notification", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - receipt := &ReceiptGoogle{ - PurchaseToken: googleNotification.SubscriptionNotification.PurchaseToken, - ProductID: googleNotification.SubscriptionNotification.SubscriptionId, - PackageName: googleNotification.PackageName, - } + jsonData, err := base64.URLEncoding.DecodeString(notification.Message.Data) + if err != nil { + g.zapLogger.Error("Failed to base64 decode Google Play Billing notification data") + w.WriteHeader(http.StatusInternalServerError) + return nil + } - encodedReceipt, err := json.Marshal(receipt) - if err != nil { - g.zapLogger.Error("Failed to marshal Google receipt.", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return - } + var googleNotification *GoogleDeveloperNotification + if err = json.Unmarshal(jsonData, &googleNotification); err != nil { + g.zapLogger.Error("Failed to json unmarshal Google Play Billing notification payload", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } - gResponse, _, _, err := ValidateSubscriptionReceiptGoogle(r.Context(), Httpc, g.config.GetGoogle().GetClientEmail(), g.config.GetGoogle().GetPrivateKey(), string(encodedReceipt)) - if err != nil { - var vErr *ValidationError - if errors.As(err, &vErr) { - g.zapLogger.Error("Error validating Google receipt in notification callback", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) - } else { - g.zapLogger.Error("Error validating Google receipt in notification callback", zap.Error(err)) - } - w.WriteHeader(http.StatusInternalServerError) - return - } + if googleNotification.SubscriptionNotification == nil { + // Notification is not for subscription, ack and return. https://developer.android.com/google/play/billing/rtdn-reference#one-time + w.WriteHeader(http.StatusOK) + return nil + } - g.zapLogger.Debug("Google IAP subscription notification received", zap.String("notification_payload", string(jsonData)), zap.Any("api_response", gResponse)) + receipt := &ReceiptGoogle{ + PurchaseToken: googleNotification.SubscriptionNotification.PurchaseToken, + ProductID: googleNotification.SubscriptionNotification.SubscriptionId, + PackageName: googleNotification.PackageName, + } - var uid uuid.UUID - if gResponse.ObfuscatedExternalAccountId != "" { - extUID, err := uuid.FromString(gResponse.ObfuscatedExternalAccountId) - if err != nil { - w.WriteHeader(http.StatusOK) - return - } - uid = extUID - } else if gResponse.ObfuscatedExternalProfileId != "" { - extUID, err := uuid.FromString(gResponse.ObfuscatedExternalProfileId) - if err != nil { - w.WriteHeader(http.StatusOK) - return - } - uid = extUID - } else if gResponse.ProfileId != "" { - var dbUID uuid.UUID - if err = g.db.QueryRowContext(r.Context(), "SELECT id FROM users WHERE google_id = $1", gResponse.ProfileId).Scan(&dbUID); err != nil { - if errors.Is(err, sql.ErrNoRows) { - g.zapLogger.Warn("Google Play Billing subscription notification user not found", zap.String("profile_id", gResponse.ProfileId), zap.String("payload", string(body))) - w.WriteHeader(http.StatusOK) // Subscription could not be assigned to a user ID, ack and ignore it. - return - } - w.WriteHeader(http.StatusInternalServerError) - return - } - uid = dbUID + encodedReceipt, err := json.Marshal(receipt) + if err != nil { + g.zapLogger.Error("Failed to marshal Google receipt.", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + gResponse, _, _, err := ValidateSubscriptionReceiptGoogle(r.Context(), Httpc, g.config.GetGoogle().GetClientEmail(), g.config.GetGoogle().GetPrivateKey(), string(encodedReceipt)) + if err != nil { + var vErr *ValidationError + if errors.As(err, &vErr) { + g.zapLogger.Error("Error validating Google receipt in notification callback", zap.Error(vErr.Err), zap.Int("status_code", vErr.StatusCode), zap.String("payload", vErr.Payload)) } else { - // Get user id by existing validated subscription. - purchaseToken := googleNotification.SubscriptionNotification.PurchaseToken - if gResponse.LinkedPurchaseToken != "" { - // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da - purchaseToken = gResponse.LinkedPurchaseToken - } - sub, err := GetSubscriptionByOriginalTransactionId(r.Context(), g.zapLogger, g.db, purchaseToken) - if err != nil || sub == nil { - w.WriteHeader(http.StatusInternalServerError) - return - } - uid = uuid.Must(uuid.FromString(sub.UserId)) + g.zapLogger.Error("Error validating Google receipt in notification callback", zap.Error(err)) } + w.WriteHeader(http.StatusInternalServerError) + return nil + } - env := api.StoreEnvironment_PRODUCTION - if gResponse.PurchaseType == 0 { - env = api.StoreEnvironment_SANDBOX - } + g.zapLogger.Debug("Google IAP subscription notification received", zap.String("notification_payload", string(jsonData)), zap.Any("api_response", gResponse)) - expireTimeInt, err := strconv.ParseInt(gResponse.ExpiryTimeMillis, 10, 64) + var uid uuid.UUID + if gResponse.ObfuscatedExternalAccountId != "" { + extUID, err := uuid.FromString(gResponse.ObfuscatedExternalAccountId) if err != nil { - g.zapLogger.Error("Failed to convert Google Play Billing notification 'ExpiryTimeMillis' string to int", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return + w.WriteHeader(http.StatusOK) + return nil } - - purchaseTime, err := strconv.ParseInt(gResponse.StartTimeMillis, 10, 64) + uid = extUID + } else if gResponse.ObfuscatedExternalProfileId != "" { + extUID, err := uuid.FromString(gResponse.ObfuscatedExternalProfileId) if err != nil { - g.zapLogger.Error("Failed to convert Google Play Billing notification 'StartTimeMillis' string to int", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return + w.WriteHeader(http.StatusOK) + return nil } - - storageSub := &runtime.StorageSubscription{ - OriginalTransactionId: googleNotification.SubscriptionNotification.PurchaseToken, - UserID: uid, - Store: api.StoreProvider_GOOGLE_PLAY_STORE, - ProductId: googleNotification.SubscriptionNotification.SubscriptionId, - PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), - Environment: env, - ExpireTime: ParseMillisecondUnixTimestamp(expireTimeInt), - RawNotification: string(body), + uid = extUID + } else if gResponse.ProfileId != "" { + var dbUID uuid.UUID + if err = g.db.QueryRowContext(r.Context(), "SELECT id FROM users WHERE google_id = $1", gResponse.ProfileId).Scan(&dbUID); err != nil { + if errors.Is(err, sql.ErrNoRows) { + g.zapLogger.Warn("Google Play Billing subscription notification user not found", zap.String("profile_id", gResponse.ProfileId), zap.String("payload", string(body))) + w.WriteHeader(http.StatusOK) // Subscription could not be assigned to a user ID, ack and ignore it. + return nil + } + w.WriteHeader(http.StatusInternalServerError) + return nil } - + uid = dbUID + } else { + // Get user id by existing validated subscription. + purchaseToken := googleNotification.SubscriptionNotification.PurchaseToken if gResponse.LinkedPurchaseToken != "" { // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da - storageSub.OriginalTransactionId = gResponse.LinkedPurchaseToken + purchaseToken = gResponse.LinkedPurchaseToken + } + sub, err := GetSubscriptionByOriginalTransactionId(r.Context(), g.zapLogger, g.db, purchaseToken) + if err != nil || sub == nil { + w.WriteHeader(http.StatusInternalServerError) + return nil } + uid = uuid.Must(uuid.FromString(sub.UserId)) + } - if err = UpsertSubscription(r.Context(), g.db, storageSub); err != nil { - var pgErr *pgconn.PgError - if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { - // Record was inserted and the user id was not found, ignore this notification - w.WriteHeader(http.StatusOK) - return - } + env := api.StoreEnvironment_PRODUCTION + if gResponse.PurchaseType == 0 { + env = api.StoreEnvironment_SANDBOX + } - g.zapLogger.Error("Failed to store Google Play Billing notification subscription data", zap.Error(err)) - w.WriteHeader(http.StatusInternalServerError) - return + expireTimeInt, err := strconv.ParseInt(gResponse.ExpiryTimeMillis, 10, 64) + if err != nil { + g.zapLogger.Error("Failed to convert Google Play Billing notification 'ExpiryTimeMillis' string to int", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + purchaseTime, err := strconv.ParseInt(gResponse.StartTimeMillis, 10, 64) + if err != nil { + g.zapLogger.Error("Failed to convert Google Play Billing notification 'StartTimeMillis' string to int", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + storageSub := &runtime.StorageSubscription{ + OriginalTransactionId: googleNotification.SubscriptionNotification.PurchaseToken, + UserID: uid, + Store: api.StoreProvider_GOOGLE_PLAY_STORE, + ProductId: googleNotification.SubscriptionNotification.SubscriptionId, + PurchaseTime: ParseMillisecondUnixTimestamp(purchaseTime), + Environment: env, + ExpireTime: ParseMillisecondUnixTimestamp(expireTimeInt), + RawNotification: string(body), + } + + if gResponse.LinkedPurchaseToken != "" { + // https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da + storageSub.OriginalTransactionId = gResponse.LinkedPurchaseToken + } + + if err = UpsertSubscription(r.Context(), g.db, storageSub); err != nil { + var pgErr *pgconn.PgError + if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { + // Record was inserted and the user id was not found, ignore this notification + w.WriteHeader(http.StatusOK) + return nil } - w.WriteHeader(http.StatusOK) - }, nil + g.zapLogger.Error("Failed to store Google Play Billing notification subscription data", zap.Error(err)) + w.WriteHeader(http.StatusInternalServerError) + return nil + } + + w.WriteHeader(http.StatusOK) + return nil } func NewGooglePurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { diff --git a/iap/huawei.go b/iap/huawei.go index f245be66e3..df4b58d981 100644 --- a/iap/huawei.go +++ b/iap/huawei.go @@ -96,12 +96,18 @@ func (h *HuaweiPurchaseProvider) SubscriptionValidate(ctx context.Context, in *a return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } -func (h *HuaweiPurchaseProvider) HandleRefund(ctx context.Context) (http.HandlerFunc, error) { +func (h *HuaweiPurchaseProvider) HandleRefundWrapper(ctx context.Context) (http.HandlerFunc, error) { h.logger.Info("Handling refund not supported") return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported } +func (h *HuaweiPurchaseProvider) HandleRefund(ctx context.Context) error { + h.logger.Info("Handling refund not supported") + + return runtime.ErrPurchaseProviderFunctionalityNotSupported +} + func NewHuaweiPurchaseProvider(nk runtime.NakamaModule, logger runtime.Logger, db *sql.DB, config runtime.IAPConfig, zapLogger *zap.Logger) runtime.PurchaseProvider { purchaseProvider := &HuaweiPurchaseProvider{ nk: nk, diff --git a/server/console.go b/server/console.go index a40ba617a4..7627166667 100644 --- a/server/console.go +++ b/server/console.go @@ -288,7 +288,7 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D //if err != nil && provider == nil { // startupLogger.Error("Console registration failed", zap.Error(err)) //} else { - // handler, err := provider.HandleRefund(ctx) + // handler, err := provider.HandleRefundWrapper(ctx) // if err != nil { // startupLogger.Error("Console registration failed", zap.Error(err)) // } @@ -306,7 +306,7 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D //if err != nil && provider == nil { // startupLogger.Error("Console registration failed", zap.Error(err)) //} else { - // handler, err := provider.HandleRefund(ctx) + // handler, err := provider.HandleRefundWrapper(ctx) // if err != nil { // startupLogger.Error("Console registration failed", zap.Error(err)) // } diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 784fbacaed..ca82170a86 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -1410,7 +1410,8 @@ type PurchaseProvider interface { Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*StoragePurchase, error) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*StorageSubscription, error) - HandleRefund(ctx context.Context) (http.HandlerFunc, error) + HandleRefund(ctx context.Context) error + HandleRefundWrapper(ctx context.Context) (http.HandlerFunc, error) GetProviderString() string } diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go index b6e1ab76f8..a8b0364c7c 100644 --- a/vendor/golang.org/x/sys/windows/security_windows.go +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -1303,7 +1303,10 @@ func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DE return nil, err } if absoluteSDSize > 0 { - absoluteSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, absoluteSDSize)[0])) + absoluteSD = new(SECURITY_DESCRIPTOR) + if unsafe.Sizeof(*absoluteSD) < uintptr(absoluteSDSize) { + panic("sizeof(SECURITY_DESCRIPTOR) too small") + } } var ( dacl *ACL @@ -1312,19 +1315,55 @@ func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DE group *SID ) if daclSize > 0 { - dacl = (*ACL)(unsafe.Pointer(&make([]byte, daclSize)[0])) + dacl = (*ACL)(unsafe.Pointer(unsafe.SliceData(make([]byte, daclSize)))) } if saclSize > 0 { - sacl = (*ACL)(unsafe.Pointer(&make([]byte, saclSize)[0])) + sacl = (*ACL)(unsafe.Pointer(unsafe.SliceData(make([]byte, saclSize)))) } if ownerSize > 0 { - owner = (*SID)(unsafe.Pointer(&make([]byte, ownerSize)[0])) + owner = (*SID)(unsafe.Pointer(unsafe.SliceData(make([]byte, ownerSize)))) } if groupSize > 0 { - group = (*SID)(unsafe.Pointer(&make([]byte, groupSize)[0])) + group = (*SID)(unsafe.Pointer(unsafe.SliceData(make([]byte, groupSize)))) } + // We call into Windows via makeAbsoluteSD, which sets up + // pointers within absoluteSD that point to other chunks of memory + // we pass into makeAbsoluteSD, and that happens outside the view of the GC. + // We therefore take some care here to then verify the pointers are as we expect + // and set them explicitly in view of the GC. See https://go.dev/issue/73199. + // TODO: consider weak pointers once Go 1.24 is appropriate. See suggestion in https://go.dev/cl/663575. err = makeAbsoluteSD(selfRelativeSD, absoluteSD, &absoluteSDSize, dacl, &daclSize, sacl, &saclSize, owner, &ownerSize, group, &groupSize) + if err != nil { + // Don't return absoluteSD, which might be partially initialized. + return nil, err + } + // Before using any fields, verify absoluteSD is in the format we expect according to Windows. + // See https://learn.microsoft.com/en-us/windows/win32/secauthz/absolute-and-self-relative-security-descriptors + absControl, _, err := absoluteSD.Control() + if err != nil { + panic("absoluteSD: " + err.Error()) + } + if absControl&SE_SELF_RELATIVE != 0 { + panic("absoluteSD not in absolute format") + } + if absoluteSD.dacl != dacl { + panic("dacl pointer mismatch") + } + if absoluteSD.sacl != sacl { + panic("sacl pointer mismatch") + } + if absoluteSD.owner != owner { + panic("owner pointer mismatch") + } + if absoluteSD.group != group { + panic("group pointer mismatch") + } + absoluteSD.dacl = dacl + absoluteSD.sacl = sacl + absoluteSD.owner = owner + absoluteSD.group = group + return } diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 4a32543868..640f6b153f 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -870,6 +870,7 @@ const socket_error = uintptr(^uint32(0)) //sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom //sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo //sys WSASocket(af int32, typ int32, protocol int32, protoInfo *WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.WSASocketW +//sys WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) (err error) [failretval!=0] = ws2_32.WSADuplicateSocketW //sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname //sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname //sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs @@ -1698,8 +1699,9 @@ func NewNTUnicodeString(s string) (*NTUnicodeString, error) { // Slice returns a uint16 slice that aliases the data in the NTUnicodeString. func (s *NTUnicodeString) Slice() []uint16 { - slice := unsafe.Slice(s.Buffer, s.MaximumLength) - return slice[:s.Length] + // Note: this rounds the length down, if it happens + // to (incorrectly) be odd. Probably safer than rounding up. + return unsafe.Slice(s.Buffer, s.MaximumLength/2)[:s.Length/2] } func (s *NTUnicodeString) String() string { diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index ad67df2fdb..958bcf47a3 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -2700,6 +2700,8 @@ type CommTimeouts struct { // NTUnicodeString is a UTF-16 string for NT native APIs, corresponding to UNICODE_STRING. type NTUnicodeString struct { + // Note: Length and MaximumLength are in *bytes*, not uint16s. + // They should always be even. Length uint16 MaximumLength uint16 Buffer *uint16 @@ -3628,3 +3630,213 @@ const ( KLF_NOTELLSHELL = 0x00000080 KLF_SETFORPROCESS = 0x00000100 ) + +// Virtual Key codes +// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes +const ( + VK_LBUTTON = 0x01 + VK_RBUTTON = 0x02 + VK_CANCEL = 0x03 + VK_MBUTTON = 0x04 + VK_XBUTTON1 = 0x05 + VK_XBUTTON2 = 0x06 + VK_BACK = 0x08 + VK_TAB = 0x09 + VK_CLEAR = 0x0C + VK_RETURN = 0x0D + VK_SHIFT = 0x10 + VK_CONTROL = 0x11 + VK_MENU = 0x12 + VK_PAUSE = 0x13 + VK_CAPITAL = 0x14 + VK_KANA = 0x15 + VK_HANGEUL = 0x15 + VK_HANGUL = 0x15 + VK_IME_ON = 0x16 + VK_JUNJA = 0x17 + VK_FINAL = 0x18 + VK_HANJA = 0x19 + VK_KANJI = 0x19 + VK_IME_OFF = 0x1A + VK_ESCAPE = 0x1B + VK_CONVERT = 0x1C + VK_NONCONVERT = 0x1D + VK_ACCEPT = 0x1E + VK_MODECHANGE = 0x1F + VK_SPACE = 0x20 + VK_PRIOR = 0x21 + VK_NEXT = 0x22 + VK_END = 0x23 + VK_HOME = 0x24 + VK_LEFT = 0x25 + VK_UP = 0x26 + VK_RIGHT = 0x27 + VK_DOWN = 0x28 + VK_SELECT = 0x29 + VK_PRINT = 0x2A + VK_EXECUTE = 0x2B + VK_SNAPSHOT = 0x2C + VK_INSERT = 0x2D + VK_DELETE = 0x2E + VK_HELP = 0x2F + VK_LWIN = 0x5B + VK_RWIN = 0x5C + VK_APPS = 0x5D + VK_SLEEP = 0x5F + VK_NUMPAD0 = 0x60 + VK_NUMPAD1 = 0x61 + VK_NUMPAD2 = 0x62 + VK_NUMPAD3 = 0x63 + VK_NUMPAD4 = 0x64 + VK_NUMPAD5 = 0x65 + VK_NUMPAD6 = 0x66 + VK_NUMPAD7 = 0x67 + VK_NUMPAD8 = 0x68 + VK_NUMPAD9 = 0x69 + VK_MULTIPLY = 0x6A + VK_ADD = 0x6B + VK_SEPARATOR = 0x6C + VK_SUBTRACT = 0x6D + VK_DECIMAL = 0x6E + VK_DIVIDE = 0x6F + VK_F1 = 0x70 + VK_F2 = 0x71 + VK_F3 = 0x72 + VK_F4 = 0x73 + VK_F5 = 0x74 + VK_F6 = 0x75 + VK_F7 = 0x76 + VK_F8 = 0x77 + VK_F9 = 0x78 + VK_F10 = 0x79 + VK_F11 = 0x7A + VK_F12 = 0x7B + VK_F13 = 0x7C + VK_F14 = 0x7D + VK_F15 = 0x7E + VK_F16 = 0x7F + VK_F17 = 0x80 + VK_F18 = 0x81 + VK_F19 = 0x82 + VK_F20 = 0x83 + VK_F21 = 0x84 + VK_F22 = 0x85 + VK_F23 = 0x86 + VK_F24 = 0x87 + VK_NUMLOCK = 0x90 + VK_SCROLL = 0x91 + VK_OEM_NEC_EQUAL = 0x92 + VK_OEM_FJ_JISHO = 0x92 + VK_OEM_FJ_MASSHOU = 0x93 + VK_OEM_FJ_TOUROKU = 0x94 + VK_OEM_FJ_LOYA = 0x95 + VK_OEM_FJ_ROYA = 0x96 + VK_LSHIFT = 0xA0 + VK_RSHIFT = 0xA1 + VK_LCONTROL = 0xA2 + VK_RCONTROL = 0xA3 + VK_LMENU = 0xA4 + VK_RMENU = 0xA5 + VK_BROWSER_BACK = 0xA6 + VK_BROWSER_FORWARD = 0xA7 + VK_BROWSER_REFRESH = 0xA8 + VK_BROWSER_STOP = 0xA9 + VK_BROWSER_SEARCH = 0xAA + VK_BROWSER_FAVORITES = 0xAB + VK_BROWSER_HOME = 0xAC + VK_VOLUME_MUTE = 0xAD + VK_VOLUME_DOWN = 0xAE + VK_VOLUME_UP = 0xAF + VK_MEDIA_NEXT_TRACK = 0xB0 + VK_MEDIA_PREV_TRACK = 0xB1 + VK_MEDIA_STOP = 0xB2 + VK_MEDIA_PLAY_PAUSE = 0xB3 + VK_LAUNCH_MAIL = 0xB4 + VK_LAUNCH_MEDIA_SELECT = 0xB5 + VK_LAUNCH_APP1 = 0xB6 + VK_LAUNCH_APP2 = 0xB7 + VK_OEM_1 = 0xBA + VK_OEM_PLUS = 0xBB + VK_OEM_COMMA = 0xBC + VK_OEM_MINUS = 0xBD + VK_OEM_PERIOD = 0xBE + VK_OEM_2 = 0xBF + VK_OEM_3 = 0xC0 + VK_OEM_4 = 0xDB + VK_OEM_5 = 0xDC + VK_OEM_6 = 0xDD + VK_OEM_7 = 0xDE + VK_OEM_8 = 0xDF + VK_OEM_AX = 0xE1 + VK_OEM_102 = 0xE2 + VK_ICO_HELP = 0xE3 + VK_ICO_00 = 0xE4 + VK_PROCESSKEY = 0xE5 + VK_ICO_CLEAR = 0xE6 + VK_OEM_RESET = 0xE9 + VK_OEM_JUMP = 0xEA + VK_OEM_PA1 = 0xEB + VK_OEM_PA2 = 0xEC + VK_OEM_PA3 = 0xED + VK_OEM_WSCTRL = 0xEE + VK_OEM_CUSEL = 0xEF + VK_OEM_ATTN = 0xF0 + VK_OEM_FINISH = 0xF1 + VK_OEM_COPY = 0xF2 + VK_OEM_AUTO = 0xF3 + VK_OEM_ENLW = 0xF4 + VK_OEM_BACKTAB = 0xF5 + VK_ATTN = 0xF6 + VK_CRSEL = 0xF7 + VK_EXSEL = 0xF8 + VK_EREOF = 0xF9 + VK_PLAY = 0xFA + VK_ZOOM = 0xFB + VK_NONAME = 0xFC + VK_PA1 = 0xFD + VK_OEM_CLEAR = 0xFE +) + +// Mouse button constants. +// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str +const ( + FROM_LEFT_1ST_BUTTON_PRESSED = 0x0001 + RIGHTMOST_BUTTON_PRESSED = 0x0002 + FROM_LEFT_2ND_BUTTON_PRESSED = 0x0004 + FROM_LEFT_3RD_BUTTON_PRESSED = 0x0008 + FROM_LEFT_4TH_BUTTON_PRESSED = 0x0010 +) + +// Control key state constaints. +// https://docs.microsoft.com/en-us/windows/console/key-event-record-str +// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str +const ( + CAPSLOCK_ON = 0x0080 + ENHANCED_KEY = 0x0100 + LEFT_ALT_PRESSED = 0x0002 + LEFT_CTRL_PRESSED = 0x0008 + NUMLOCK_ON = 0x0020 + RIGHT_ALT_PRESSED = 0x0001 + RIGHT_CTRL_PRESSED = 0x0004 + SCROLLLOCK_ON = 0x0040 + SHIFT_PRESSED = 0x0010 +) + +// Mouse event record event flags. +// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str +const ( + MOUSE_MOVED = 0x0001 + DOUBLE_CLICK = 0x0002 + MOUSE_WHEELED = 0x0004 + MOUSE_HWHEELED = 0x0008 +) + +// Input Record Event Types +// https://learn.microsoft.com/en-us/windows/console/input-record-str +const ( + FOCUS_EVENT = 0x0010 + KEY_EVENT = 0x0001 + MENU_EVENT = 0x0008 + MOUSE_EVENT = 0x0002 + WINDOW_BUFFER_SIZE_EVENT = 0x0004 +) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 01c0716c2c..a58bc48b8e 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -511,6 +511,7 @@ var ( procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") procWSACleanup = modws2_32.NewProc("WSACleanup") + procWSADuplicateSocketW = modws2_32.NewProc("WSADuplicateSocketW") procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") procWSAIoctl = modws2_32.NewProc("WSAIoctl") @@ -4391,6 +4392,14 @@ func WSACleanup() (err error) { return } +func WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) (err error) { + r1, _, e1 := syscall.Syscall(procWSADuplicateSocketW.Addr(), 3, uintptr(s), uintptr(processID), uintptr(unsafe.Pointer(info))) + if r1 != 0 { + err = errnoErr(e1) + } + return +} + func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) { r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength))) n = int32(r0) diff --git a/vendor/modules.txt b/vendor/modules.txt index ed8f65f398..2c88f069cb 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -277,7 +277,7 @@ golang.org/x/oauth2/jwt # golang.org/x/sync v0.13.0 ## explicit; go 1.23.0 golang.org/x/sync/semaphore -# golang.org/x/sys v0.32.0 +# golang.org/x/sys v0.33.0 ## explicit; go 1.23.0 golang.org/x/sys/unix golang.org/x/sys/windows From 40d4774384f320c88685897e2f224eabcd3971fd Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Tue, 26 Aug 2025 15:34:51 +0100 Subject: [PATCH 26/28] PR comments: changed error returned if refund fn already register for certain platform, moved handling of validated purchase and subs funcs into core_purchase and core_subs --- server/api_purchase.go | 62 +-------------------------- server/api_subscription.go | 85 +------------------------------------ server/core_purchase.go | 63 +++++++++++++++++++++++++++ server/core_subscription.go | 69 ++++++++++++++++++++++++++++++ server/runtime_go.go | 2 +- 5 files changed, 135 insertions(+), 146 deletions(-) diff --git a/server/api_purchase.go b/server/api_purchase.go index 38b12911b9..9e00e3e6bb 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -16,66 +16,14 @@ package server import ( "context" - "database/sql" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" - "github.com/heroiclabs/nakama-common/runtime" "github.com/heroiclabs/nakama/v3/iap" "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" ) -func handleValidatedPurchases(ctx context.Context, db *sql.DB, storagePurchases []*runtime.StoragePurchase, persist bool) (*api.ValidatePurchaseProviderResponse, error) { - - if !persist { - //Skip storing the receipts - validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(storagePurchases)) - for _, p := range storagePurchases { - validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ - UserId: p.UserID.String(), - ProductId: p.ProductId, - TransactionId: p.TransactionId, - Store: p.Store, - PurchaseTime: timestamppb.New(p.PurchaseTime), - ProviderResponse: p.RawResponse, - Environment: p.Environment, - }) - } - - return &api.ValidatePurchaseProviderResponse{ValidatedPurchases: validatedPurchases}, nil - } - - purchases, err := iap.UpsertPurchases(ctx, db, storagePurchases) - if err != nil { - return nil, err - } - - validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(purchases)) - for _, p := range purchases { - suid := p.UserID.String() - if p.UserID.IsNil() { - suid = "" - } - validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ - UserId: suid, - ProductId: p.ProductId, - TransactionId: p.TransactionId, - Store: p.Store, - PurchaseTime: timestamppb.New(p.PurchaseTime), - CreateTime: timestamppb.New(p.CreateTime), - UpdateTime: timestamppb.New(p.UpdateTime), - ProviderResponse: p.RawResponse, - Environment: p.Environment, - }) - } - - return &api.ValidatePurchaseProviderResponse{ - ValidatedPurchases: validatedPurchases, - }, nil -} - func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseProviderResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) purchaseProvider, err := iap.GetPurchaseProvider(in.Platform, s.runtime.purchaseProviders) @@ -111,15 +59,7 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha persist = in.Persist.GetValue() } - validationPurchases, err := purchaseProvider.PurchaseValidate(ctx, in, userID.String()) - if err != nil { - return nil, err - } - - validatedPurchasesResponse, err := handleValidatedPurchases(ctx, s.db, validationPurchases, persist) - if err != nil { - return nil, err - } + validatedPurchasesResponse, err := ValidatePurchase(ctx, s.logger, s.db, purchaseProvider, in, userID, persist) if fn := s.runtime.AfterValidatePurchase(); fn != nil { afterFn := func(clientIP, clientPort string) error { diff --git a/server/api_subscription.go b/server/api_subscription.go index a61d211238..cdee8a0ada 100644 --- a/server/api_subscription.go +++ b/server/api_subscription.go @@ -16,92 +16,14 @@ package server import ( "context" - "database/sql" - "errors" "github.com/gofrs/uuid/v5" "github.com/heroiclabs/nakama-common/api" - "github.com/heroiclabs/nakama-common/runtime" "github.com/heroiclabs/nakama/v3/iap" "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" ) -func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscriptions []*runtime.StorageSubscription, persist bool, logger *zap.Logger) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { - if !persist { - validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) - for _, s := range storageSubscriptions { - validatedSubs = append(validatedSubs, &api.ValidatedSubscription{ - UserId: s.UserID.String(), - ProductId: s.ProductId, - OriginalTransactionId: s.OriginalTransactionId, - Store: api.StoreProvider_APPLE_APP_STORE, - PurchaseTime: timestamppb.New(s.PurchaseTime), - Environment: s.Environment, - Active: s.Active, - ExpiryTime: timestamppb.New(s.ExpireTime), - ProviderResponse: s.RawResponse, - ProviderNotification: s.RawNotification, - }) - } - - return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs}, nil - } - - //if err = ExecuteInTx(context.Background(), db, func(tx *sql.Tx) error { - // if err = iap.UpsertSubscription(r.Context(), tx, storageSub); err != nil { - // var pgErr *pgconn.PgError - // if errors.As(err, &pgErr) && pgErr.Code == pgerrcode.ForeignKeyViolation && strings.Contains(pgErr.Message, "user_id") { - // // User id was not found, ignore this notification - // return ErrSkipNotification - // } - // return err - // } - // return nil - //}); err != nil { - // if errors.Is(err, ErrSkipNotification) { - // w.WriteHeader(http.StatusOK) - // return - // } - // logger.Error("Failed to store Google Play Billing notification subscription data", zap.Error(err)) - // w.WriteHeader(http.StatusInternalServerError) - // return - //} - - if err := ExecuteInTx(ctx, db, func(tx *sql.Tx) error { - if err := iap.UpsertSubscriptions(ctx, tx, storageSubscriptions); err != nil { - return err - } - return nil - }); err != nil { - if errors.Is(err, ErrSkipNotification) { - logger.Error("Failed to store provider subscription data", zap.Error(err)) - return nil, err - } - } - - validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) - - for _, sub := range storageSubscriptions { - var validatedSub api.ValidatedSubscription - suid := sub.UserID.String() - if sub.UserID.IsNil() { - suid = "" - } - - validatedSub.UserId = suid - validatedSub.CreateTime = timestamppb.New(sub.CreateTime) - validatedSub.UpdateTime = timestamppb.New(sub.UpdateTime) - validatedSub.ProviderResponse = sub.RawResponse - validatedSub.ProviderNotification = sub.RawNotification - - validatedSubs = append(validatedSubs, &validatedSub) - } - - return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs}, nil -} - func (s *ApiServer) ValidateSubscription(ctx context.Context, in *api.ValidateSubscriptionRequest) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) @@ -139,13 +61,8 @@ func (s *ApiServer) ValidateSubscription(ctx context.Context, in *api.ValidateSu persist = in.Persist.GetValue() } - storageSubs, err := purchaseProvider.SubscriptionValidate(ctx, in, userID.String()) - if err != nil { - return nil, err - } - // handle upsert and persist here - response, err := handleValidatedSubscriptions(ctx, s.db, storageSubs, persist, s.logger) + response, err := ValidateSubscription(ctx, s.logger, s.db, purchaseProvider, in, userID, persist) if err != nil { return nil, err } diff --git a/server/core_purchase.go b/server/core_purchase.go index d3db1a2aa4..601248faea 100644 --- a/server/core_purchase.go +++ b/server/core_purchase.go @@ -39,6 +39,69 @@ import ( var ErrPurchasesListInvalidCursor = errors.New("purchases list cursor invalid") +func handleValidatedPurchases(ctx context.Context, db *sql.DB, storagePurchases []*runtime.StoragePurchase, persist bool) (*api.ValidatePurchaseProviderResponse, error) { + + if !persist { + //Skip storing the receipts + validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(storagePurchases)) + for _, p := range storagePurchases { + validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ + UserId: p.UserID.String(), + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + ProviderResponse: p.RawResponse, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseProviderResponse{ValidatedPurchases: validatedPurchases}, nil + } + + purchases, err := iap.UpsertPurchases(ctx, db, storagePurchases) + if err != nil { + return nil, err + } + + validatedPurchases := make([]*api.PurchaseProviderValidatedPurchase, 0, len(purchases)) + for _, p := range purchases { + suid := p.UserID.String() + if p.UserID.IsNil() { + suid = "" + } + validatedPurchases = append(validatedPurchases, &api.PurchaseProviderValidatedPurchase{ + UserId: suid, + ProductId: p.ProductId, + TransactionId: p.TransactionId, + Store: p.Store, + PurchaseTime: timestamppb.New(p.PurchaseTime), + CreateTime: timestamppb.New(p.CreateTime), + UpdateTime: timestamppb.New(p.UpdateTime), + ProviderResponse: p.RawResponse, + Environment: p.Environment, + }) + } + + return &api.ValidatePurchaseProviderResponse{ + ValidatedPurchases: validatedPurchases, + }, nil +} + +func ValidatePurchase(ctx context.Context, logger *zap.Logger, db *sql.DB, purchaseProvider runtime.PurchaseProvider, in *api.ValidatePurchaseRequest, userID uuid.UUID, persist bool) (*api.ValidatePurchaseProviderResponse, error) { + validationPurchases, err := purchaseProvider.PurchaseValidate(ctx, in, userID.String()) + if err != nil { + return nil, err + } + + validatedPurchasesResponse, err := handleValidatedPurchases(ctx, db, validationPurchases, persist) + if err != nil { + return nil, err + } + + return validatedPurchasesResponse, nil +} + func ValidatePurchasesApple(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidatePurchaseResponse, error) { validation, raw, err := iap.ValidateReceiptApple(ctx, iap.Httpc, receipt, password) if err != nil { diff --git a/server/core_subscription.go b/server/core_subscription.go index c5eb5578c1..333276683d 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -244,6 +244,75 @@ func ListSubscriptions(ctx context.Context, logger *zap.Logger, db *sql.DB, user return &api.SubscriptionList{ValidatedSubscriptions: subscriptions, Cursor: nextCursorStr, PrevCursor: prevCursorStr}, nil } +func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscriptions []*runtime.StorageSubscription, persist bool, logger *zap.Logger) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { + if !persist { + validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) + for _, s := range storageSubscriptions { + validatedSubs = append(validatedSubs, &api.ValidatedSubscription{ + UserId: s.UserID.String(), + ProductId: s.ProductId, + OriginalTransactionId: s.OriginalTransactionId, + Store: api.StoreProvider_APPLE_APP_STORE, + PurchaseTime: timestamppb.New(s.PurchaseTime), + Environment: s.Environment, + Active: s.Active, + ExpiryTime: timestamppb.New(s.ExpireTime), + ProviderResponse: s.RawResponse, + ProviderNotification: s.RawNotification, + }) + } + + return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs}, nil + } + + if err := ExecuteInTx(ctx, db, func(tx *sql.Tx) error { + if err := iap.UpsertSubscriptions(ctx, tx, storageSubscriptions); err != nil { + return err + } + return nil + }); err != nil { + if errors.Is(err, ErrSkipNotification) { + logger.Error("Failed to store provider subscription data", zap.Error(err)) + return nil, err + } + } + + validatedSubs := make([]*api.ValidatedSubscription, 0, len(storageSubscriptions)) + + for _, sub := range storageSubscriptions { + var validatedSub api.ValidatedSubscription + suid := sub.UserID.String() + if sub.UserID.IsNil() { + suid = "" + } + + validatedSub.UserId = suid + validatedSub.CreateTime = timestamppb.New(sub.CreateTime) + validatedSub.UpdateTime = timestamppb.New(sub.UpdateTime) + validatedSub.ProviderResponse = sub.RawResponse + validatedSub.ProviderNotification = sub.RawNotification + + validatedSubs = append(validatedSubs, &validatedSub) + } + + return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs}, nil +} + +func ValidateSubscription(ctx context.Context, logger *zap.Logger, db *sql.DB, purchaseProvider runtime.PurchaseProvider, in *api.ValidateSubscriptionRequest, userID uuid.UUID, persist bool) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { + storageSubs, err := purchaseProvider.SubscriptionValidate(ctx, in, userID.String()) + if err != nil { + return nil, err + } + + // handle upsert and persist here + response, err := handleValidatedSubscriptions(ctx, db, storageSubs, persist, logger) + if err != nil { + return nil, err + } + + return response, nil +} + func ValidateSubscriptionApple(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, password, receipt string, persist bool) (*api.ValidateSubscriptionResponse, error) { validation, rawResponse, err := iap.ValidateReceiptApple(ctx, iap.Httpc, receipt, password) if err != nil { diff --git a/server/runtime_go.go b/server/runtime_go.go index 86b5a651f4..971310d2cd 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -2951,7 +2951,7 @@ func (ri *RuntimeGoInitializer) RegisterRefundHandler(platform string, purchaseR _, exists := ri.refundFns[platform] if exists { - return errors.New("platform already registered") + return fmt.Errorf("refund handler for platform %q already registered", platform) } if nk, ok := ri.nk.(*RuntimeGoNakamaModule); ok { From c759fad2a847b2487bf9efd5590a6469d9dd5bc9 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Sat, 6 Sep 2025 21:28:28 +0100 Subject: [PATCH 27/28] purchase validate functions, before and after hooks added for js and lua --- server/core_purchase.go | 14 +- server/iap_apple.go | 12 +- server/iap_facebook.go | 2 +- server/iap_google.go | 17 ++- server/iap_huawei.go | 2 +- server/runtime.go | 4 +- server/runtime_go_nakama.go | 53 +++++++ server/runtime_javascript.go | 26 +++- server/runtime_javascript_init.go | 12 +- server/runtime_javascript_match_core.go | 4 +- server/runtime_javascript_nakama.go | 141 +++++++++++++++++- server/runtime_lua.go | 22 ++- server/runtime_lua_match_core.go | 4 +- server/runtime_lua_nakama.go | 133 ++++++++++++++++- .../nakama-common/runtime/runtime.go | 9 +- 15 files changed, 421 insertions(+), 34 deletions(-) diff --git a/server/core_purchase.go b/server/core_purchase.go index 601248faea..14e2dc0ec2 100644 --- a/server/core_purchase.go +++ b/server/core_purchase.go @@ -88,8 +88,18 @@ func handleValidatedPurchases(ctx context.Context, db *sql.DB, storagePurchases }, nil } -func ValidatePurchase(ctx context.Context, logger *zap.Logger, db *sql.DB, purchaseProvider runtime.PurchaseProvider, in *api.ValidatePurchaseRequest, userID uuid.UUID, persist bool) (*api.ValidatePurchaseProviderResponse, error) { - validationPurchases, err := purchaseProvider.PurchaseValidate(ctx, in, userID.String()) +func ValidatePurchase(ctx context.Context, logger *zap.Logger, db *sql.DB, purchaseProvider runtime.PurchaseProvider, in *api.ValidatePurchaseRequest, userID uuid.UUID, persist bool, overrides ...runtime.PurchaseProviderOverrides) (*api.ValidatePurchaseProviderResponse, error) { + var oRides struct { + Password string + ClientEmail string + PrivateKey string + } + + if len(overrides) > 0 { + oRides = overrides[0] + } + + validationPurchases, err := purchaseProvider.PurchaseValidate(ctx, in, userID.String(), oRides) if err != nil { return nil, err } diff --git a/server/iap_apple.go b/server/iap_apple.go index c155bd3837..10d40fdf2d 100644 --- a/server/iap_apple.go +++ b/server/iap_apple.go @@ -44,8 +44,9 @@ func (a *ApplePurchaseProvider) GetProviderString() string { return runtime.Apple.String() } -func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { - if a.config.GetApple().GetSharedPassword() == "" { +func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StoragePurchase, error) { + + if a.config.GetApple().GetSharedPassword() == "" && overrides.Password == "" { return nil, status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") } @@ -58,7 +59,12 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.Va a.logger.Error("Error parsing user ID, error: %v", err) } - validation, raw, err := iap.ValidateReceiptApple(ctx, iap.Httpc, in.Receipt, a.config.GetApple().GetSharedPassword()) + password := a.config.GetApple().GetSharedPassword() + if overrides.Password != "" { + password = overrides.Password + } + + validation, raw, err := iap.ValidateReceiptApple(ctx, iap.Httpc, in.Receipt, password) if err != nil { if err != context.Canceled { var vErr *iap.ValidationError diff --git a/server/iap_facebook.go b/server/iap_facebook.go index 16ac726559..71eb856ec0 100644 --- a/server/iap_facebook.go +++ b/server/iap_facebook.go @@ -33,7 +33,7 @@ func (f *FacebookPurchaseProvider) GetProviderString() string { return runtime.Facebook.String() } -func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { +func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StoragePurchase, error) { if f.config.GetFacebookInstant().GetAppSecret() == "" { return nil, status.Error(codes.FailedPrecondition, "Facebook Instant IAP is not configured.") } diff --git a/server/iap_google.go b/server/iap_google.go index d075565512..9a116e7f35 100644 --- a/server/iap_google.go +++ b/server/iap_google.go @@ -42,8 +42,19 @@ func (g *GooglePurchaseProvider) GetProviderString() string { return runtime.Google.String() } -func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { - if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { +func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StoragePurchase, error) { + clientEmail := g.config.GetGoogle().GetClientEmail() + privateKey := g.config.GetGoogle().GetPrivateKey() + + if overrides.ClientEmail != "" { + clientEmail = overrides.ClientEmail + } + + if overrides.PrivateKey != "" { + privateKey = overrides.PrivateKey + } + + if clientEmail == "" || privateKey == "" { return nil, status.Error(codes.FailedPrecondition, "Google IAP is not configured.") } @@ -56,7 +67,7 @@ func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V g.logger.Error("Error parsing user ID, error: %v", err) } - gResponse, gReceipt, raw, err := iap.ValidateReceiptGoogle(ctx, iap.Httpc, g.config.GetGoogle().GetClientEmail(), g.config.GetGoogle().GetPrivateKey(), in.Receipt) + gResponse, gReceipt, raw, err := iap.ValidateReceiptGoogle(ctx, iap.Httpc, clientEmail, privateKey, in.Receipt) if err != nil { if err != context.Canceled { var vErr *iap.ValidationError diff --git a/server/iap_huawei.go b/server/iap_huawei.go index 43185c703c..6850643a72 100644 --- a/server/iap_huawei.go +++ b/server/iap_huawei.go @@ -35,7 +35,7 @@ func (h *HuaweiPurchaseProvider) GetProviderString() string { return runtime.Huawei.String() } -func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*runtime.StoragePurchase, error) { +func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StoragePurchase, error) { if h.config.GetHuawei().GetPublicKey() == "" || h.config.GetHuawei().GetClientID() == "" || h.config.GetHuawei().GetClientSecret() == "" { diff --git a/server/runtime.go b/server/runtime.go index ae46f6b2d1..3aa0849aca 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -707,13 +707,13 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. return nil, nil, err } - luaModules, luaRPCFns, luaBeforeRtFns, luaAfterRtFns, luaBeforeReqFns, luaAfterReqFns, luaMatchmakerMatchedFn, luaTournamentEndFn, luaTournamentResetFn, luaLeaderboardResetFn, luaShutdownFn, luaPurchaseNotificationAppleFn, luaSubscriptionNotificationAppleFn, luaPurchaseNotificationGoogleFn, luaSubscriptionNotificationGoogleFn, luaIndexFilterFns, err := NewRuntimeProviderLua(ctx, logger, startupLogger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, allEventFns.eventFunction, runtimeConfig.Path, paths, matchProvider, storageIndex) + luaModules, luaRPCFns, luaBeforeRtFns, luaAfterRtFns, luaBeforeReqFns, luaAfterReqFns, luaMatchmakerMatchedFn, luaTournamentEndFn, luaTournamentResetFn, luaLeaderboardResetFn, luaShutdownFn, luaPurchaseNotificationAppleFn, luaSubscriptionNotificationAppleFn, luaPurchaseNotificationGoogleFn, luaSubscriptionNotificationGoogleFn, luaIndexFilterFns, err := NewRuntimeProviderLua(ctx, logger, startupLogger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, purchaseProviders, refundFns, allEventFns.eventFunction, runtimeConfig.Path, paths, matchProvider, storageIndex) if err != nil { startupLogger.Error("Error initialising Lua runtime provider", zap.Error(err)) return nil, nil, err } - jsModules, jsRPCFns, jsBeforeRtFns, jsAfterRtFns, jsBeforeReqFns, jsAfterReqFns, jsMatchmakerMatchedFn, jsTournamentEndFn, jsTournamentResetFn, jsLeaderboardResetFn, jsShutdownFn, jsPurchaseNotificationAppleFn, jsSubscriptionNotificationAppleFn, jsPurchaseNotificationGoogleFn, jsSubscriptionNotificationGoogleFn, jsIndexFilterFns, err := NewRuntimeProviderJS(ctx, logger, startupLogger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, allEventFns.eventFunction, runtimeConfig.Path, runtimeConfig.JsEntrypoint, matchProvider, storageIndex) + jsModules, jsRPCFns, jsBeforeRtFns, jsAfterRtFns, jsBeforeReqFns, jsAfterReqFns, jsMatchmakerMatchedFn, jsTournamentEndFn, jsTournamentResetFn, jsLeaderboardResetFn, jsShutdownFn, jsPurchaseNotificationAppleFn, jsSubscriptionNotificationAppleFn, jsPurchaseNotificationGoogleFn, jsSubscriptionNotificationGoogleFn, jsIndexFilterFns, err := NewRuntimeProviderJS(ctx, logger, startupLogger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, allEventFns.eventFunction, runtimeConfig.Path, runtimeConfig.JsEntrypoint, matchProvider, storageIndex, purchaseProviders, refundFns) if err != nil { startupLogger.Error("Error initialising JavaScript runtime provider", zap.Error(err)) return nil, nil, err diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index b18d4945d2..40a3570060 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -24,6 +24,8 @@ import ( "errors" "fmt" "github.com/heroiclabs/nakama/v3/iap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "os" "strings" "sync" @@ -3139,6 +3141,57 @@ func (n *RuntimeGoNakamaModule) TournamentRecordsHaystack(ctx context.Context, i return TournamentRecordsHaystack(ctx, n.logger, n.db, n.leaderboardCache, n.leaderboardRankCache, id, cursor, owner, limit, expiry) } +// @group purchases +// @summary Validates and stores the purchases present in an Apple App Store Receipt. +// @param ctx(type=context.Context) The context object represents information about the server and requester. +// @param userID(type=string) The user ID of the owner of the receipt. +// @param receipt(type=string) Base-64 encoded receipt data returned by the purchase operation itself. +// @param signature(type=string) The receipt signature +// @param platform(type=string) Platform the receipt is from +// @param persist(type=bool) Persist the purchase so that seenBefore can be computed to protect against replay attacks. +// @param passwordOverride(type=string, optional=true) Override the iap.apple.shared_password provided in your configuration. +// @return validation(*api.ValidatePurchaseResponse) The resulting successfully validated purchases. Any previously validated purchases are returned with a seenBefore flag. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeGoNakamaModule) PurchaseValidate(ctx context.Context, userID, receipt, signature, platform string, persist bool, overrides ...runtime.PurchaseProviderOverrides) (*api.ValidatePurchaseProviderResponse, error) { + purchaseProvider, err := iap.GetPurchaseProvider(platform, n.purchaseProviders) + if err != nil { + n.logger.Warn("Purchase provider not found", zap.Error(err)) + return nil, status.Error(codes.Internal, "failed to get purchase provider") + } + + uid, err := uuid.FromString(userID) + if err != nil { + return nil, errors.New("user ID must be a valid id string") + } + + if len(receipt) < 1 { + return nil, errors.New("receipt cannot be empty string") + } + + in := &api.ValidatePurchaseRequest{ + Platform: platform, + Receipt: receipt, + Signature: signature, + } + + var oRides struct { + Password string + ClientEmail string + PrivateKey string + } + + if len(overrides) > 0 { + oRides = overrides[0] + } + + validation, err := ValidatePurchase(ctx, n.logger, n.db, purchaseProvider, in, uid, persist, oRides) + if err != nil { + return nil, err + } + + return validation, nil +} + // @group purchases // @summary Validates and stores the purchases present in an Apple App Store Receipt. // @param ctx(type=context.Context) The context object represents information about the server and requester. diff --git a/server/runtime_javascript.go b/server/runtime_javascript.go index 8942661e33..c783ee8e21 100644 --- a/server/runtime_javascript.go +++ b/server/runtime_javascript.go @@ -646,7 +646,7 @@ func (rp *RuntimeProviderJS) Put(r *RuntimeJS) { } } -func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, path, entrypoint string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { +func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, path, entrypoint string, matchProvider *MatchProvider, storageIndex StorageIndex, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { startupLogger.Info("Initialising JavaScript runtime provider", zap.String("path", path), zap.String("entrypoint", entrypoint)) modCache, err := cacheJavascriptModules(startupLogger, path, entrypoint) @@ -718,10 +718,10 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger return nil, nil } - return NewRuntimeJavascriptMatchCore(logger, name, db, protojsonMarshaler, protojsonUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, localCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, matchProvider.CreateMatch, eventFn, id, node, version, stopped, mc, modCache, storageIndex) + return NewRuntimeJavascriptMatchCore(logger, name, db, protojsonMarshaler, protojsonUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, localCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, matchProvider.CreateMatch, eventFn, id, node, version, stopped, mc, modCache, storageIndex, purchaseProviders, refundFns) }) - callbacks, err := evalRuntimeModules(runtimeProviderJS, modCache, matchHandlers, matchProvider, leaderboardScheduler, storageIndex, localCache, func(mode RuntimeExecutionMode, id string) { + callbacks, err := evalRuntimeModules(runtimeProviderJS, modCache, matchHandlers, matchProvider, leaderboardScheduler, storageIndex, localCache, purchaseProviders, refundFns, func(mode RuntimeExecutionMode, id string) { switch mode { case RuntimeExecutionModeRPC: rpcFunctions[id] = func(ctx context.Context, headers, queryParams map[string][]string, userID, username string, vars map[string]string, expiry int64, sessionID, clientIP, clientPort, lang, payload string) (string, error, codes.Code) { @@ -1279,6 +1279,14 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger } return result.(*api.GetUsersRequest), nil, 0 } + case "validatepurchase": + beforeReqFunctions.beforeValidatePurchaseFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error, codes.Code) { + result, err, code := runtimeProviderJS.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) + if result == nil || err != nil { + return nil, err, code + } + return result.(*api.ValidatePurchaseRequest), nil, 0 + } case "validatepurchaseapple": beforeReqFunctions.beforeValidatePurchaseAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error, codes.Code) { result, err, code := runtimeProviderJS.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) @@ -1633,6 +1641,10 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger afterReqFunctions.afterGetUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.Users, in *api.GetUsersRequest) error { return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) } + case "validatepurchase": + afterReqFunctions.afterValidatePurchaseFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseProviderResponse, in *api.ValidatePurchaseRequest) error { + return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) + } case "validatepurchaseapple": afterReqFunctions.afterValidatePurchaseAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseAppleRequest) error { return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) @@ -1732,7 +1744,7 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger logger.Fatal("Failed to initialize JavaScript runtime", zap.Error(err)) } - nakamaModule := NewRuntimeJavascriptNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, storageIndex, localCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, eventFn, matchProvider.CreateMatch) + nakamaModule := NewRuntimeJavascriptNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, storageIndex, localCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, eventFn, matchProvider.CreateMatch, purchaseProviders, refundFns) nk, err := nakamaModule.Constructor(runtime) if err != nil { logger.Fatal("Failed to initialize JavaScript runtime", zap.Error(err)) @@ -1783,7 +1795,7 @@ func CheckRuntimeProviderJavascript(logger *zap.Logger, config Config, version s mapping: make(map[string]*jsMatchHandlers, 0), } - _, err = evalRuntimeModules(rp, modCache, matchHandlers, nil, nil, nil, nil, func(RuntimeExecutionMode, string) {}, true) + _, err = evalRuntimeModules(rp, modCache, matchHandlers, nil, nil, nil, nil, nil, nil, func(RuntimeExecutionMode, string) {}, true) if err != nil { logger.Error("Failed to load JavaScript module.", zap.Error(err)) } @@ -2412,7 +2424,7 @@ func (rp *RuntimeProviderJS) StorageIndexFilter(ctx context.Context, indexName s return filterResult, nil } -func evalRuntimeModules(rp *RuntimeProviderJS, modCache *RuntimeJSModuleCache, matchHandlers *RuntimeJavascriptMatchHandlers, matchProvider *MatchProvider, leaderboardScheduler LeaderboardScheduler, storageIndex StorageIndex, localCache *RuntimeJavascriptLocalCache, announceCallbackFn func(RuntimeExecutionMode, string), dryRun bool) (*RuntimeJavascriptCallbacks, error) { +func evalRuntimeModules(rp *RuntimeProviderJS, modCache *RuntimeJSModuleCache, matchHandlers *RuntimeJavascriptMatchHandlers, matchProvider *MatchProvider, leaderboardScheduler LeaderboardScheduler, storageIndex StorageIndex, localCache *RuntimeJavascriptLocalCache, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns, announceCallbackFn func(RuntimeExecutionMode, string), dryRun bool) (*RuntimeJavascriptCallbacks, error) { logger := rp.logger r := goja.New() @@ -2441,7 +2453,7 @@ func evalRuntimeModules(rp *RuntimeProviderJS, modCache *RuntimeJSModuleCache, m return nil, err } - nakamaModule := NewRuntimeJavascriptNakamaModule(rp.logger, rp.db, rp.protojsonMarshaler, rp.protojsonUnmarshaler, rp.config, rp.socialClient, rp.leaderboardCache, rp.leaderboardRankCache, storageIndex, localCache, leaderboardScheduler, rp.sessionRegistry, rp.sessionCache, rp.statusRegistry, rp.matchRegistry, rp.partyRegistry, rp.tracker, rp.metrics, rp.streamManager, rp.router, rp.satoriClient, rp.eventFn, matchProvider.CreateMatch) + nakamaModule := NewRuntimeJavascriptNakamaModule(rp.logger, rp.db, rp.protojsonMarshaler, rp.protojsonUnmarshaler, rp.config, rp.socialClient, rp.leaderboardCache, rp.leaderboardRankCache, storageIndex, localCache, leaderboardScheduler, rp.sessionRegistry, rp.sessionCache, rp.statusRegistry, rp.matchRegistry, rp.partyRegistry, rp.tracker, rp.metrics, rp.streamManager, rp.router, rp.satoriClient, rp.eventFn, matchProvider.CreateMatch, purchaseProviders, refundFns) nk, err := nakamaModule.Constructor(r) if err != nil { return nil, err diff --git a/server/runtime_javascript_init.go b/server/runtime_javascript_init.go index 67cd5df1ed..df3f02398f 100644 --- a/server/runtime_javascript_init.go +++ b/server/runtime_javascript_init.go @@ -256,6 +256,8 @@ func (im *RuntimeJavascriptInitModule) mappings(r *goja.Runtime) map[string]func "registerAfterUnlinkSteam": im.registerAfterUnlinkSteam(r), "registerBeforeGetUsers": im.registerBeforeGetUsers(r), "registerAfterGetUsers": im.registerAfterGetUsers(r), + "registerBeforeValidatePurchase": im.registerBeforeValidatePurchase(r), + "registerAfterValidatePurchase": im.registerAfterValidatePurchase(r), "registerBeforeValidatePurchaseApple": im.registerBeforeValidatePurchaseApple(r), "registerAfterValidatePurchaseApple": im.registerAfterValidatePurchaseApple(r), "registerBeforeValidateSubscriptionApple": im.registerBeforeValidateSubscriptionApple(r), @@ -1069,6 +1071,14 @@ func (im *RuntimeJavascriptInitModule) registerAfterGetUsers(r *goja.Runtime) fu return im.registerHook(r, RuntimeExecutionModeAfter, "registerAfterGetUsers", "getusers") } +func (im *RuntimeJavascriptInitModule) registerBeforeValidatePurchase(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return im.registerHook(r, RuntimeExecutionModeBefore, "registerBeforeValidatePurchase", "validatepurchase") +} + +func (im *RuntimeJavascriptInitModule) registerAfterValidatePurchase(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return im.registerHook(r, RuntimeExecutionModeAfter, "registerAfterValidatePurchase", "validatepurchase") +} + func (im *RuntimeJavascriptInitModule) registerBeforeValidatePurchaseApple(r *goja.Runtime) func(goja.FunctionCall) goja.Value { return im.registerHook(r, RuntimeExecutionModeBefore, "registerBeforeValidatePurchaseApple", "validatepurchaseapple") } @@ -1241,7 +1251,7 @@ func (im *RuntimeJavascriptInitModule) registerHook(r *goja.Runtime, execMode Ru } im.registerCallbackFn(execMode, lKey, fnKey) im.announceCallbackFn(execMode, lKey) - + if err = im.checkFnScope(r, fnKey); err != nil { panic(r.NewGoError(err)) } diff --git a/server/runtime_javascript_match_core.go b/server/runtime_javascript_match_core.go index 30e7d9e30b..9277d04c12 100644 --- a/server/runtime_javascript_match_core.go +++ b/server/runtime_javascript_match_core.go @@ -68,7 +68,7 @@ type RuntimeJavaScriptMatchCore struct { ctxCancelFn context.CancelFunc } -func NewRuntimeJavascriptMatchCore(logger *zap.Logger, module string, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, localCache *RuntimeJavascriptLocalCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, id uuid.UUID, node, version string, stopped *atomic.Bool, matchHandlers *jsMatchHandlers, modCache *RuntimeJSModuleCache, storageIndex StorageIndex) (RuntimeMatchCore, error) { +func NewRuntimeJavascriptMatchCore(logger *zap.Logger, module string, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, localCache *RuntimeJavascriptLocalCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, id uuid.UUID, node, version string, stopped *atomic.Bool, matchHandlers *jsMatchHandlers, modCache *RuntimeJSModuleCache, storageIndex StorageIndex, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns) (RuntimeMatchCore, error) { runtime := goja.New() jsLoggerInst, err := NewJsLogger(runtime, logger) @@ -76,7 +76,7 @@ func NewRuntimeJavascriptMatchCore(logger *zap.Logger, module string, db *sql.DB logger.Fatal("Failed to initialize JavaScript runtime", zap.Error(err)) } - nakamaModule := NewRuntimeJavascriptNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, socialClient, leaderboardCache, rankCache, storageIndex, localCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, eventFn, matchCreateFn) + nakamaModule := NewRuntimeJavascriptNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, socialClient, leaderboardCache, rankCache, storageIndex, localCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, satoriClient, eventFn, matchCreateFn, purchaseProviders, refundFns) nk, err := nakamaModule.Constructor(runtime) if err != nil { logger.Fatal("Failed to initialize JavaScript runtime", zap.Error(err)) diff --git a/server/runtime_javascript_nakama.go b/server/runtime_javascript_nakama.go index e3a68ba516..0b091f4604 100644 --- a/server/runtime_javascript_nakama.go +++ b/server/runtime_javascript_nakama.go @@ -87,9 +87,12 @@ type RuntimeJavascriptNakamaModule struct { eventFn RuntimeEventCustomFunction satori runtime.Satori + + purchaseProviders map[string]runtime.PurchaseProvider + refundFns map[string]runtime.RefundFns } -func NewRuntimeJavascriptNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, storageIndex StorageIndex, localCache *RuntimeJavascriptLocalCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, matchCreateFn RuntimeMatchCreateFunction) *RuntimeJavascriptNakamaModule { +func NewRuntimeJavascriptNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, storageIndex StorageIndex, localCache *RuntimeJavascriptLocalCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, matchCreateFn RuntimeMatchCreateFunction, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns) *RuntimeJavascriptNakamaModule { return &RuntimeJavascriptNakamaModule{ ctx: context.Background(), logger: logger, @@ -120,6 +123,9 @@ func NewRuntimeJavascriptNakamaModule(logger *zap.Logger, db *sql.DB, protojsonM matchCreateFn: matchCreateFn, satori: satoriClient, + + purchaseProviders: purchaseProviders, + refundFns: refundFns, } } @@ -256,6 +262,7 @@ func (n *RuntimeJavascriptNakamaModule) mappings(r *goja.Runtime) map[string]fun "leaderboardRecordDelete": n.leaderboardRecordDelete(r), "leaderboardsGetId": n.leaderboardsGetId(r), "leaderboardRecordsHaystack": n.leaderboardRecordsHaystack(r), + "purchaseValidate": n.purchaseValidate(r), "purchaseValidateApple": n.purchaseValidateApple(r), "purchaseValidateGoogle": n.purchaseValidateGoogle(r), "purchaseValidateHuawei": n.purchaseValidateHuawei(r), @@ -5985,6 +5992,102 @@ func (n *RuntimeJavascriptNakamaModule) leaderboardRecordsHaystack(r *goja.Runti } } +// @group purchases +// @summary Validates and stores the purchases present in an Apple App Store Receipt. +// @param userID(type=string) The user ID of the owner of the receipt. +// @param receipt(type=string) Base-64 encoded receipt data returned by the purchase operation itself. +// @param platform(type=string) platform that the purchase will be validated for +// @param signature(type=string, optional=true) The receipt signature +// @param persist(type=bool, optional=true, default=true) Persist the purchase so that seenBefore can be computed to protect against replay attacks. +// @param password(type=string, optional=true) Override the iap.apple.shared_password provided in your configuration. +// @param clientEmail(type=string, optional=true) Override the iap.google.client_email provided in your configuration. +// @param privateKey(type=string, optional=true) Override the iap.google.private_key provided in your configuration. +// @return validation(nkruntime.ValidatePurchaseResponse) The resulting successfully validated purchases. Any previously validated purchases are returned with a seenBefore flag. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeJavascriptNakamaModule) purchaseValidate(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return func(f goja.FunctionCall) goja.Value { + password := n.config.GetIAP().Apple.SharedPassword + if f.Argument(5) != goja.Undefined() { + password = getJsString(r, f.Argument(5)) + } + + if password == "" { + panic(r.NewGoError(errors.New("apple IAP is not configured"))) + } + + userID := getJsString(r, f.Argument(0)) + if userID == "" { + panic(r.NewTypeError("expects a user ID string")) + } + uid, err := uuid.FromString(userID) + if err != nil { + panic(r.NewTypeError("expects user ID to be a valid identifier")) + } + + receipt := getJsString(r, f.Argument(1)) + if receipt == "" { + panic(r.NewTypeError("expects receipt")) + } + + if f.Argument(2) == goja.Undefined() { + panic(r.NewGoError(errors.New("platform is required new"))) + } + + platform := getJsString(r, f.Argument(2)) + + signature := "" + if f.Argument(3) != goja.Undefined() { + signature = getJsString(r, f.Argument(3)) + } + + persist := true + if f.Argument(4) != goja.Undefined() && f.Argument(4) != goja.Null() { + persist = getJsBool(r, f.Argument(4)) + } + + clientEmail := n.config.GetIAP().Google.ClientEmail + privateKey := n.config.GetIAP().Google.PrivateKey + + if f.Argument(6) != goja.Undefined() { + clientEmail = getJsString(r, f.Argument(6)) + } + if f.Argument(7) != goja.Undefined() { + privateKey = getJsString(r, f.Argument(7)) + } + + if clientEmail == "" || privateKey == "" { + panic(r.NewGoError(errors.New("google IAP is not configured"))) + } + + purchaseProvider, err := iap.GetPurchaseProvider(platform, n.purchaseProviders) + if err != nil { + n.logger.Warn("Purchase provider not found", zap.Error(err)) + panic(r.NewGoError(errors.New("purchase provider not found"))) + } + + in := &api.ValidatePurchaseRequest{ + Platform: platform, + Receipt: receipt, + Signature: signature, + } + + overrides := struct { + Password string + ClientEmail string + PrivateKey string + }{Password: password, ClientEmail: clientEmail, PrivateKey: privateKey} + + validation, err := ValidatePurchase(n.ctx, n.logger, n.db, purchaseProvider, in, uid, persist, overrides) + if err != nil { + panic(r.NewGoError(fmt.Errorf("error validating Apple receipt: %s", err.Error()))) + } + + validationResult := purchaseProviderResponseToJsObject(validation) + + return r.ToValue(validationResult) + } +} + // @group purchases // @summary Validates and stores the purchases present in an Apple App Store Receipt. // @param userID(type=string) The user ID of the owner of the receipt. @@ -9837,6 +9940,18 @@ func purchaseResponseToJsObject(validation *api.ValidatePurchaseResponse) map[st return validationMap } +func purchaseProviderResponseToJsObject(validation *api.ValidatePurchaseProviderResponse) map[string]interface{} { + validatedPurchases := make([]interface{}, 0, len(validation.ValidatedPurchases)) + for _, v := range validation.ValidatedPurchases { + validatedPurchases = append(validatedPurchases, validatedPurchaseProviderToJsObject(v)) + } + + validationMap := make(map[string]interface{}, 1) + validationMap["validatedPurchases"] = validatedPurchases + + return validationMap +} + func validatedPurchaseToJsObject(purchase *api.ValidatedPurchase) map[string]interface{} { validatedPurchaseMap := make(map[string]interface{}, 11) validatedPurchaseMap["userId"] = purchase.UserId @@ -9862,6 +9977,30 @@ func validatedPurchaseToJsObject(purchase *api.ValidatedPurchase) map[string]int return validatedPurchaseMap } +func validatedPurchaseProviderToJsObject(purchase *api.PurchaseProviderValidatedPurchase) map[string]interface{} { + validatedPurchaseMap := make(map[string]interface{}, 11) + validatedPurchaseMap["userId"] = purchase.UserId + validatedPurchaseMap["productId"] = purchase.ProductId + validatedPurchaseMap["transactionId"] = purchase.TransactionId + validatedPurchaseMap["store"] = purchase.Store.String() + validatedPurchaseMap["providerResponse"] = purchase.ProviderResponse + validatedPurchaseMap["purchaseTime"] = purchase.PurchaseTime.Seconds + if purchase.CreateTime != nil { + // Create time is empty for non-persisted purchases. + validatedPurchaseMap["createTime"] = purchase.CreateTime.Seconds + } + if purchase.UpdateTime != nil { + // Update time is empty for non-persisted purchases. + validatedPurchaseMap["updateTime"] = purchase.UpdateTime.Seconds + } + if purchase.RefundTime != nil { + validatedPurchaseMap["refundTime"] = purchase.RefundTime.Seconds + } + validatedPurchaseMap["environment"] = purchase.Environment.String() + + return validatedPurchaseMap +} + func subscriptionResponseToJsObject(validation *api.ValidateSubscriptionResponse) map[string]interface{} { return map[string]interface{}{"validatedSubscription": subscriptionToJsObject(validation.ValidatedSubscription)} } diff --git a/server/runtime_lua.go b/server/runtime_lua.go index c9e48550cc..7867f742b8 100644 --- a/server/runtime_lua.go +++ b/server/runtime_lua.go @@ -114,7 +114,7 @@ type RuntimeProviderLua struct { statsCtx context.Context } -func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, rootPath string, paths []string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { +func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, satoriClient runtime.Satori, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns, eventFn RuntimeEventCustomFunction, rootPath string, paths []string, matchProvider *MatchProvider, storageIndex StorageIndex) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, RuntimeShutdownFunction, RuntimePurchaseNotificationAppleFunction, RuntimeSubscriptionNotificationAppleFunction, RuntimePurchaseNotificationGoogleFunction, RuntimeSubscriptionNotificationGoogleFunction, map[string]RuntimeStorageIndexFilterFunction, error) { startupLogger.Info("Initialising Lua runtime provider", zap.String("path", rootPath)) // Load Lua modules into memory by reading the file contents. No evaluation/execution at this stage. @@ -174,11 +174,11 @@ func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logge matchProvider.RegisterCreateFn("lua", func(ctx context.Context, logger *zap.Logger, id uuid.UUID, node string, stopped *atomic.Bool, name string) (RuntimeMatchCore, error) { - return NewRuntimeLuaMatchCore(logger, name, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, stdLibs, once, localCache, satoriClient, eventFn, nil, nil, id, node, stopped, name, matchProvider, storageIndex) + return NewRuntimeLuaMatchCore(logger, name, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, stdLibs, once, localCache, satoriClient, purchaseProviders, refundFns, eventFn, nil, nil, id, node, stopped, name, matchProvider, storageIndex) }, ) - r, err := newRuntimeLuaVM(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, stdLibs, moduleCache, once, localCache, storageIndex, satoriClient, matchProvider.CreateMatch, eventFn, func(execMode RuntimeExecutionMode, id string) { + r, err := newRuntimeLuaVM(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, stdLibs, moduleCache, once, localCache, storageIndex, satoriClient, purchaseProviders, refundFns, matchProvider.CreateMatch, eventFn, func(execMode RuntimeExecutionMode, id string) { switch execMode { case RuntimeExecutionModeRPC: rpcFunctions[id] = func(ctx context.Context, headers, queryParams map[string][]string, userID, username string, vars map[string]string, expiry int64, sessionID, clientIP, clientPort, lang, payload string) (string, error, codes.Code) { @@ -752,6 +752,14 @@ func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logge } return result.(*api.GetUsersRequest), nil, 0 } + case "validatepurchase": + beforeReqFunctions.beforeValidatePurchaseFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseRequest) (*api.ValidatePurchaseRequest, error, codes.Code) { + result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) + if result == nil || err != nil { + return nil, err, code + } + return result.(*api.ValidatePurchaseRequest), nil, 0 + } case "validatepurchaseapple": beforeReqFunctions.beforeValidatePurchaseAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseAppleRequest) (*api.ValidatePurchaseAppleRequest, error, codes.Code) { result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) @@ -1248,7 +1256,7 @@ func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logge r.Stop() runtimeProviderLua.newFn = func() *RuntimeLua { - r, err := newRuntimeLuaVM(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, stdLibs, moduleCache, once, localCache, storageIndex, satoriClient, matchProvider.CreateMatch, eventFn, nil) + r, err := newRuntimeLuaVM(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, stdLibs, moduleCache, once, localCache, storageIndex, satoriClient, purchaseProviders, refundFns, matchProvider.CreateMatch, eventFn, nil) if err != nil { logger.Fatal("Failed to initialize Lua runtime", zap.Error(err)) } @@ -2466,7 +2474,7 @@ func checkRuntimeLuaVM(logger *zap.Logger, config Config, version string, stdLib vm.Push(lua.LString(name)) vm.Call(1, 0) } - nakamaModule := NewRuntimeLuaNakamaModule(logger, nil, nil, nil, config, version, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + nakamaModule := NewRuntimeLuaNakamaModule(logger, nil, nil, nil, config, version, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) vm.PreloadModule("nakama", nakamaModule.Loader) preload := vm.GetField(vm.GetField(vm.Get(lua.EnvironIndex), "package"), "preload") @@ -2487,7 +2495,7 @@ func checkRuntimeLuaVM(logger *zap.Logger, config Config, version string, stdLib return nil } -func newRuntimeLuaVM(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, moduleCache *RuntimeLuaModuleCache, once *sync.Once, localCache *RuntimeLuaLocalCache, storageIndex StorageIndex, satoriClient runtime.Satori, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, announceCallbackFn func(RuntimeExecutionMode, string)) (*RuntimeLua, error) { +func newRuntimeLuaVM(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, moduleCache *RuntimeLuaModuleCache, once *sync.Once, localCache *RuntimeLuaLocalCache, storageIndex StorageIndex, satoriClient runtime.Satori, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, announceCallbackFn func(RuntimeExecutionMode, string)) (*RuntimeLua, error) { vm := lua.NewState(lua.Options{ CallStackSize: config.GetRuntime().GetLuaCallStackSize(), RegistrySize: config.GetRuntime().GetLuaRegistrySize(), @@ -2534,7 +2542,7 @@ func newRuntimeLuaVM(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojs callbacks.StorageIndexFilter.Store(key, fn) } } - nakamaModule := NewRuntimeLuaNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, once, localCache, storageIndex, satoriClient, matchCreateFn, eventFn, registerCallbackFn, announceCallbackFn) + nakamaModule := NewRuntimeLuaNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, once, localCache, storageIndex, satoriClient, purchaseProviders, refundFns, matchCreateFn, eventFn, registerCallbackFn, announceCallbackFn) vm.PreloadModule("nakama", nakamaModule.Loader) r := &RuntimeLua{ logger: logger, diff --git a/server/runtime_lua_match_core.go b/server/runtime_lua_match_core.go index 5f58cfe47a..5dbd398712 100644 --- a/server/runtime_lua_match_core.go +++ b/server/runtime_lua_match_core.go @@ -66,7 +66,7 @@ type RuntimeLuaMatchCore struct { ctxCancelFn context.CancelFunc } -func NewRuntimeLuaMatchCore(logger *zap.Logger, module string, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, once *sync.Once, localCache *RuntimeLuaLocalCache, satoriClient runtime.Satori, eventFn RuntimeEventCustomFunction, sharedReg, sharedGlobals *lua.LTable, id uuid.UUID, node string, stopped *atomic.Bool, name string, matchProvider *MatchProvider, storageIndex StorageIndex) (RuntimeMatchCore, error) { +func NewRuntimeLuaMatchCore(logger *zap.Logger, module string, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, once *sync.Once, localCache *RuntimeLuaLocalCache, satoriClient runtime.Satori, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns, eventFn RuntimeEventCustomFunction, sharedReg, sharedGlobals *lua.LTable, id uuid.UUID, node string, stopped *atomic.Bool, name string, matchProvider *MatchProvider, storageIndex StorageIndex) (RuntimeMatchCore, error) { // Set up the Lua VM that will handle this match. vm := lua.NewState(lua.Options{ CallStackSize: config.GetRuntime().GetLuaCallStackSize(), @@ -96,7 +96,7 @@ func NewRuntimeLuaMatchCore(logger *zap.Logger, module string, db *sql.DB, proto vm.Call(1, 0) } - nakamaModule := NewRuntimeLuaNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, once, localCache, storageIndex, satoriClient, matchProvider.CreateMatch, eventFn, nil, nil) + nakamaModule := NewRuntimeLuaNakamaModule(logger, db, protojsonMarshaler, protojsonUnmarshaler, config, version, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, sessionCache, statusRegistry, matchRegistry, partyRegistry, tracker, metrics, streamManager, router, once, localCache, storageIndex, satoriClient, purchaseProviders, refundFns, matchProvider.CreateMatch, eventFn, nil, nil) vm.PreloadModule("nakama", nakamaModule.Loader) } diff --git a/server/runtime_lua_nakama.go b/server/runtime_lua_nakama.go index 34a7d22ab1..09b4051f67 100644 --- a/server/runtime_lua_nakama.go +++ b/server/runtime_lua_nakama.go @@ -93,9 +93,12 @@ type RuntimeLuaNakamaModule struct { eventFn RuntimeEventCustomFunction satori runtime.Satori + + purchaseProviders map[string]runtime.PurchaseProvider + refundFns map[string]runtime.RefundFns } -func NewRuntimeLuaNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, once *sync.Once, localCache *RuntimeLuaLocalCache, storageIndex StorageIndex, satoriClient runtime.Satori, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, registerCallbackFn func(RuntimeExecutionMode, string, *lua.LFunction), announceCallbackFn func(RuntimeExecutionMode, string)) *RuntimeLuaNakamaModule { +func NewRuntimeLuaNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshaler *protojson.MarshalOptions, protojsonUnmarshaler *protojson.UnmarshalOptions, config Config, version string, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, sessionCache SessionCache, statusRegistry StatusRegistry, matchRegistry MatchRegistry, partyRegistry PartyRegistry, tracker Tracker, metrics Metrics, streamManager StreamManager, router MessageRouter, once *sync.Once, localCache *RuntimeLuaLocalCache, storageIndex StorageIndex, satoriClient runtime.Satori, purchaseProviders map[string]runtime.PurchaseProvider, refundFns map[string]runtime.RefundFns, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, registerCallbackFn func(RuntimeExecutionMode, string, *lua.LFunction), announceCallbackFn func(RuntimeExecutionMode, string)) *RuntimeLuaNakamaModule { return &RuntimeLuaNakamaModule{ logger: logger, db: db, @@ -129,6 +132,9 @@ func NewRuntimeLuaNakamaModule(logger *zap.Logger, db *sql.DB, protojsonMarshale eventFn: eventFn, satori: satoriClient, + + purchaseProviders: purchaseProviders, + refundFns: refundFns, } } @@ -272,6 +278,7 @@ func (n *RuntimeLuaNakamaModule) Loader(l *lua.LState) int { "leaderboard_records_haystack": n.leaderboardRecordsHaystack, "leaderboard_record_delete": n.leaderboardRecordDelete, "leaderboards_get_id": n.leaderboardsGetId, + "purchase_validate": n.purchaseValidate, "purchase_validate_apple": n.purchaseValidateApple, "purchase_validate_google": n.purchaseValidateGoogle, "purchase_validate_huawei": n.purchaseValidateHuawei, @@ -2814,6 +2821,18 @@ func purchaseValidationToLuaTable(l *lua.LState, validation *api.ValidatePurchas return validationResponseTable } +func purchaseProviderValidationToLuaTable(l *lua.LState, validation *api.ValidatePurchaseProviderResponse) *lua.LTable { + validatedPurchasesTable := l.CreateTable(len(validation.ValidatedPurchases), 0) + for i, p := range validation.ValidatedPurchases { + validatedPurchasesTable.RawSetInt(i+1, purchaseProviderToLuaTable(l, p)) + } + + validationResponseTable := l.CreateTable(0, 1) + validationResponseTable.RawSetString("validated_purchases", validatedPurchasesTable) + + return validationResponseTable +} + func purchaseToLuaTable(l *lua.LState, p *api.ValidatedPurchase) *lua.LTable { validatedPurchaseTable := l.CreateTable(0, 11) @@ -2840,6 +2859,31 @@ func purchaseToLuaTable(l *lua.LState, p *api.ValidatedPurchase) *lua.LTable { return validatedPurchaseTable } +func purchaseProviderToLuaTable(l *lua.LState, p *api.PurchaseProviderValidatedPurchase) *lua.LTable { + validatedPurchaseTable := l.CreateTable(0, 11) + + validatedPurchaseTable.RawSetString("user_id", lua.LString(p.UserId)) + validatedPurchaseTable.RawSetString("product_id", lua.LString(p.ProductId)) + validatedPurchaseTable.RawSetString("transaction_id", lua.LString(p.TransactionId)) + validatedPurchaseTable.RawSetString("store", lua.LString(p.Store.String())) + validatedPurchaseTable.RawSetString("provider_response", lua.LString(p.ProviderResponse)) + validatedPurchaseTable.RawSetString("purchase_time", lua.LNumber(p.PurchaseTime.Seconds)) + if p.CreateTime != nil { + // Create time is empty for non-persisted purchases. + validatedPurchaseTable.RawSetString("create_time", lua.LNumber(p.CreateTime.Seconds)) + } + if p.UpdateTime != nil { + // Update time is empty for non-persisted purchases. + validatedPurchaseTable.RawSetString("update_time", lua.LNumber(p.UpdateTime.Seconds)) + } + if p.RefundTime != nil { + validatedPurchaseTable.RawSetString("refund_time", lua.LNumber(p.RefundTime.Seconds)) + } + validatedPurchaseTable.RawSetString("environment", lua.LString(p.Environment.String())) + + return validatedPurchaseTable +} + func subscriptionValidationToLuaTable(l *lua.LState, validation *api.ValidateSubscriptionResponse) *lua.LTable { validatedSubscriptionResTable := l.CreateTable(0, 1) validatedSubscriptionResTable.RawSetString("validated_subscription", subscriptionToLuaTable(l, validation.ValidatedSubscription)) @@ -7670,6 +7714,93 @@ func leaderboardToLuaTable(l *lua.LState, leaderboard *api.Leaderboard) (*lua.LT return lt, nil } +// @group purchases +// @summary Validates and stores the purchases present in an Apple App Store Receipt. +// @param userID(type=string) The user ID of the owner of the receipt. +// @param receipt(type=string) Base-64 encoded receipt data returned by the purchase operation itself. +// @param platform(type=string) The platform to validate a purchase for. +// @param signature(type=string) The receipt signature +// @param persist(type=bool, optional=true, default=true) Persist the purchase so that seenBefore can be computed to protect against replay attacks. +// @param passwordOverride(type=string, optional=true) Override the iap.apple.shared_password provided in your configuration. +// @param clientEmailOverride(type=string, optional=true) Override the iap.google.client_email provided in your configuration. +// @param privateKeyOverride(type=string, optional=true) Override the iap.google.private_key provided in your configuration. +// @return validation(table) The resulting successfully validated purchases. Any previously validated purchases are returned with a seenBefore flag. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeLuaNakamaModule) purchaseValidate(l *lua.LState) int { + userID := l.CheckString(1) + if userID == "" { + l.ArgError(1, "expects user id") + return 0 + } + uid, err := uuid.FromString(userID) + if err != nil { + l.ArgError(1, "invalid user id") + return 0 + } + + receipt := l.CheckString(2) + if receipt == "" { + l.ArgError(2, "expects receipt") + return 0 + } + + platform := l.CheckString(3) + if platform == "" { + l.RaiseError("no platform passed") + return 0 + } + + signature := l.OptString(4, "") + + persist := l.OptBool(5, true) + + passwordOverride := l.OptString(6, n.config.GetIAP().Apple.SharedPassword) + if passwordOverride == "" { + l.RaiseError("Apple IAP is not configured.") + return 0 + } + + clientEmail := l.OptString(7, n.config.GetIAP().Google.ClientEmail) + if clientEmail == "" { + l.RaiseError("Google IAP is not configured.") + return 0 + } + + privateKey := l.OptString(8, n.config.GetIAP().Google.PrivateKey) + if privateKey == "" { + l.RaiseError("Google IAP is not configured.") + return 0 + } + + purchaseProvider, err := iap.GetPurchaseProvider(platform, n.purchaseProviders) + if err != nil { + n.logger.Warn("Purchase provider not found", zap.Error(err)) + l.RaiseError("failed to get purchase provider") + return 0 + } + + in := &api.ValidatePurchaseRequest{ + Platform: platform, + Receipt: receipt, + Signature: signature, + } + + overrides := struct { + Password string + ClientEmail string + PrivateKey string + }{Password: passwordOverride, ClientEmail: clientEmail, PrivateKey: privateKey} + + validation, err := ValidatePurchase(l.Context(), n.logger, n.db, purchaseProvider, in, uid, persist, overrides) + if err != nil { + l.RaiseError("error validating purchase receipt %v", err.Error()) + return 0 + } + + l.Push(purchaseProviderValidationToLuaTable(l, validation)) + return 1 +} + // @group purchases // @summary Validates and stores the purchases present in an Apple App Store Receipt. // @param userID(type=string) The user ID of the owner of the receipt. diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index ed5c35234b..343e44913a 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -1238,6 +1238,7 @@ type NakamaModule interface { LeaderboardsGetId(ctx context.Context, ids []string) ([]*api.Leaderboard, error) LeaderboardRecordsHaystack(ctx context.Context, id, ownerID string, limit int, cursor string, expiry int64) (*api.LeaderboardRecordList, error) + PurchaseValidate(ctx context.Context, userID, receipt, signature, platform string, persist bool, overrides ...PurchaseProviderOverrides) (*api.ValidatePurchaseProviderResponse, error) PurchaseValidateApple(ctx context.Context, userID, receipt string, persist bool, passwordOverride ...string) (*api.ValidatePurchaseResponse, error) PurchaseValidateGoogle(ctx context.Context, userID, receipt string, persist bool, overrides ...struct { ClientEmail string @@ -1419,9 +1420,15 @@ type FleetManagerInitializer interface { Delete(ctx context.Context, id string) error } +type PurchaseProviderOverrides struct { + Password string + ClientEmail string + PrivateKey string +} + type PurchaseProvider interface { Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) - PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string) ([]*StoragePurchase, error) + PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, overrides PurchaseProviderOverrides) ([]*StoragePurchase, error) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*StorageSubscription, error) HandleRefund(ctx context.Context) error HandleRefundWrapper(ctx context.Context) (http.HandlerFunc, error) From 6ee0155c3493f77d5b67012aea3908f9ef9a1805 Mon Sep 17 00:00:00 2001 From: Jack Hellyer Date: Mon, 8 Sep 2025 20:27:41 +0100 Subject: [PATCH 28/28] js and lua validate subscription api endpoint and runtime funcs implemented --- server/api_purchase.go | 2 +- server/console.go | 2 - server/core_subscription.go | 14 ++- server/iap_apple.go | 4 +- server/iap_facebook.go | 2 +- server/iap_google.go | 15 ++- server/iap_huawei.go | 2 +- server/runtime_go_nakama.go | 50 ++++++++- server/runtime_javascript.go | 12 +++ server/runtime_javascript_init.go | 12 ++- server/runtime_javascript_nakama.go | 101 ++++++++++++++++++ server/runtime_lua.go | 12 +++ server/runtime_lua_nakama.go | 94 ++++++++++++++++ .../nakama-common/runtime/runtime.go | 3 +- 14 files changed, 311 insertions(+), 14 deletions(-) diff --git a/server/api_purchase.go b/server/api_purchase.go index 9e00e3e6bb..e2b12ad176 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -63,7 +63,7 @@ func (s *ApiServer) ValidatePurchase(ctx context.Context, in *api.ValidatePurcha if fn := s.runtime.AfterValidatePurchase(); fn != nil { afterFn := func(clientIP, clientPort string) error { - return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, nil, in) + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validatedPurchasesResponse, in) } // Execute the after function lambda wrapped in a trace for stats measurement. diff --git a/server/console.go b/server/console.go index 50d3b700c6..1de9dce10e 100644 --- a/server/console.go +++ b/server/console.go @@ -453,14 +453,12 @@ func initPurchaseProviderRefundHooks(logger *zap.Logger, config Config, refundFn for _, platform := range runtime.AllPlatforms { refundFn, err := iap.GetRefundFn(platform.String(), refundFns) if err != nil { - logger.Error("error getting refund function", zap.Error(err)) continue } provider, err := iap.GetPurchaseProvider(platform.String(), purchaseProviders) if err != nil { - logger.Error("Error getting provider", zap.Error(err)) continue } diff --git a/server/core_subscription.go b/server/core_subscription.go index 333276683d..806d3f7d95 100644 --- a/server/core_subscription.go +++ b/server/core_subscription.go @@ -298,8 +298,18 @@ func handleValidatedSubscriptions(ctx context.Context, db *sql.DB, storageSubscr return &api.ValidatePurchaseProviderSubscriptionResponse{ValidatedSubscription: validatedSubs}, nil } -func ValidateSubscription(ctx context.Context, logger *zap.Logger, db *sql.DB, purchaseProvider runtime.PurchaseProvider, in *api.ValidateSubscriptionRequest, userID uuid.UUID, persist bool) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { - storageSubs, err := purchaseProvider.SubscriptionValidate(ctx, in, userID.String()) +func ValidateSubscription(ctx context.Context, logger *zap.Logger, db *sql.DB, purchaseProvider runtime.PurchaseProvider, in *api.ValidateSubscriptionRequest, userID uuid.UUID, persist bool, overrides ...runtime.PurchaseProviderOverrides) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { + var oRides struct { + Password string + ClientEmail string + PrivateKey string + } + + if len(overrides) > 0 { + oRides = overrides[0] + } + + storageSubs, err := purchaseProvider.SubscriptionValidate(ctx, in, userID.String(), oRides) if err != nil { return nil, err } diff --git a/server/iap_apple.go b/server/iap_apple.go index 10d40fdf2d..25faa9249b 100644 --- a/server/iap_apple.go +++ b/server/iap_apple.go @@ -152,13 +152,13 @@ func (a *ApplePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.Va } -func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { +func (a *ApplePurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StorageSubscription, error) { uuidUserID, err := uuid.FromString(userID) if err != nil { a.logger.Error("Error parsing user ID, error: %v", err) } - if a.config.GetApple().GetSharedPassword() == "" { + if a.config.GetApple().GetSharedPassword() == "" && overrides.Password == "" { return nil, status.Error(codes.FailedPrecondition, "Apple IAP is not configured.") } diff --git a/server/iap_facebook.go b/server/iap_facebook.go index 71eb856ec0..f665c1c8d0 100644 --- a/server/iap_facebook.go +++ b/server/iap_facebook.go @@ -70,7 +70,7 @@ func (f *FacebookPurchaseProvider) PurchaseValidate(ctx context.Context, in *api return []*runtime.StoragePurchase{sPurchase}, nil } -func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { +func (f *FacebookPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StorageSubscription, error) { f.logger.Info("sub validate not supported") return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported diff --git a/server/iap_google.go b/server/iap_google.go index 9a116e7f35..4804b6cd25 100644 --- a/server/iap_google.go +++ b/server/iap_google.go @@ -104,13 +104,24 @@ func (g *GooglePurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V return []*runtime.StoragePurchase{sPurchase}, nil } -func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { +func (g *GooglePurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StorageSubscription, error) { uuidUserID, err := uuid.FromString(userID) if err != nil { g.logger.Error("Error parsing user ID, error: %v", err) } - if g.config.GetGoogle().GetClientEmail() == "" || g.config.GetGoogle().GetPrivateKey() == "" { + clientEmail := g.config.GetGoogle().GetClientEmail() + privateKey := g.config.GetGoogle().GetPrivateKey() + + if overrides.ClientEmail != "" { + clientEmail = overrides.ClientEmail + } + + if overrides.PrivateKey != "" { + privateKey = overrides.PrivateKey + } + + if clientEmail == "" || privateKey == "" { return nil, status.Error(codes.FailedPrecondition, "Google IAP is not configured.") } diff --git a/server/iap_huawei.go b/server/iap_huawei.go index 6850643a72..778dd7a5f1 100644 --- a/server/iap_huawei.go +++ b/server/iap_huawei.go @@ -91,7 +91,7 @@ func (h *HuaweiPurchaseProvider) PurchaseValidate(ctx context.Context, in *api.V return []*runtime.StoragePurchase{sPurchase}, nil } -func (h *HuaweiPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*runtime.StorageSubscription, error) { +func (h *HuaweiPurchaseProvider) SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string, overrides runtime.PurchaseProviderOverrides) ([]*runtime.StorageSubscription, error) { h.logger.Info("Handling refund not supported") return nil, runtime.ErrPurchaseProviderFunctionalityNotSupported diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index 40a3570060..0391b22992 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -3149,7 +3149,7 @@ func (n *RuntimeGoNakamaModule) TournamentRecordsHaystack(ctx context.Context, i // @param signature(type=string) The receipt signature // @param platform(type=string) Platform the receipt is from // @param persist(type=bool) Persist the purchase so that seenBefore can be computed to protect against replay attacks. -// @param passwordOverride(type=string, optional=true) Override the iap.apple.shared_password provided in your configuration. +// @param overrides(type=struct, optional=true) Override the iap.apple.password and iap.google.client_email and iap.google.private_key provided in your configuration. // @return validation(*api.ValidatePurchaseResponse) The resulting successfully validated purchases. Any previously validated purchases are returned with a seenBefore flag. // @return error(error) An optional error value if an error occurred. func (n *RuntimeGoNakamaModule) PurchaseValidate(ctx context.Context, userID, receipt, signature, platform string, persist bool, overrides ...runtime.PurchaseProviderOverrides) (*api.ValidatePurchaseProviderResponse, error) { @@ -3385,6 +3385,54 @@ func (n *RuntimeGoNakamaModule) PurchaseGetByTransactionId(ctx context.Context, return iap.GetPurchaseByTransactionId(ctx, n.logger, n.db, transactionID) } +// @group subscriptions +// @summary Validates and stores the subscription present in an Apple App Store Receipt. +// @param ctx(type=context.Context) The context object represents information about the server and requester. +// @param userID(type=string) The user ID of the owner of the receipt. +// @param receipt(type=string) Base-64 encoded receipt data returned by the purchase operation itself. +// @param persist(type=bool) Persist the subscription. +// @param overrides(type=struct, optional=true) Override the iap.apple.password and iap.google.client_email and iap.google.private_key provided in your configuration. +// @return validation(*api.ValidateSubscriptionResponse) The resulting successfully validated subscription purchase. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeGoNakamaModule) SubscriptionValidate(ctx context.Context, userID, receipt, platform string, persist bool, overrides ...runtime.PurchaseProviderOverrides) (*api.ValidatePurchaseProviderSubscriptionResponse, error) { + purchaseProvider, err := iap.GetPurchaseProvider(platform, n.purchaseProviders) + if err != nil { + n.logger.Warn("Purchase provider not found", zap.Error(err)) + return nil, status.Error(codes.Internal, "failed to get purchase provider") + } + + uid, err := uuid.FromString(userID) + if err != nil { + return nil, errors.New("user ID must be a valid id string") + } + + if len(receipt) < 1 { + return nil, errors.New("receipt cannot be empty string") + } + + in := &api.ValidateSubscriptionRequest{ + Receipt: receipt, + Platform: platform, + } + + var oRides struct { + Password string + ClientEmail string + PrivateKey string + } + + if len(overrides) > 0 { + oRides = overrides[0] + } + + validation, err := ValidateSubscription(ctx, n.logger, n.db, purchaseProvider, in, uid, persist, oRides) + if err != nil { + return nil, err + } + + return validation, nil +} + // @group subscriptions // @summary Validates and stores the subscription present in an Apple App Store Receipt. // @param ctx(type=context.Context) The context object represents information about the server and requester. diff --git a/server/runtime_javascript.go b/server/runtime_javascript.go index c783ee8e21..c19975e67b 100644 --- a/server/runtime_javascript.go +++ b/server/runtime_javascript.go @@ -1319,6 +1319,14 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger } return result.(*api.ValidatePurchaseFacebookInstantRequest), nil, 0 } + case "validatesubscription": + beforeReqFunctions.beforeValidateSubscriptionFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionRequest) (*api.ValidateSubscriptionRequest, error, codes.Code) { + result, err, code := runtimeProviderJS.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) + if result == nil || err != nil { + return nil, err, code + } + return result.(*api.ValidateSubscriptionRequest), nil, 0 + } case "validatesubscriptionapple": beforeReqFunctions.beforeValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) { result, err, code := runtimeProviderJS.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) @@ -1661,6 +1669,10 @@ func NewRuntimeProviderJS(ctx context.Context, logger, startupLogger *zap.Logger afterReqFunctions.afterValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error { return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) } + case "validatesubscription": + afterReqFunctions.afterValidateSubscriptionFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseProviderSubscriptionResponse, in *api.ValidateSubscriptionRequest) error { + return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) + } case "validatesubscriptionapple": afterReqFunctions.afterValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidateSubscriptionResponse, in *api.ValidateSubscriptionAppleRequest) error { return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) diff --git a/server/runtime_javascript_init.go b/server/runtime_javascript_init.go index df3f02398f..df7f4a1177 100644 --- a/server/runtime_javascript_init.go +++ b/server/runtime_javascript_init.go @@ -258,6 +258,8 @@ func (im *RuntimeJavascriptInitModule) mappings(r *goja.Runtime) map[string]func "registerAfterGetUsers": im.registerAfterGetUsers(r), "registerBeforeValidatePurchase": im.registerBeforeValidatePurchase(r), "registerAfterValidatePurchase": im.registerAfterValidatePurchase(r), + "registerBeforeValidateSubscription": im.registerBeforeValidateSubscription(r), + "registerAfterValidateSubscription": im.registerAfterValidateSubscription(r), "registerBeforeValidatePurchaseApple": im.registerBeforeValidatePurchaseApple(r), "registerAfterValidatePurchaseApple": im.registerAfterValidatePurchaseApple(r), "registerBeforeValidateSubscriptionApple": im.registerBeforeValidateSubscriptionApple(r), @@ -1079,6 +1081,14 @@ func (im *RuntimeJavascriptInitModule) registerAfterValidatePurchase(r *goja.Run return im.registerHook(r, RuntimeExecutionModeAfter, "registerAfterValidatePurchase", "validatepurchase") } +func (im *RuntimeJavascriptInitModule) registerBeforeValidateSubscription(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return im.registerHook(r, RuntimeExecutionModeBefore, "registerBeforeValidateSubscription", "validatesubscription") +} + +func (im *RuntimeJavascriptInitModule) registerAfterValidateSubscription(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return im.registerHook(r, RuntimeExecutionModeAfter, "registerAfterValidateSubscription", "validatesubscription") +} + func (im *RuntimeJavascriptInitModule) registerBeforeValidatePurchaseApple(r *goja.Runtime) func(goja.FunctionCall) goja.Value { return im.registerHook(r, RuntimeExecutionModeBefore, "registerBeforeValidatePurchaseApple", "validatepurchaseapple") } @@ -1251,7 +1261,7 @@ func (im *RuntimeJavascriptInitModule) registerHook(r *goja.Runtime, execMode Ru } im.registerCallbackFn(execMode, lKey, fnKey) im.announceCallbackFn(execMode, lKey) - + if err = im.checkFnScope(r, fnKey); err != nil { panic(r.NewGoError(err)) } diff --git a/server/runtime_javascript_nakama.go b/server/runtime_javascript_nakama.go index 0b091f4604..2ccecc62f3 100644 --- a/server/runtime_javascript_nakama.go +++ b/server/runtime_javascript_nakama.go @@ -269,6 +269,7 @@ func (n *RuntimeJavascriptNakamaModule) mappings(r *goja.Runtime) map[string]fun "purchaseValidateFacebookInstant": n.purchaseValidateFacebookInstant(r), "purchaseGetByTransactionId": n.purchaseGetByTransactionId(r), "purchasesList": n.purchasesList(r), + "subscriptionValidate": n.subscriptionValidate(r), "subscriptionValidateApple": n.subscriptionValidateApple(r), "subscriptionValidateGoogle": n.subscriptionValidateGoogle(r), "subscriptionGetByProductId": n.subscriptionGetByProductId(r), @@ -6365,6 +6366,93 @@ func (n *RuntimeJavascriptNakamaModule) purchasesList(r *goja.Runtime) func(goja } } +// @group subscriptions +// @summary Validates and stores the subscription present in an Apple App Store Receipt. +// @param userID(type=string) The user ID of the owner of the receipt. +// @param receipt(type=string) Base-64 encoded receipt data returned by the purchase operation itself. +// @param platform(type=string) The platform the subscription belongs to. +// @param persist(type=bool, optional=true, default=true) Persist the purchase so that seenBefore can be computed to protect against replay attacks. +// @param password(type=string, optional=true) Override the iap.apple.shared_password provided in your configuration. +// @param clientEmail(type=string, optional=true) Override the iap.google.client_email provided in your configuration. +// @param privateKey(type=string, optional=true) Override the iap.google.private_key provided in your configuration. +// @return validation(nkruntime.ValidateSubscriptionResponse) The resulting successfully validated subscription. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeJavascriptNakamaModule) subscriptionValidate(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return func(f goja.FunctionCall) goja.Value { + userID := getJsString(r, f.Argument(0)) + if userID == "" { + panic(r.NewTypeError("expects a user ID string")) + } + uid, err := uuid.FromString(userID) + if err != nil { + panic(r.NewTypeError("expects user ID to be a valid identifier")) + } + + receipt := getJsString(r, f.Argument(1)) + if receipt == "" { + panic(r.NewTypeError("expects receipt")) + } + + platform := getJsString(r, f.Argument(2)) + if platform == "" { + panic(r.NewTypeError("expects platform")) + } + + persist := true + if f.Argument(3) != goja.Undefined() && f.Argument(3) != goja.Null() { + persist = getJsBool(r, f.Argument(3)) + } + + password := n.config.GetIAP().Apple.SharedPassword + if f.Argument(4) != goja.Undefined() { + password = getJsString(r, f.Argument(4)) + } + if password == "" { + panic(r.NewGoError(errors.New("apple IAP is not configured"))) + } + + clientEmail := n.config.GetIAP().Google.ClientEmail + privateKey := n.config.GetIAP().Google.PrivateKey + + if f.Argument(5) != goja.Undefined() { + clientEmail = getJsString(r, f.Argument(5)) + } + if f.Argument(6) != goja.Undefined() { + privateKey = getJsString(r, f.Argument(6)) + } + + if clientEmail == "" || privateKey == "" { + panic(r.NewGoError(errors.New("google IAP is not configured"))) + } + + purchaseProvider, err := iap.GetPurchaseProvider(platform, n.purchaseProviders) + if err != nil { + n.logger.Warn("Purchase provider not found", zap.Error(err)) + panic(r.NewGoError(errors.New("purchase provider not found"))) + } + + in := &api.ValidateSubscriptionRequest{ + Platform: platform, + Receipt: receipt, + } + + overrides := struct { + Password string + ClientEmail string + PrivateKey string + }{Password: password, ClientEmail: clientEmail, PrivateKey: privateKey} + + validation, err := ValidateSubscription(n.ctx, n.logger, n.db, purchaseProvider, in, uid, persist, overrides) + if err != nil { + panic(r.NewGoError(fmt.Errorf("error validating Apple receipt: %s", err.Error()))) + } + + validationResult := purchaseProviderSubscriptionResponseToJsObject(validation) + + return r.ToValue(validationResult) + } +} + // @group subscriptions // @summary Validates and stores the subscription present in an Apple App Store Receipt. // @param userID(type=string) The user ID of the owner of the receipt. @@ -10001,6 +10089,19 @@ func validatedPurchaseProviderToJsObject(purchase *api.PurchaseProviderValidated return validatedPurchaseMap } +func purchaseProviderSubscriptionResponseToJsObject(validation *api.ValidatePurchaseProviderSubscriptionResponse) map[string]interface{} { + validatedSubscriptions := make([]interface{}, 0, len(validation.ValidatedSubscription)) + + for _, s := range validation.ValidatedSubscription { + validatedSubscriptions = append(validatedSubscriptions, subscriptionToJsObject(s)) + } + + validationMap := make(map[string]interface{}, 1) + validationMap["validatedSubscription"] = validatedSubscriptions + + return validationMap +} + func subscriptionResponseToJsObject(validation *api.ValidateSubscriptionResponse) map[string]interface{} { return map[string]interface{}{"validatedSubscription": subscriptionToJsObject(validation.ValidatedSubscription)} } diff --git a/server/runtime_lua.go b/server/runtime_lua.go index 7867f742b8..312e85f1a2 100644 --- a/server/runtime_lua.go +++ b/server/runtime_lua.go @@ -792,6 +792,14 @@ func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logge } return result.(*api.ValidatePurchaseFacebookInstantRequest), nil, 0 } + case "validatesubscription": + beforeReqFunctions.beforeValidateSubscriptionFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionRequest) (*api.ValidateSubscriptionRequest, error, codes.Code) { + result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) + if result == nil || err != nil { + return nil, err, code + } + return result.(*api.ValidateSubscriptionRequest), nil, 0 + } case "validatesubscriptionapple": beforeReqFunctions.beforeValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) { result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) @@ -1138,6 +1146,10 @@ func NewRuntimeProviderLua(ctx context.Context, logger, startupLogger *zap.Logge afterReqFunctions.afterValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error { return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) } + case "validatesubscription": + afterReqFunctions.afterValidateSubscriptionFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseProviderSubscriptionResponse, in *api.ValidateSubscriptionRequest) error { + return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) + } case "validatesubscriptionapple": afterReqFunctions.afterValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidateSubscriptionResponse, in *api.ValidateSubscriptionAppleRequest) error { return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) diff --git a/server/runtime_lua_nakama.go b/server/runtime_lua_nakama.go index 09b4051f67..74d725031c 100644 --- a/server/runtime_lua_nakama.go +++ b/server/runtime_lua_nakama.go @@ -285,6 +285,7 @@ func (n *RuntimeLuaNakamaModule) Loader(l *lua.LState) int { "purchase_validate_facebook_instant": n.purchaseValidateFacebookInstant, "purchase_get_by_transaction_id": n.purchaseGetByTransactionId, "purchases_list": n.purchasesList, + "subscription_validate": n.subscriptionValidate, "subscription_validate_apple": n.subscriptionValidateApple, "subscription_validate_google": n.subscriptionValidateGoogle, "subscription_get_by_product_id": n.subscriptionGetByProductId, @@ -2891,6 +2892,17 @@ func subscriptionValidationToLuaTable(l *lua.LState, validation *api.ValidateSub return validatedSubscriptionResTable } +func purchaseProviderSubscriptionValidationToLuaTable(l *lua.LState, validation *api.ValidatePurchaseProviderSubscriptionResponse) *lua.LTable { + validatedSubscriptionResTable := l.CreateTable(len(validation.ValidatedSubscription), 0) + for i, s := range validation.ValidatedSubscription { + validatedSubscriptionResTable.RawSetInt(i+1, subscriptionToLuaTable(l, s)) + } + + validationResponseTable := l.CreateTable(0, 1) + validationResponseTable.RawSetString("validated_subscriptions", validatedSubscriptionResTable) + return validationResponseTable +} + func subscriptionToLuaTable(l *lua.LState, p *api.ValidatedSubscription) *lua.LTable { validatedSubscriptionTable := l.CreateTable(0, 13) validatedSubscriptionTable.RawSetString("user_id", lua.LString(p.UserId)) @@ -8065,6 +8077,88 @@ func (n *RuntimeLuaNakamaModule) purchasesList(l *lua.LState) int { return 3 } +// @group subscriptions +// @summary Validates and stores the subscription present in an Apple App Store Receipt. +// @param userID(type=string) The user ID of the owner of the receipt. +// @param receipt(type=string) Base-64 encoded receipt data returned by the subscription operation itself. +// @param persist(type=bool, optional=true, default=true) Persist the subscription. +// @param passwordOverride(type=string, optional=true) Override the iap.apple.shared_password provided in your configuration. +// @param clientEmailOverride(type=string, optional=true) Override the iap.google.client_email provided in your configuration. +// @param privateKeyOverride(type=string, optional=true) Override the iap.google.private_key provided in your configuration. +// @return validation(table) The resulting successfully validated subscriptions. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeLuaNakamaModule) subscriptionValidate(l *lua.LState) int { + userID := l.CheckString(1) + if userID == "" { + l.ArgError(1, "expects user id") + return 0 + } + uid, err := uuid.FromString(userID) + if err != nil { + l.ArgError(1, "invalid user id") + return 0 + } + + receipt := l.CheckString(2) + if receipt == "" { + l.ArgError(2, "expects receipt") + return 0 + } + + platform := l.CheckString(3) + if platform == "" { + l.RaiseError("no platform passed") + return 0 + } + + persist := l.OptBool(4, true) + + passwordOverride := l.OptString(5, n.config.GetIAP().Apple.SharedPassword) + if passwordOverride == "" { + l.RaiseError("Apple IAP is not configured.") + return 0 + } + + clientEmail := l.OptString(6, n.config.GetIAP().Google.ClientEmail) + if clientEmail == "" { + l.RaiseError("Google IAP is not configured.") + return 0 + } + + privateKey := l.OptString(7, n.config.GetIAP().Google.PrivateKey) + if privateKey == "" { + l.RaiseError("Google IAP is not configured.") + return 0 + } + + purchaseProvider, err := iap.GetPurchaseProvider(platform, n.purchaseProviders) + if err != nil { + n.logger.Warn("Purchase provider not found", zap.Error(err)) + l.RaiseError("failed to get purchase provider") + return 0 + } + + in := &api.ValidateSubscriptionRequest{ + Platform: platform, + Receipt: receipt, + } + + overrides := struct { + Password string + ClientEmail string + PrivateKey string + }{Password: passwordOverride, ClientEmail: clientEmail, PrivateKey: privateKey} + + validation, err := ValidateSubscription(l.Context(), n.logger, n.db, purchaseProvider, in, uid, persist, overrides) + if err != nil { + l.RaiseError("error validating receipt: %v", err.Error()) + return 0 + } + + l.Push(purchaseProviderSubscriptionValidationToLuaTable(l, validation)) + return 1 +} + // @group subscriptions // @summary Validates and stores the subscription present in an Apple App Store Receipt. // @param userID(type=string) The user ID of the owner of the receipt. diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 343e44913a..ab7a21e8ec 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -1249,6 +1249,7 @@ type NakamaModule interface { PurchasesList(ctx context.Context, userID string, limit int, cursor string) (*api.PurchaseList, error) PurchaseGetByTransactionId(ctx context.Context, transactionID string) (*api.ValidatedPurchase, error) + SubscriptionValidate(ctx context.Context, userID, receipt, platform string, persist bool, overrides ...PurchaseProviderOverrides) (*api.ValidatePurchaseProviderSubscriptionResponse, error) SubscriptionValidateApple(ctx context.Context, userID, receipt string, persist bool, passwordOverride ...string) (*api.ValidateSubscriptionResponse, error) SubscriptionValidateGoogle(ctx context.Context, userID, receipt string, persist bool, overrides ...struct { ClientEmail string @@ -1429,7 +1430,7 @@ type PurchaseProviderOverrides struct { type PurchaseProvider interface { Init(purchaseRefundFn PurchaseRefundFn, subscriptionRefundFn SubscriptionRefundFn) PurchaseValidate(ctx context.Context, in *api.ValidatePurchaseRequest, userID string, overrides PurchaseProviderOverrides) ([]*StoragePurchase, error) - SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string) ([]*StorageSubscription, error) + SubscriptionValidate(ctx context.Context, in *api.ValidateSubscriptionRequest, userID string, overrides PurchaseProviderOverrides) ([]*StorageSubscription, error) HandleRefund(ctx context.Context) error HandleRefundWrapper(ctx context.Context) (http.HandlerFunc, error) GetProviderString() string