From 444d593400dbbd95a4f014b9541c2ee79491309c Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 28 May 2026 14:39:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/grpc-client.go | 12 + log/backend.log | 123 ------- model/Statistics.go | 8 +- monitor/Monitor.go | 2 - msg/Gameapi.pb.go | 460 ++++++++++++++++---------- msg/Gameapi_grpc.pb.go | 38 +++ sdk/ship/main.go | 3 + sdk/ship/model/mini_game/mini_game.go | 101 ++++++ util/es.go | 26 +- util/statistics.go | 52 +++ 10 files changed, 529 insertions(+), 296 deletions(-) create mode 100644 sdk/ship/model/mini_game/mini_game.go diff --git a/client/grpc-client.go b/client/grpc-client.go index 23a66af..6b3dd79 100644 --- a/client/grpc-client.go +++ b/client/grpc-client.go @@ -195,3 +195,15 @@ func ReloadMail(AppId, ServerId int, req *msg.ReqReloadServerMail) (*msg.ResBack wrapRPCError[*msg.ResBackend], ) } + +func MiniGame(AppId, ServerId int, req *msg.ReqMiniGame) (*msg.ResMiniGame, error) { + return executeBackendCall( + AppId, + ServerId, + "MiniGameReward", + func(ctx context.Context, client msg.BackendClient) (*msg.ResMiniGame, error) { + return client.MiniGame(ctx, req) + }, + wrapRPCError[*msg.ResMiniGame], + ) +} diff --git a/log/backend.log b/log/backend.log index f6b3e0b..e69de29 100644 --- a/log/backend.log +++ b/log/backend.log @@ -1,123 +0,0 @@ -[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. - -[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - - using env: export GIN_MODE=release - - using code: gin.SetMode(gin.ReleaseMode) - -[GIN-debug] POST /api/open/apk/upload --> backend/controller.UploadApkPackage (3 handlers) -[GIN-debug] POST /api/auth/login --> backend/controller.Login (3 handlers) -[GIN-debug] GET /api/auth/Codes --> backend/controller.Codes (3 handlers) -[GIN-debug] POST /api/auth/phoneCode --> backend/controller.PhoneCode (3 handlers) -[GIN-debug] POST /api/auth/phoneLogin --> backend/controller.LoginCode (3 handlers) -[GIN-debug] POST /api/feishu/sendInfo --> backend/controller.FeishuSendInfo (3 handlers) -[GIN-debug] POST /api/feishu/sendInfo2 --> backend/controller.FeishuSendInfo2 (3 handlers) -[GIN-debug] POST /api/feishu/sendWeekInfo --> backend/controller.FeishuSendWeekInfo (3 handlers) -[GIN-debug] POST /api/feishu/updateApp --> backend/controller.FeishuUpdateApp (3 handlers) -[GIN-debug] POST /api/feishu/serverInfo --> backend/controller.FeishuServerInfo (3 handlers) -[GIN-debug] POST /api/feishu/notify --> backend/controller.FeishuNotify (3 handlers) -[GIN-debug] POST /api/feishu/notify/client --> backend/controller.FeishuNotifyClient (3 handlers) -[GIN-debug] POST /api/feishu/notify/order --> backend/controller.FeishuNotifyOrder (3 handlers) -[GIN-debug] POST /api/alibaba/zabbix/notify --> backend/controller.AlibabaNotify (3 handlers) -[GIN-debug] POST /api/alibaba/zabbix/recovery --> backend/controller.AlibabaRecovery (3 handlers) -[GIN-debug] POST /api/alibaba/game/notify --> backend/controller.AlibabaGameNotify (3 handlers) -[GIN-debug] POST /api/alibaba/notify/order --> backend/controller.AlibabaNotifyOrder (3 handlers) -[GIN-debug] GET /api/v1/experiments --> backend/controller.ExperimentList (4 handlers) -[GIN-debug] POST /api/v1/experiments --> backend/controller.ExperimentCreate (4 handlers) -[GIN-debug] PUT /api/v1/experiments/:id --> backend/controller.ExperimentUpdate (4 handlers) -[GIN-debug] DELETE /api/v1/experiments/:id --> backend/controller.ExperimentDelete (4 handlers) -[GIN-debug] GET /api/v1/experiments/:id/variants --> backend/controller.ExperimentVariantList (4 handlers) -[GIN-debug] POST /api/v1/experiments/:id/variants --> backend/controller.ExperimentVariantCreate (4 handlers) -[GIN-debug] PUT /api/v1/experiments/:id/variants/:variantId --> backend/controller.ExperimentVariantUpdate (4 handlers) -[GIN-debug] DELETE /api/v1/experiments/:id/variants/:variantId --> backend/controller.ExperimentVariantDelete (4 handlers) -[GIN-debug] GET /api/v1/experiments/:id/whitelist --> backend/controller.ExperimentWhitelistList (4 handlers) -[GIN-debug] POST /api/v1/experiments/:id/whitelist --> backend/controller.ExperimentWhitelistCreate (4 handlers) -[GIN-debug] POST /api/v1/experiments/:id/whitelist/batch --> backend/controller.ExperimentWhitelistBatchCreate (4 handlers) -[GIN-debug] DELETE /api/v1/experiments/:id/whitelist/:userId --> backend/controller.ExperimentWhitelistDelete (4 handlers) -[GIN-debug] GET /api/v1/experiments/:id/results --> backend/controller.ExperimentResult (4 handlers) -[GIN-debug] GET /api/v1/users/:userId/groups --> backend/controller.UserExperimentGroups (4 handlers) -[GIN-debug] GET /api/user/info --> backend/controller.UserInfo (4 handlers) -[GIN-debug] POST /api/statistics/info --> backend/controller.StatisticsInfo (4 handlers) -[GIN-debug] POST /api/statistics/level --> backend/controller.StatisticsLevel (4 handlers) -[GIN-debug] POST /api/statistics/order --> backend/controller.StatisticsOrder (4 handlers) -[GIN-debug] POST /api/statistics/heat --> backend/controller.StatisticsHeat (4 handlers) -[GIN-debug] POST /api/admin/list --> backend/controller.AdminList (4 handlers) -[GIN-debug] POST /api/admin/add --> backend/controller.AdminAdd (4 handlers) -[GIN-debug] POST /api/admin/edit --> backend/controller.AdminEdit (4 handlers) -[GIN-debug] POST /api/admin/delete --> backend/controller.AdminDelete (4 handlers) -[GIN-debug] POST /api/admin/log/list --> backend/controller.AdminLogList (4 handlers) -[GIN-debug] POST /api/admin/config/list --> backend/controller.AdminConfigList (4 handlers) -[GIN-debug] POST /api/admin/config/add --> backend/controller.AdminConfigAdd (4 handlers) -[GIN-debug] POST /api/admin/config/edit --> backend/controller.AdminConfigEdit (4 handlers) -[GIN-debug] POST /api/admin/usergroup/list --> backend/controller.PermissionUserGroupList (4 handlers) -[GIN-debug] POST /api/admin/usergroup/add --> backend/controller.PermissionUserGroupAdd (4 handlers) -[GIN-debug] POST /api/admin/usergroup/edit --> backend/controller.PermissionUserGroupEdit (4 handlers) -[GIN-debug] POST /api/admin/usergroup/delete --> backend/controller.PermissionUserGroupDelete (4 handlers) -[GIN-debug] POST /api/admin/usergroup/role/set --> backend/controller.PermissionGroupRoleSet (4 handlers) -[GIN-debug] POST /api/admin/usergroup/role/list --> backend/controller.PermissionGroupRoleList (4 handlers) -[GIN-debug] POST /api/admin/role/list --> backend/controller.PermissionRoleList (4 handlers) -[GIN-debug] POST /api/admin/role/add --> backend/controller.PermissionRoleAdd (4 handlers) -[GIN-debug] POST /api/admin/role/edit --> backend/controller.PermissionRoleEdit (4 handlers) -[GIN-debug] POST /api/admin/role/delete --> backend/controller.PermissionRoleDelete (4 handlers) -[GIN-debug] POST /api/admin/role/permission/set --> backend/controller.PermissionRolePermissionSet (4 handlers) -[GIN-debug] POST /api/admin/role/permission/list --> backend/controller.PermissionRolePermissionList (4 handlers) -[GIN-debug] POST /api/admin/permission/list --> backend/controller.PermissionPointList (4 handlers) -[GIN-debug] POST /api/admin/permission/add --> backend/controller.PermissionPointAdd (4 handlers) -[GIN-debug] POST /api/admin/permission/edit --> backend/controller.PermissionPointEdit (4 handlers) -[GIN-debug] POST /api/admin/permission/delete --> backend/controller.PermissionPointDelete (4 handlers) -[GIN-debug] POST /api/admin/user/group/list --> backend/controller.PermissionUserGroupRelList (4 handlers) -[GIN-debug] POST /api/admin/user/group/set --> backend/controller.PermissionUserGroupRelSet (4 handlers) -[GIN-debug] POST /api/admin/user/permission/list --> backend/controller.PermissionUserPermissionList (4 handlers) -[GIN-debug] POST /api/admin/user/permission/set --> backend/controller.PermissionUserPermissionSet (4 handlers) -[GIN-debug] POST /api/admin/user/role/list --> backend/controller.PermissionUserRoleList (4 handlers) -[GIN-debug] POST /api/admin/user/role/batch-list --> backend/controller.PermissionUserRoleBatchList (4 handlers) -[GIN-debug] POST /api/log/user --> backend/controller.UserDetail (4 handlers) -[GIN-debug] POST /api/log/asset --> backend/controller.Asset (4 handlers) -[GIN-debug] POST /api/log/event --> backend/controller.Event (4 handlers) -[GIN-debug] POST /api/log/loginCountByMonth --> backend/controller.LoginCountByMonth (4 handlers) -[GIN-debug] POST /api/log/order --> backend/controller.Order (4 handlers) -[GIN-debug] POST /api/user/list --> backend/controller.UserList (4 handlers) -[GIN-debug] POST /api/user/gm --> backend/controller.UserGM (4 handlers) -[GIN-debug] POST /api/user/ban --> backend/controller.UserBan (4 handlers) -[GIN-debug] POST /api/server/list --> backend/controller.AppList (4 handlers) -[GIN-debug] POST /api/server/serverList --> backend/controller.ServerList (4 handlers) -[GIN-debug] POST /api/server/addServer --> backend/controller.AddServer (4 handlers) -[GIN-debug] POST /api/server/nodeList --> backend/controller.NodeList (4 handlers) -[GIN-debug] POST /api/server/addNode --> backend/controller.AddNode (4 handlers) -[GIN-debug] POST /api/server/editServer --> backend/controller.EditServer (4 handlers) -[GIN-debug] POST /api/server/updateApp --> backend/controller.UpdateApp (4 handlers) -[GIN-debug] POST /api/server/updateAppReview --> backend/controller.UpdateAppReview (4 handlers) -[GIN-debug] POST /api/server/updateAppFeishu --> backend/controller.UpdateAppFeishu (4 handlers) -[GIN-debug] POST /api/server/restart --> backend/controller.RestartServer (4 handlers) -[GIN-debug] POST /api/server/reload --> backend/controller.ReloadServer (4 handlers) -[GIN-debug] POST /api/activity/list --> backend/controller.ActivityList (4 handlers) -[GIN-debug] POST /api/activity/edit --> backend/controller.ActivityEdit (4 handlers) -[GIN-debug] POST /api/activity/add --> backend/controller.ActivityAdd (4 handlers) -[GIN-debug] POST /api/activity/delete --> backend/controller.ActivityDelete (4 handlers) -[GIN-debug] POST /api/activity/sync --> backend/controller.ActivitySync (4 handlers) -[GIN-debug] POST /api/mail/send --> backend/controller.SendMail (4 handlers) -[GIN-debug] POST /api/mail/list --> backend/controller.MailList (4 handlers) -[GIN-debug] POST /api/mail/delete --> backend/controller.MailDelete (4 handlers) -[GIN-debug] POST /api/operation/copyUser --> backend/controller.CopyUser (4 handlers) -[GIN-debug] GET /api/apk/packages --> backend/controller.GetApkPackages (4 handlers) -[GIN-debug] GET /api/apk/download/:env --> backend/controller.DownloadApkPackage (4 handlers) -[GIN-debug] POST /api/language/list --> backend/controller.Language (4 handlers) -[GIN-debug] POST /api/language/export --> backend/controller.LanguageExport (4 handlers) -[GIN-debug] POST /api/language/save --> backend/controller.LanguageSave (4 handlers) -[GIN-debug] POST /api/language/add --> backend/controller.LanguageAdd (4 handlers) -[GIN-debug] POST /api/language/delete --> backend/controller.LanguageDelete (4 handlers) -[GIN-debug] GET /api/config/notification --> backend/controller.NotificationConfigGet (4 handlers) -[GIN-debug] PUT /api/config/notification/update --> backend/controller.NotificationConfigSave (4 handlers) -[GIN-debug] POST /api/scripts/copywriting --> backend/controller.Copywriting (4 handlers) -[GIN-debug] POST /api/scripts/copyonline --> backend/controller.CopyOnline (4 handlers) -[GIN-debug] POST /api/scripts/clientImageGitPull --> backend/controller.ClientImageGitPull (4 handlers) -[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. -Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details. -[GIN-debug] Listening and serving HTTP on :5320 -2026/05/07 15:32:59 apk uploaded env=prod packageType=without_sdk file=prod_v1.0.73_20260430_1423_656bd841f_#78.apk size=282603268 -[GIN] 2026/05/07 - 15:32:59 | 200 | 6.29s | ::1 | POST "/api/open/apk/upload" -2026/05/07 15:33:00 monitor server failed, AppId=2, ServerId=0, err=method1 and method2 both failed, method1Err=ServerInfo failed: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 112.124.54.243:0: connectex: The requested address is not valid in its context.", method2Err=failed to send admin message: failed to read from websocket: websocket: close 1006 (abnormal closure): unexpected EOF -2026/05/07 15:33:03 monitor server failed, AppId=0, ServerId=0, err=method1 and method2 both failed, method1Err=dial tcp 101.132.170.198:0: connectex: The requested address is not valid in its context., method2Err=dial tcp 101.132.170.198:0: connectex: The requested address is not valid in its context. -[GIN] 2026/05/07 - 15:33:04 | 200 | 92.07ms | ::1 | GET "/api/apk/packages" -2026/05/07 15:33:05 monitor server failed, AppId=4, ServerId=1, err=method1 and method2 both failed, method1Err=ServerInfo failed: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 1.15.182.107:0: connectex: The requested address is not valid in its context.", method2Err=failed to get websocket: failed to connect to websocket: dial tcp 112.124.54.243:4701: i/o timeout -2026/05/07 15:33:06 monitor server failed, AppId=1, ServerId=3, err=method1 and method2 both failed, method1Err=ServerInfo failed: rpc error: code = DeadlineExceeded desc = received context error while waiting for new LB policy update: context deadline exceeded, method2Err=failed to send admin message: failed to read from websocket: websocket: close 1006 (abnormal closure): unexpected EOF -2026/05/07 15:33:06 monitor server failed, AppId=2, ServerId=3, err=method1 and method2 both failed, method1Err=ServerInfo failed: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 112.124.54.243:50063: connectex: No connection could be made because the target machine actively refused it.", method2Err=dial tcp 112.124.54.243:3653: connectex: No connection could be made because the target machine actively refused it. diff --git a/model/Statistics.go b/model/Statistics.go index dde0a4a..ccd62ec 100644 --- a/model/Statistics.go +++ b/model/Statistics.go @@ -73,12 +73,18 @@ func (s *Statistics) StatisticsLevel() (interface{}, error) { } func (s *Statistics) StatisticsInfo() (interface{}, error) { + remainRate, remainErr := util.GetYesterdaySecondRemainRateRealtime(s.AppId) + if remainErr != nil { + remainRate = 0 + } + statisticsInfoCache.mu.RLock() if entry, ok := statisticsInfoCache.items[s.AppId]; ok && time.Now().Before(entry.expireAt) { cached := make(map[string]interface{}, len(entry.data)) for k, v := range entry.data { cached[k] = v } + cached["remain"] = remainRate statisticsInfoCache.mu.RUnlock() return cached, nil } @@ -102,7 +108,7 @@ func (s *Statistics) StatisticsInfo() (interface{}, error) { "totalRecharge": totalRechargeFloat, "rechargeUser": overview.RechargeUser, "totalRechargeUser": overview.TotalRechargeUser, - "remain": 0, + "remain": remainRate, } statisticsInfoCache.mu.Lock() diff --git a/monitor/Monitor.go b/monitor/Monitor.go index f23360e..f95c087 100644 --- a/monitor/Monitor.go +++ b/monitor/Monitor.go @@ -9,7 +9,6 @@ import ( "backend/util" "errors" "fmt" - "log" "net" "time" @@ -71,7 +70,6 @@ func monitorServerInfo() { } go func(v *Type.ServerInfo) { if err := monitorServerByFallback(v); err != nil { - log.Printf("monitor server failed, AppId=%d, ServerId=%d, err=%v", v.AppId, v.ServerId, err) markServerOffline(v.AppId, v.ServerId) } }(v) diff --git a/msg/Gameapi.pb.go b/msg/Gameapi.pb.go index db6b8ba..0329136 100644 --- a/msg/Gameapi.pb.go +++ b/msg/Gameapi.pb.go @@ -30760,6 +30760,118 @@ func (x *ResBackend) GetMsg() string { return "" } +type ReqMiniGame struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 游戏id + Score int32 `protobuf:"varint,2,opt,name=Score,proto3" json:"Score,omitempty"` // 游戏分数 + Uid int64 `protobuf:"varint,3,opt,name=Uid,proto3" json:"Uid,omitempty"` // 玩家id + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReqMiniGame) Reset() { + *x = ReqMiniGame{} + mi := &file_proto_Gameapi_proto_msgTypes[520] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReqMiniGame) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReqMiniGame) ProtoMessage() {} + +func (x *ReqMiniGame) ProtoReflect() protoreflect.Message { + mi := &file_proto_Gameapi_proto_msgTypes[520] + 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 ReqMiniGame.ProtoReflect.Descriptor instead. +func (*ReqMiniGame) Descriptor() ([]byte, []int) { + return file_proto_Gameapi_proto_rawDescGZIP(), []int{520} +} + +func (x *ReqMiniGame) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *ReqMiniGame) GetScore() int32 { + if x != nil { + return x.Score + } + return 0 +} + +func (x *ReqMiniGame) GetUid() int64 { + if x != nil { + return x.Uid + } + return 0 +} + +type ResMiniGame struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code int32 `protobuf:"varint,1,opt,name=Code,proto3" json:"Code,omitempty"` + Msg string `protobuf:"bytes,2,opt,name=Msg,proto3" json:"Msg,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResMiniGame) Reset() { + *x = ResMiniGame{} + mi := &file_proto_Gameapi_proto_msgTypes[521] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResMiniGame) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResMiniGame) ProtoMessage() {} + +func (x *ResMiniGame) ProtoReflect() protoreflect.Message { + mi := &file_proto_Gameapi_proto_msgTypes[521] + 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 ResMiniGame.ProtoReflect.Descriptor instead. +func (*ResMiniGame) Descriptor() ([]byte, []int) { + return file_proto_Gameapi_proto_rawDescGZIP(), []int{521} +} + +func (x *ResMiniGame) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *ResMiniGame) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + var File_proto_Gameapi_proto protoreflect.FileDescriptor const file_proto_Gameapi_proto_rawDesc = "" + @@ -33051,6 +33163,13 @@ const file_proto_Gameapi_proto_rawDesc = "" + "\n" + "ResBackend\x12\x12\n" + "\x04Code\x18\x01 \x01(\x05R\x04Code\x12\x10\n" + + "\x03Msg\x18\x02 \x01(\tR\x03Msg\"E\n" + + "\vReqMiniGame\x12\x0e\n" + + "\x02Id\x18\x01 \x01(\x05R\x02Id\x12\x14\n" + + "\x05Score\x18\x02 \x01(\x05R\x05Score\x12\x10\n" + + "\x03Uid\x18\x03 \x01(\x03R\x03Uid\"3\n" + + "\vResMiniGame\x12\x12\n" + + "\x04Code\x18\x01 \x01(\x05R\x04Code\x12\x10\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg*\xab\f\n" + "\x0eITEM_POP_LABEL\x12\f\n" + "\bPlayroom\x10\x00\x12\r\n" + @@ -33299,7 +33418,7 @@ const file_proto_Gameapi_proto_rawDesc = "" + "\x1cFRIEND_REPLY_HANDLE_ERR_TYPE\x12\b\n" + "\x04NONE\x10\x00\x12\n" + "\n" + - "\x06CATNIP\x10\x012\x96\x04\n" + + "\x06CATNIP\x10\x012\xd0\x04\n" + "\aBackend\x12P\n" + "\x0eReloadActivity\x12\x1e.tutorial.ReqActivityCfgReload\x1a\x1e.tutorial.ResActivityCfgReload\x12G\n" + "\rOrderShipping\x12\x1a.tutorial.ReqOrderShipping\x1a\x1a.tutorial.ResOrderShipping\x12@\n" + @@ -33311,7 +33430,8 @@ const file_proto_Gameapi_proto_rawDesc = "" + "\tBanPlayer\x12\x15.tutorial.ReqAdminBan\x1a\x14.tutorial.ResBackend\x12A\n" + "\n" + "ReloadMail\x12\x1d.tutorial.ReqReloadServerMail\x1a\x14.tutorial.ResBackend\x129\n" + - "\fServerReload\x12\x13.tutorial.ReqReload\x1a\x14.tutorial.ResBackendB\bZ\x06../msgb\x06proto3" + "\fServerReload\x12\x13.tutorial.ReqReload\x1a\x14.tutorial.ResBackend\x128\n" + + "\bMiniGame\x12\x15.tutorial.ReqMiniGame\x1a\x15.tutorial.ResMiniGameB\bZ\x06../msgb\x06proto3" var ( file_proto_Gameapi_proto_rawDescOnce sync.Once @@ -33326,7 +33446,7 @@ func file_proto_Gameapi_proto_rawDescGZIP() []byte { } var file_proto_Gameapi_proto_enumTypes = make([]protoimpl.EnumInfo, 14) -var file_proto_Gameapi_proto_msgTypes = make([]protoimpl.MessageInfo, 597) +var file_proto_Gameapi_proto_msgTypes = make([]protoimpl.MessageInfo, 599) var file_proto_Gameapi_proto_goTypes = []any{ (ITEM_POP_LABEL)(0), // 0: tutorial.ITEM_POP_LABEL (HANDLE_TYPE)(0), // 1: tutorial.HANDLE_TYPE @@ -33862,121 +33982,123 @@ var file_proto_Gameapi_proto_goTypes = []any{ (*ResServerInfo)(nil), // 531: tutorial.ResServerInfo (*ResAdminGm)(nil), // 532: tutorial.ResAdminGm (*ResBackend)(nil), // 533: tutorial.ResBackend - nil, // 534: tutorial.ResChessColorData.MChessColorDataEntry - nil, // 535: tutorial.UpdateBaseItemInfo.MUpdateItemEntry - nil, // 536: tutorial.ResPlayerChessData.MChessDataEntry - nil, // 537: tutorial.ReqPutPartInBag.MChessDataEntry - nil, // 538: tutorial.UpdatePlayerChessData.MChessDataEntry - nil, // 539: tutorial.ReqSeparateChess.MChessDataEntry - nil, // 540: tutorial.ReqUpgradeChess.MChessDataEntry - nil, // 541: tutorial.ReqGetChessFromBuff.MChessDataEntry - nil, // 542: tutorial.ReqChessEx.MChessDataEntry - nil, // 543: tutorial.ReqSourceChest.MChessDataEntry - nil, // 544: tutorial.ReqPlayroomOutline.MChessDataEntry - nil, // 545: tutorial.ReqPutChessInBag.MChessDataEntry - nil, // 546: tutorial.ReqTakeChessOutBag.MChessDataEntry - nil, // 547: tutorial.ResPlayerBriefProfileData.SetEmojiEntry - nil, // 548: tutorial.UserInfo.SetEmojiEntry - nil, // 549: tutorial.ReqRewardOrder.MChessDataEntry - nil, // 550: tutorial.ResCardInfo.AllCardEntry - nil, // 551: tutorial.ResCardInfo.HandbookEntry - nil, // 552: tutorial.ResGuideInfo.RewardEntry - nil, // 553: tutorial.ResGuideTask.TaskEntry - nil, // 554: tutorial.ResDailyTask.WeekRewardEntry - nil, // 555: tutorial.ResDailyTask.DailyTaskEntry - nil, // 556: tutorial.ResLimitEvent.LimitEventListEntry - nil, // 557: tutorial.ResLimitEventProgress.ProgressRewardEntry - nil, // 558: tutorial.LimitEvent.ParamEntry - nil, // 559: tutorial.ReqLimitEventLuckyCat.MChessDataEntry - nil, // 560: tutorial.ResFriendPlayerSimple.EmojiEntry - nil, // 561: tutorial.ResFriendPlayerSimple.PlayroomEntry - nil, // 562: tutorial.ResFriendPlayerSimple.DressSetEntry - nil, // 563: tutorial.ResFriendPlayerSimple.PhysiologyEntry - nil, // 564: tutorial.ResPlayerSimple.EmojiEntry - nil, // 565: tutorial.ResPlayerRank.PlayroomSetEntry - nil, // 566: tutorial.ResPlayerRank.DressSetEntry - nil, // 567: tutorial.ResKv.KvEntry - nil, // 568: tutorial.ResRank.RankListEntry - nil, // 569: tutorial.ResMailList.MailListEntry - nil, // 570: tutorial.ResCharge.SpecialShopEntry - nil, // 571: tutorial.ResCharge.ChessShopEntry - nil, // 572: tutorial.ResCharge.GiftEntry - nil, // 573: tutorial.ResCharge.WeeklyDiscountEntry - nil, // 574: tutorial.ReqBuyChessShop2.MChessDataEntry - nil, // 575: tutorial.ResEndless.EndlessListEntry - nil, // 576: tutorial.ResChampshipRank.RankListEntry - nil, // 577: tutorial.ResChampshipPreRank.RankListEntry - nil, // 578: tutorial.ResNotifyCard.CardEntry - nil, // 579: tutorial.ResNotifyCard.MasterEntry - nil, // 580: tutorial.ResNotifyCard.HandbookEntry - nil, // 581: tutorial.ResMining.MapEntry - nil, // 582: tutorial.ResMining.PassRewardEntry - nil, // 583: tutorial.ReqMiningTake.MapEntry - nil, // 584: tutorial.ResActRed.RedEntry - nil, // 585: tutorial.ResItem.ItemEntry - nil, // 586: tutorial.ItemNotify.ItemEntry - nil, // 587: tutorial.ResGuessColor.OMapEntry - nil, // 588: tutorial.ReqGuessColorTake.OMapEntry - nil, // 589: tutorial.GuessColorInfo.MapEntry - nil, // 590: tutorial.ResPlayroom.PlayroomEntry - nil, // 591: tutorial.ResPlayroom.MoodEntry - nil, // 592: tutorial.ResPlayroom.PhysiologyEntry - nil, // 593: tutorial.ResPlayroom.DressEntry - nil, // 594: tutorial.ResPlayroom.DressSetEntry - nil, // 595: tutorial.ResPlayroom.WeeklyDiscountEntry - nil, // 596: tutorial.ReqPlayroomDressSet.DressSetEntry - nil, // 597: tutorial.NotifyPlayroomMood.MoodEntry - nil, // 598: tutorial.NotifyPlayroomMood.PhysiologyEntry - nil, // 599: tutorial.ResPlayroomInfo.PlayroomEntry - nil, // 600: tutorial.ResPlayroomInfo.ItemsEntry - nil, // 601: tutorial.ResPlayroomInfo.FlipEntry - nil, // 602: tutorial.ResPlayroomInfo.EmojiEntry - nil, // 603: tutorial.ResPlayroomInfo.DressSetEntry - nil, // 604: tutorial.ResPlayroomGame.ItemsEntry - nil, // 605: tutorial.ReqPlayroomSetRoom.PlayroomEntry - nil, // 606: tutorial.MiningCfg.GemEntry - nil, // 607: tutorial.MiningCfg.JackpotEntry - nil, // 608: tutorial.MiningCfg.PassEntry - nil, // 609: tutorial.ResUserDetailInfo.ChessMapEntry - nil, // 610: tutorial.ResUserDetailInfo.ChessBufferEntry + (*ReqMiniGame)(nil), // 534: tutorial.ReqMiniGame + (*ResMiniGame)(nil), // 535: tutorial.ResMiniGame + nil, // 536: tutorial.ResChessColorData.MChessColorDataEntry + nil, // 537: tutorial.UpdateBaseItemInfo.MUpdateItemEntry + nil, // 538: tutorial.ResPlayerChessData.MChessDataEntry + nil, // 539: tutorial.ReqPutPartInBag.MChessDataEntry + nil, // 540: tutorial.UpdatePlayerChessData.MChessDataEntry + nil, // 541: tutorial.ReqSeparateChess.MChessDataEntry + nil, // 542: tutorial.ReqUpgradeChess.MChessDataEntry + nil, // 543: tutorial.ReqGetChessFromBuff.MChessDataEntry + nil, // 544: tutorial.ReqChessEx.MChessDataEntry + nil, // 545: tutorial.ReqSourceChest.MChessDataEntry + nil, // 546: tutorial.ReqPlayroomOutline.MChessDataEntry + nil, // 547: tutorial.ReqPutChessInBag.MChessDataEntry + nil, // 548: tutorial.ReqTakeChessOutBag.MChessDataEntry + nil, // 549: tutorial.ResPlayerBriefProfileData.SetEmojiEntry + nil, // 550: tutorial.UserInfo.SetEmojiEntry + nil, // 551: tutorial.ReqRewardOrder.MChessDataEntry + nil, // 552: tutorial.ResCardInfo.AllCardEntry + nil, // 553: tutorial.ResCardInfo.HandbookEntry + nil, // 554: tutorial.ResGuideInfo.RewardEntry + nil, // 555: tutorial.ResGuideTask.TaskEntry + nil, // 556: tutorial.ResDailyTask.WeekRewardEntry + nil, // 557: tutorial.ResDailyTask.DailyTaskEntry + nil, // 558: tutorial.ResLimitEvent.LimitEventListEntry + nil, // 559: tutorial.ResLimitEventProgress.ProgressRewardEntry + nil, // 560: tutorial.LimitEvent.ParamEntry + nil, // 561: tutorial.ReqLimitEventLuckyCat.MChessDataEntry + nil, // 562: tutorial.ResFriendPlayerSimple.EmojiEntry + nil, // 563: tutorial.ResFriendPlayerSimple.PlayroomEntry + nil, // 564: tutorial.ResFriendPlayerSimple.DressSetEntry + nil, // 565: tutorial.ResFriendPlayerSimple.PhysiologyEntry + nil, // 566: tutorial.ResPlayerSimple.EmojiEntry + nil, // 567: tutorial.ResPlayerRank.PlayroomSetEntry + nil, // 568: tutorial.ResPlayerRank.DressSetEntry + nil, // 569: tutorial.ResKv.KvEntry + nil, // 570: tutorial.ResRank.RankListEntry + nil, // 571: tutorial.ResMailList.MailListEntry + nil, // 572: tutorial.ResCharge.SpecialShopEntry + nil, // 573: tutorial.ResCharge.ChessShopEntry + nil, // 574: tutorial.ResCharge.GiftEntry + nil, // 575: tutorial.ResCharge.WeeklyDiscountEntry + nil, // 576: tutorial.ReqBuyChessShop2.MChessDataEntry + nil, // 577: tutorial.ResEndless.EndlessListEntry + nil, // 578: tutorial.ResChampshipRank.RankListEntry + nil, // 579: tutorial.ResChampshipPreRank.RankListEntry + nil, // 580: tutorial.ResNotifyCard.CardEntry + nil, // 581: tutorial.ResNotifyCard.MasterEntry + nil, // 582: tutorial.ResNotifyCard.HandbookEntry + nil, // 583: tutorial.ResMining.MapEntry + nil, // 584: tutorial.ResMining.PassRewardEntry + nil, // 585: tutorial.ReqMiningTake.MapEntry + nil, // 586: tutorial.ResActRed.RedEntry + nil, // 587: tutorial.ResItem.ItemEntry + nil, // 588: tutorial.ItemNotify.ItemEntry + nil, // 589: tutorial.ResGuessColor.OMapEntry + nil, // 590: tutorial.ReqGuessColorTake.OMapEntry + nil, // 591: tutorial.GuessColorInfo.MapEntry + nil, // 592: tutorial.ResPlayroom.PlayroomEntry + nil, // 593: tutorial.ResPlayroom.MoodEntry + nil, // 594: tutorial.ResPlayroom.PhysiologyEntry + nil, // 595: tutorial.ResPlayroom.DressEntry + nil, // 596: tutorial.ResPlayroom.DressSetEntry + nil, // 597: tutorial.ResPlayroom.WeeklyDiscountEntry + nil, // 598: tutorial.ReqPlayroomDressSet.DressSetEntry + nil, // 599: tutorial.NotifyPlayroomMood.MoodEntry + nil, // 600: tutorial.NotifyPlayroomMood.PhysiologyEntry + nil, // 601: tutorial.ResPlayroomInfo.PlayroomEntry + nil, // 602: tutorial.ResPlayroomInfo.ItemsEntry + nil, // 603: tutorial.ResPlayroomInfo.FlipEntry + nil, // 604: tutorial.ResPlayroomInfo.EmojiEntry + nil, // 605: tutorial.ResPlayroomInfo.DressSetEntry + nil, // 606: tutorial.ResPlayroomGame.ItemsEntry + nil, // 607: tutorial.ReqPlayroomSetRoom.PlayroomEntry + nil, // 608: tutorial.MiningCfg.GemEntry + nil, // 609: tutorial.MiningCfg.JackpotEntry + nil, // 610: tutorial.MiningCfg.PassEntry + nil, // 611: tutorial.ResUserDetailInfo.ChessMapEntry + nil, // 612: tutorial.ResUserDetailInfo.ChessBufferEntry } var file_proto_Gameapi_proto_depIdxs = []int32{ - 534, // 0: tutorial.ResChessColorData.mChessColorData:type_name -> tutorial.ResChessColorData.MChessColorDataEntry + 536, // 0: tutorial.ResChessColorData.mChessColorData:type_name -> tutorial.ResChessColorData.MChessColorDataEntry 5, // 1: tutorial.ReqLogin.type:type_name -> tutorial.LOGIN_TYPE 2, // 2: tutorial.ResId2Verify.ResultCode:type_name -> tutorial.RES_CODE - 535, // 3: tutorial.UpdateBaseItemInfo.mUpdateItem:type_name -> tutorial.UpdateBaseItemInfo.MUpdateItemEntry - 536, // 4: tutorial.ResPlayerChessData.mChessData:type_name -> tutorial.ResPlayerChessData.MChessDataEntry + 537, // 3: tutorial.UpdateBaseItemInfo.mUpdateItem:type_name -> tutorial.UpdateBaseItemInfo.MUpdateItemEntry + 538, // 4: tutorial.ResPlayerChessData.mChessData:type_name -> tutorial.ResPlayerChessData.MChessDataEntry 74, // 5: tutorial.ResPlayerChessInfo.ChessBag:type_name -> tutorial.ChessBag 55, // 6: tutorial.ResPlayerChessInfo.PartBag:type_name -> tutorial.PartBag 2, // 7: tutorial.ResGetChessRetireReward.code:type_name -> tutorial.RES_CODE 56, // 8: tutorial.PartBag.PartBagGrids:type_name -> tutorial.PartBagGrid - 537, // 9: tutorial.ReqPutPartInBag.mChessData:type_name -> tutorial.ReqPutPartInBag.MChessDataEntry + 539, // 9: tutorial.ReqPutPartInBag.mChessData:type_name -> tutorial.ReqPutPartInBag.MChessDataEntry 2, // 10: tutorial.ResPutPartInBag.code:type_name -> tutorial.RES_CODE 1, // 11: tutorial.ChessHandle.type:type_name -> tutorial.HANDLE_TYPE - 538, // 12: tutorial.UpdatePlayerChessData.mChessData:type_name -> tutorial.UpdatePlayerChessData.MChessDataEntry + 540, // 12: tutorial.UpdatePlayerChessData.mChessData:type_name -> tutorial.UpdatePlayerChessData.MChessDataEntry 59, // 13: tutorial.UpdatePlayerChessData.mChessHandle:type_name -> tutorial.ChessHandle 2, // 14: tutorial.ResUpdatePlayerChessData.code:type_name -> tutorial.RES_CODE - 539, // 15: tutorial.ReqSeparateChess.mChessData:type_name -> tutorial.ReqSeparateChess.MChessDataEntry + 541, // 15: tutorial.ReqSeparateChess.mChessData:type_name -> tutorial.ReqSeparateChess.MChessDataEntry 2, // 16: tutorial.ResSeparateChess.code:type_name -> tutorial.RES_CODE - 540, // 17: tutorial.ReqUpgradeChess.mChessData:type_name -> tutorial.ReqUpgradeChess.MChessDataEntry + 542, // 17: tutorial.ReqUpgradeChess.mChessData:type_name -> tutorial.ReqUpgradeChess.MChessDataEntry 2, // 18: tutorial.ResUpgradeChess.code:type_name -> tutorial.RES_CODE - 541, // 19: tutorial.ReqGetChessFromBuff.mChessData:type_name -> tutorial.ReqGetChessFromBuff.MChessDataEntry + 543, // 19: tutorial.ReqGetChessFromBuff.mChessData:type_name -> tutorial.ReqGetChessFromBuff.MChessDataEntry 2, // 20: tutorial.ResGetChessFromBuff.code:type_name -> tutorial.RES_CODE 7, // 21: tutorial.ReqChessEx.Type:type_name -> tutorial.CHESS_EX_TYPE - 542, // 22: tutorial.ReqChessEx.mChessData:type_name -> tutorial.ReqChessEx.MChessDataEntry + 544, // 22: tutorial.ReqChessEx.mChessData:type_name -> tutorial.ReqChessEx.MChessDataEntry 2, // 23: tutorial.ResChessEx.code:type_name -> tutorial.RES_CODE - 543, // 24: tutorial.ReqSourceChest.mChessData:type_name -> tutorial.ReqSourceChest.MChessDataEntry + 545, // 24: tutorial.ReqSourceChest.mChessData:type_name -> tutorial.ReqSourceChest.MChessDataEntry 2, // 25: tutorial.ResSourceChest.code:type_name -> tutorial.RES_CODE - 544, // 26: tutorial.ReqPlayroomOutline.mChessData:type_name -> tutorial.ReqPlayroomOutline.MChessDataEntry + 546, // 26: tutorial.ReqPlayroomOutline.mChessData:type_name -> tutorial.ReqPlayroomOutline.MChessDataEntry 2, // 27: tutorial.ResPlayroomOutline.code:type_name -> tutorial.RES_CODE 75, // 28: tutorial.ChessBag.ChessBagGrids:type_name -> tutorial.ChessBagGrid - 545, // 29: tutorial.ReqPutChessInBag.mChessData:type_name -> tutorial.ReqPutChessInBag.MChessDataEntry + 547, // 29: tutorial.ReqPutChessInBag.mChessData:type_name -> tutorial.ReqPutChessInBag.MChessDataEntry 2, // 30: tutorial.ResPutChessInBag.code:type_name -> tutorial.RES_CODE - 546, // 31: tutorial.ReqTakeChessOutBag.mChessData:type_name -> tutorial.ReqTakeChessOutBag.MChessDataEntry + 548, // 31: tutorial.ReqTakeChessOutBag.mChessData:type_name -> tutorial.ReqTakeChessOutBag.MChessDataEntry 2, // 32: tutorial.ResTakeChessOutBag.code:type_name -> tutorial.RES_CODE 2, // 33: tutorial.ResTakeChessOutBagToHonor.code:type_name -> tutorial.RES_CODE 2, // 34: tutorial.ResBuyChessBagGrid.code:type_name -> tutorial.RES_CODE - 547, // 35: tutorial.ResPlayerBriefProfileData.SetEmoji:type_name -> tutorial.ResPlayerBriefProfileData.SetEmojiEntry + 549, // 35: tutorial.ResPlayerBriefProfileData.SetEmoji:type_name -> tutorial.ResPlayerBriefProfileData.SetEmojiEntry 2, // 36: tutorial.ResSetEnergyMul.ResultCode:type_name -> tutorial.RES_CODE 8, // 37: tutorial.ReqLang.Lang:type_name -> tutorial.LANG_TYPE 2, // 38: tutorial.ResLang.ResultCode:type_name -> tutorial.RES_CODE @@ -33984,7 +34106,7 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 195, // 40: tutorial.UserInfo.AvatarList:type_name -> tutorial.AvatarInfo 191, // 41: tutorial.UserInfo.FaceList:type_name -> tutorial.FaceInfo 198, // 42: tutorial.UserInfo.EmojiList:type_name -> tutorial.EmojiInfo - 548, // 43: tutorial.UserInfo.SetEmoji:type_name -> tutorial.UserInfo.SetEmojiEntry + 550, // 43: tutorial.UserInfo.SetEmoji:type_name -> tutorial.UserInfo.SetEmojiEntry 2, // 44: tutorial.ResSetName.ResultCode:type_name -> tutorial.RES_CODE 2, // 45: tutorial.ResSetPetName.ResultCode:type_name -> tutorial.RES_CODE 2, // 46: tutorial.ResBuyEnergy.Code:type_name -> tutorial.RES_CODE @@ -33992,7 +34114,7 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 2, // 48: tutorial.ResGetHandbookReward.Code:type_name -> tutorial.RES_CODE 105, // 49: tutorial.Handbook.Handbooks:type_name -> tutorial.HandbookInfo 2, // 50: tutorial.ResHandbookAllReward.Code:type_name -> tutorial.RES_CODE - 549, // 51: tutorial.ReqRewardOrder.mChessData:type_name -> tutorial.ReqRewardOrder.MChessDataEntry + 551, // 51: tutorial.ReqRewardOrder.mChessData:type_name -> tutorial.ReqRewardOrder.MChessDataEntry 2, // 52: tutorial.ResRewardOrder.Code:type_name -> tutorial.RES_CODE 2, // 53: tutorial.ResDelOrder.Code:type_name -> tutorial.RES_CODE 171, // 54: tutorial.Order.Items:type_name -> tutorial.ItemInfo @@ -34003,8 +34125,8 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 2, // 59: tutorial.ResDecorateAll.Code:type_name -> tutorial.RES_CODE 2, // 60: tutorial.ResAreaReward.Code:type_name -> tutorial.RES_CODE 127, // 61: tutorial.ResCardInfo.CardList:type_name -> tutorial.Card - 550, // 62: tutorial.ResCardInfo.AllCard:type_name -> tutorial.ResCardInfo.AllCardEntry - 551, // 63: tutorial.ResCardInfo.Handbook:type_name -> tutorial.ResCardInfo.HandbookEntry + 552, // 62: tutorial.ResCardInfo.AllCard:type_name -> tutorial.ResCardInfo.AllCardEntry + 553, // 63: tutorial.ResCardInfo.Handbook:type_name -> tutorial.ResCardInfo.HandbookEntry 2, // 64: tutorial.ResCardSeasonFirstReward.Code:type_name -> tutorial.RES_CODE 2, // 65: tutorial.ResCardHandbookReward.Code:type_name -> tutorial.RES_CODE 2, // 66: tutorial.ResMasterCard.Code:type_name -> tutorial.RES_CODE @@ -34023,16 +34145,16 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 2, // 79: tutorial.ResGetFriendCard.Code:type_name -> tutorial.RES_CODE 2, // 80: tutorial.ResGuideReward.Code:type_name -> tutorial.RES_CODE 2, // 81: tutorial.ResGuidePlayroom.Code:type_name -> tutorial.RES_CODE - 552, // 82: tutorial.ResGuideInfo.Reward:type_name -> tutorial.ResGuideInfo.RewardEntry + 554, // 82: tutorial.ResGuideInfo.Reward:type_name -> tutorial.ResGuideInfo.RewardEntry 171, // 83: tutorial.ResItemPop.Items:type_name -> tutorial.ItemInfo 173, // 84: tutorial.ResItemPop.CardPacks:type_name -> tutorial.CardPack 171, // 85: tutorial.ItemList.List:type_name -> tutorial.ItemInfo - 553, // 86: tutorial.ResGuideTask.Task:type_name -> tutorial.ResGuideTask.TaskEntry + 555, // 86: tutorial.ResGuideTask.Task:type_name -> tutorial.ResGuideTask.TaskEntry 183, // 87: tutorial.GuideTask.Progress:type_name -> tutorial.QuestProgress 2, // 88: tutorial.ResGetGuideTaskReward.Code:type_name -> tutorial.RES_CODE 2, // 89: tutorial.ResGetGuideActiveReward.Code:type_name -> tutorial.RES_CODE - 554, // 90: tutorial.ResDailyTask.WeekReward:type_name -> tutorial.ResDailyTask.WeekRewardEntry - 555, // 91: tutorial.ResDailyTask.DailyTask:type_name -> tutorial.ResDailyTask.DailyTaskEntry + 556, // 90: tutorial.ResDailyTask.WeekReward:type_name -> tutorial.ResDailyTask.WeekRewardEntry + 557, // 91: tutorial.ResDailyTask.DailyTask:type_name -> tutorial.ResDailyTask.DailyTaskEntry 171, // 92: tutorial.DailyWeek.Items:type_name -> tutorial.ItemInfo 183, // 93: tutorial.DailyTask.Progress:type_name -> tutorial.QuestProgress 171, // 94: tutorial.DailyTask.Items:type_name -> tutorial.ItemInfo @@ -34054,33 +34176,33 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 208, // 110: tutorial.ResActivity.ActiveList:type_name -> tutorial.ActivityInfo 2, // 111: tutorial.ResActivityReward.Code:type_name -> tutorial.RES_CODE 2, // 112: tutorial.ResAddGiftReward.Code:type_name -> tutorial.RES_CODE - 556, // 113: tutorial.ResLimitEvent.LimitEventList:type_name -> tutorial.ResLimitEvent.LimitEventListEntry - 557, // 114: tutorial.ResLimitEventProgress.ProgressReward:type_name -> tutorial.ResLimitEventProgress.ProgressRewardEntry + 558, // 113: tutorial.ResLimitEvent.LimitEventList:type_name -> tutorial.ResLimitEvent.LimitEventListEntry + 559, // 114: tutorial.ResLimitEventProgress.ProgressReward:type_name -> tutorial.ResLimitEventProgress.ProgressRewardEntry 2, // 115: tutorial.ResLimitEventReward.Code:type_name -> tutorial.RES_CODE 2, // 116: tutorial.ResSelectLimitEvent.Code:type_name -> tutorial.RES_CODE - 558, // 117: tutorial.LimitEvent.Param:type_name -> tutorial.LimitEvent.ParamEntry - 559, // 118: tutorial.ReqLimitEventLuckyCat.mChessData:type_name -> tutorial.ReqLimitEventLuckyCat.MChessDataEntry + 560, // 117: tutorial.LimitEvent.Param:type_name -> tutorial.LimitEvent.ParamEntry + 561, // 118: tutorial.ReqLimitEventLuckyCat.mChessData:type_name -> tutorial.ReqLimitEventLuckyCat.MChessDataEntry 2, // 119: tutorial.ResLimitEventLuckyCat.Code:type_name -> tutorial.RES_CODE 2, // 120: tutorial.ResLimitSenceReward.Code:type_name -> tutorial.RES_CODE 171, // 121: tutorial.ResChessRainReward.Items:type_name -> tutorial.ItemInfo 2, // 122: tutorial.ResFastProduceReward.Code:type_name -> tutorial.RES_CODE 2, // 123: tutorial.ResCatTrickReward.Code:type_name -> tutorial.RES_CODE 237, // 124: tutorial.ResSearchPlayer.List:type_name -> tutorial.ResPlayerSimple - 560, // 125: tutorial.ResFriendPlayerSimple.Emoji:type_name -> tutorial.ResFriendPlayerSimple.EmojiEntry - 561, // 126: tutorial.ResFriendPlayerSimple.Playroom:type_name -> tutorial.ResFriendPlayerSimple.PlayroomEntry - 562, // 127: tutorial.ResFriendPlayerSimple.DressSet:type_name -> tutorial.ResFriendPlayerSimple.DressSetEntry + 562, // 125: tutorial.ResFriendPlayerSimple.Emoji:type_name -> tutorial.ResFriendPlayerSimple.EmojiEntry + 563, // 126: tutorial.ResFriendPlayerSimple.Playroom:type_name -> tutorial.ResFriendPlayerSimple.PlayroomEntry + 564, // 127: tutorial.ResFriendPlayerSimple.DressSet:type_name -> tutorial.ResFriendPlayerSimple.DressSetEntry 238, // 128: tutorial.ResFriendPlayerSimple.Last:type_name -> tutorial.ActLog - 563, // 129: tutorial.ResFriendPlayerSimple.Physiology:type_name -> tutorial.ResFriendPlayerSimple.PhysiologyEntry - 564, // 130: tutorial.ResPlayerSimple.Emoji:type_name -> tutorial.ResPlayerSimple.EmojiEntry - 565, // 131: tutorial.ResPlayerRank.PlayroomSet:type_name -> tutorial.ResPlayerRank.PlayroomSetEntry - 566, // 132: tutorial.ResPlayerRank.DressSet:type_name -> tutorial.ResPlayerRank.DressSetEntry + 565, // 129: tutorial.ResFriendPlayerSimple.Physiology:type_name -> tutorial.ResFriendPlayerSimple.PhysiologyEntry + 566, // 130: tutorial.ResPlayerSimple.Emoji:type_name -> tutorial.ResPlayerSimple.EmojiEntry + 567, // 131: tutorial.ResPlayerRank.PlayroomSet:type_name -> tutorial.ResPlayerRank.PlayroomSetEntry + 568, // 132: tutorial.ResPlayerRank.DressSet:type_name -> tutorial.ResPlayerRank.DressSetEntry 238, // 133: tutorial.ResPlayerRank.Last:type_name -> tutorial.ActLog 237, // 134: tutorial.ResFriendLog.Player:type_name -> tutorial.ResPlayerSimple 240, // 135: tutorial.NotifyFriendLog.info:type_name -> tutorial.ResFriendLog 242, // 136: tutorial.NotifyFriendLog.Bubble:type_name -> tutorial.FriendBubbleInfo 171, // 137: tutorial.FriendBubbleInfo.Items:type_name -> tutorial.ItemInfo 244, // 138: tutorial.NotifyFriendCard.Info:type_name -> tutorial.ResFriendCard - 567, // 139: tutorial.ResKv.kv:type_name -> tutorial.ResKv.KvEntry + 569, // 139: tutorial.ResKv.kv:type_name -> tutorial.ResKv.KvEntry 2, // 140: tutorial.ResFriendByCode.Code:type_name -> tutorial.RES_CODE 237, // 141: tutorial.ResFriendByCode.Player:type_name -> tutorial.ResPlayerSimple 237, // 142: tutorial.ResFriendRecommend.List:type_name -> tutorial.ResPlayerSimple @@ -34109,27 +34231,27 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 237, // 165: tutorial.ResAgreeFriend.Player:type_name -> tutorial.ResPlayerSimple 2, // 166: tutorial.ResRefuseFriend.Code:type_name -> tutorial.RES_CODE 2, // 167: tutorial.ResDelFriend.Code:type_name -> tutorial.RES_CODE - 568, // 168: tutorial.ResRank.RankList:type_name -> tutorial.ResRank.RankListEntry - 569, // 169: tutorial.ResMailList.MailList:type_name -> tutorial.ResMailList.MailListEntry + 570, // 168: tutorial.ResRank.RankList:type_name -> tutorial.ResRank.RankListEntry + 571, // 169: tutorial.ResMailList.MailList:type_name -> tutorial.ResMailList.MailListEntry 171, // 170: tutorial.MailInfo.Items:type_name -> tutorial.ItemInfo 293, // 171: tutorial.MailNotify.Info:type_name -> tutorial.MailInfo 2, // 172: tutorial.ResReadMail.Code:type_name -> tutorial.RES_CODE 2, // 173: tutorial.ResGetMailReward.Code:type_name -> tutorial.RES_CODE 2, // 174: tutorial.ResDeleteMail.Code:type_name -> tutorial.RES_CODE - 570, // 175: tutorial.ResCharge.SpecialShop:type_name -> tutorial.ResCharge.SpecialShopEntry - 571, // 176: tutorial.ResCharge.ChessShop:type_name -> tutorial.ResCharge.ChessShopEntry - 572, // 177: tutorial.ResCharge.Gift:type_name -> tutorial.ResCharge.GiftEntry + 572, // 175: tutorial.ResCharge.SpecialShop:type_name -> tutorial.ResCharge.SpecialShopEntry + 573, // 176: tutorial.ResCharge.ChessShop:type_name -> tutorial.ResCharge.ChessShopEntry + 574, // 177: tutorial.ResCharge.Gift:type_name -> tutorial.ResCharge.GiftEntry 304, // 178: tutorial.ResCharge.Wish:type_name -> tutorial.WishList - 573, // 179: tutorial.ResCharge.WeeklyDiscount:type_name -> tutorial.ResCharge.WeeklyDiscountEntry + 575, // 179: tutorial.ResCharge.WeeklyDiscount:type_name -> tutorial.ResCharge.WeeklyDiscountEntry 2, // 180: tutorial.ResAddWish.Code:type_name -> tutorial.RES_CODE 2, // 181: tutorial.ResGetWish.Code:type_name -> tutorial.RES_CODE 2, // 182: tutorial.ResSendWishBeg.Code:type_name -> tutorial.RES_CODE 2, // 183: tutorial.ResFreeShop.Code:type_name -> tutorial.RES_CODE 2, // 184: tutorial.ResBuyChessShop.Code:type_name -> tutorial.RES_CODE - 574, // 185: tutorial.ReqBuyChessShop2.mChessData:type_name -> tutorial.ReqBuyChessShop2.MChessDataEntry + 576, // 185: tutorial.ReqBuyChessShop2.mChessData:type_name -> tutorial.ReqBuyChessShop2.MChessDataEntry 2, // 186: tutorial.ResBuyChessShop2.Code:type_name -> tutorial.RES_CODE 2, // 187: tutorial.ResRefreshChessShop.Code:type_name -> tutorial.RES_CODE - 575, // 188: tutorial.ResEndless.EndlessList:type_name -> tutorial.ResEndless.EndlessListEntry + 577, // 188: tutorial.ResEndless.EndlessList:type_name -> tutorial.ResEndless.EndlessListEntry 171, // 189: tutorial.ResEndlessInfo.Items:type_name -> tutorial.ItemInfo 2, // 190: tutorial.ResEndlessReward.Code:type_name -> tutorial.RES_CODE 2, // 191: tutorial.ResPiggyBankReward.Code:type_name -> tutorial.RES_CODE @@ -34142,12 +34264,12 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 171, // 198: tutorial.ChampionshipCfgRank.Items:type_name -> tutorial.ItemInfo 2, // 199: tutorial.ResChampshipReward.Code:type_name -> tutorial.RES_CODE 2, // 200: tutorial.ResChampshipRankReward.Code:type_name -> tutorial.RES_CODE - 576, // 201: tutorial.ResChampshipRank.RankList:type_name -> tutorial.ResChampshipRank.RankListEntry - 577, // 202: tutorial.ResChampshipPreRank.RankList:type_name -> tutorial.ResChampshipPreRank.RankListEntry + 578, // 201: tutorial.ResChampshipRank.RankList:type_name -> tutorial.ResChampshipRank.RankListEntry + 579, // 202: tutorial.ResChampshipPreRank.RankList:type_name -> tutorial.ResChampshipPreRank.RankListEntry 337, // 203: tutorial.ResChampshipPreRank.Cfg:type_name -> tutorial.ChampionshipCfg - 578, // 204: tutorial.ResNotifyCard.Card:type_name -> tutorial.ResNotifyCard.CardEntry - 579, // 205: tutorial.ResNotifyCard.Master:type_name -> tutorial.ResNotifyCard.MasterEntry - 580, // 206: tutorial.ResNotifyCard.Handbook:type_name -> tutorial.ResNotifyCard.HandbookEntry + 580, // 204: tutorial.ResNotifyCard.Card:type_name -> tutorial.ResNotifyCard.CardEntry + 581, // 205: tutorial.ResNotifyCard.Master:type_name -> tutorial.ResNotifyCard.MasterEntry + 582, // 206: tutorial.ResNotifyCard.Handbook:type_name -> tutorial.ResNotifyCard.HandbookEntry 2, // 207: tutorial.ResSetFacebookUrl.Code:type_name -> tutorial.RES_CODE 364, // 208: tutorial.CatReturnGiftCfg.RewardList:type_name -> tutorial.CatReturnGiftCfgReward 171, // 209: tutorial.CatReturnGiftCfgReward.Reward:type_name -> tutorial.ItemInfo @@ -34155,22 +34277,22 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 2, // 211: tutorial.ResCatReturnGiftScore.Code:type_name -> tutorial.RES_CODE 2, // 212: tutorial.ResCatReturnGiftReward.Code:type_name -> tutorial.RES_CODE 2, // 213: tutorial.ResCatReturnGiftRewardGift.Code:type_name -> tutorial.RES_CODE - 581, // 214: tutorial.ResMining.Map:type_name -> tutorial.ResMining.MapEntry - 582, // 215: tutorial.ResMining.PassReward:type_name -> tutorial.ResMining.PassRewardEntry - 583, // 216: tutorial.ReqMiningTake.Map:type_name -> tutorial.ReqMiningTake.MapEntry + 583, // 214: tutorial.ResMining.Map:type_name -> tutorial.ResMining.MapEntry + 584, // 215: tutorial.ResMining.PassReward:type_name -> tutorial.ResMining.PassRewardEntry + 585, // 216: tutorial.ReqMiningTake.Map:type_name -> tutorial.ReqMiningTake.MapEntry 2, // 217: tutorial.ResMiningTake.Code:type_name -> tutorial.RES_CODE 2, // 218: tutorial.ResMiningReward.Code:type_name -> tutorial.RES_CODE 2, // 219: tutorial.ResActPassReward.Code:type_name -> tutorial.RES_CODE - 584, // 220: tutorial.ResActRed.Red:type_name -> tutorial.ResActRed.RedEntry + 586, // 220: tutorial.ResActRed.Red:type_name -> tutorial.ResActRed.RedEntry 208, // 221: tutorial.ActivityNotify.Info:type_name -> tutorial.ActivityInfo - 585, // 222: tutorial.ResItem.Item:type_name -> tutorial.ResItem.ItemEntry - 586, // 223: tutorial.ItemNotify.Item:type_name -> tutorial.ItemNotify.ItemEntry + 587, // 222: tutorial.ResItem.Item:type_name -> tutorial.ResItem.ItemEntry + 588, // 223: tutorial.ItemNotify.Item:type_name -> tutorial.ItemNotify.ItemEntry 391, // 224: tutorial.ResGuessColor.MapList:type_name -> tutorial.GuessColorInfo - 587, // 225: tutorial.ResGuessColor.OMap:type_name -> tutorial.ResGuessColor.OMapEntry + 589, // 225: tutorial.ResGuessColor.OMap:type_name -> tutorial.ResGuessColor.OMapEntry 389, // 226: tutorial.ResGuessColor.Opponent:type_name -> tutorial.opponent 391, // 227: tutorial.ReqGuessColorTake.Map:type_name -> tutorial.GuessColorInfo - 588, // 228: tutorial.ReqGuessColorTake.OMap:type_name -> tutorial.ReqGuessColorTake.OMapEntry - 589, // 229: tutorial.GuessColorInfo.Map:type_name -> tutorial.GuessColorInfo.MapEntry + 590, // 228: tutorial.ReqGuessColorTake.OMap:type_name -> tutorial.ReqGuessColorTake.OMapEntry + 591, // 229: tutorial.GuessColorInfo.Map:type_name -> tutorial.GuessColorInfo.MapEntry 2, // 230: tutorial.ResGuessColorTake.Code:type_name -> tutorial.RES_CODE 2, // 231: tutorial.ResGuessColorReward.Code:type_name -> tutorial.RES_CODE 397, // 232: tutorial.ResRace.Opponent:type_name -> tutorial.raceopponent @@ -34181,19 +34303,19 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 171, // 237: tutorial.ResPlayroom.Items:type_name -> tutorial.ItemInfo 438, // 238: tutorial.ResPlayroom.Opponent:type_name -> tutorial.RoomOpponent 437, // 239: tutorial.ResPlayroom.Friend:type_name -> tutorial.FriendRoom - 590, // 240: tutorial.ResPlayroom.Playroom:type_name -> tutorial.ResPlayroom.PlayroomEntry + 592, // 240: tutorial.ResPlayroom.Playroom:type_name -> tutorial.ResPlayroom.PlayroomEntry 423, // 241: tutorial.ResPlayroom.collect:type_name -> tutorial.PlayroomCollectInfo - 591, // 242: tutorial.ResPlayroom.Mood:type_name -> tutorial.ResPlayroom.MoodEntry + 593, // 242: tutorial.ResPlayroom.Mood:type_name -> tutorial.ResPlayroom.MoodEntry 171, // 243: tutorial.ResPlayroom.LoseItem:type_name -> tutorial.ItemInfo 433, // 244: tutorial.ResPlayroom.Chip:type_name -> tutorial.ChipInfo - 592, // 245: tutorial.ResPlayroom.Physiology:type_name -> tutorial.ResPlayroom.PhysiologyEntry - 593, // 246: tutorial.ResPlayroom.Dress:type_name -> tutorial.ResPlayroom.DressEntry - 594, // 247: tutorial.ResPlayroom.DressSet:type_name -> tutorial.ResPlayroom.DressSetEntry + 594, // 245: tutorial.ResPlayroom.Physiology:type_name -> tutorial.ResPlayroom.PhysiologyEntry + 595, // 246: tutorial.ResPlayroom.Dress:type_name -> tutorial.ResPlayroom.DressEntry + 596, // 247: tutorial.ResPlayroom.DressSet:type_name -> tutorial.ResPlayroom.DressSetEntry 422, // 248: tutorial.ResPlayroom.PetAir:type_name -> tutorial.PlayroomAirInfo 182, // 249: tutorial.ResPlayroom.DailyTask:type_name -> tutorial.DailyTask 435, // 250: tutorial.ResPlayroom.AdItem:type_name -> tutorial.AdItem 437, // 251: tutorial.ResPlayroom.Target:type_name -> tutorial.FriendRoom - 595, // 252: tutorial.ResPlayroom.WeeklyDiscount:type_name -> tutorial.ResPlayroom.WeeklyDiscountEntry + 597, // 252: tutorial.ResPlayroom.WeeklyDiscount:type_name -> tutorial.ResPlayroom.WeeklyDiscountEntry 182, // 253: tutorial.NotifyPlayroomTask.DailyTask:type_name -> tutorial.DailyTask 237, // 254: tutorial.NotifyPlayroomBroken.Player:type_name -> tutorial.ResPlayerSimple 2, // 255: tutorial.ResPlayroomTask.Code:type_name -> tutorial.RES_CODE @@ -34201,28 +34323,28 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 2, // 257: tutorial.ResPlayroomUnlock.Code:type_name -> tutorial.RES_CODE 2, // 258: tutorial.ResPlayroomUpvote.Code:type_name -> tutorial.RES_CODE 421, // 259: tutorial.PlayroomDress.List:type_name -> tutorial.PlayroomDressInfo - 596, // 260: tutorial.ReqPlayroomDressSet.DressSet:type_name -> tutorial.ReqPlayroomDressSet.DressSetEntry + 598, // 260: tutorial.ReqPlayroomDressSet.DressSet:type_name -> tutorial.ReqPlayroomDressSet.DressSetEntry 2, // 261: tutorial.ResPlayroomDressSet.Code:type_name -> tutorial.RES_CODE 2, // 262: tutorial.ResPlayroomPetAirSet.Code:type_name -> tutorial.RES_CODE 2, // 263: tutorial.ResPlayroomWorkOutline.Code:type_name -> tutorial.RES_CODE 171, // 264: tutorial.NotifyPlayroomLose.LoseItem:type_name -> tutorial.ItemInfo 433, // 265: tutorial.NotifyPlayroomLose.Chip:type_name -> tutorial.ChipInfo - 597, // 266: tutorial.NotifyPlayroomMood.Mood:type_name -> tutorial.NotifyPlayroomMood.MoodEntry - 598, // 267: tutorial.NotifyPlayroomMood.Physiology:type_name -> tutorial.NotifyPlayroomMood.PhysiologyEntry + 599, // 266: tutorial.NotifyPlayroomMood.Mood:type_name -> tutorial.NotifyPlayroomMood.MoodEntry + 600, // 267: tutorial.NotifyPlayroomMood.Physiology:type_name -> tutorial.NotifyPlayroomMood.PhysiologyEntry 435, // 268: tutorial.NotifyPlayroomMood.AdItem:type_name -> tutorial.AdItem - 599, // 269: tutorial.ResPlayroomInfo.Playroom:type_name -> tutorial.ResPlayroomInfo.PlayroomEntry - 600, // 270: tutorial.ResPlayroomInfo.Items:type_name -> tutorial.ResPlayroomInfo.ItemsEntry - 601, // 271: tutorial.ResPlayroomInfo.flip:type_name -> tutorial.ResPlayroomInfo.FlipEntry - 602, // 272: tutorial.ResPlayroomInfo.Emoji:type_name -> tutorial.ResPlayroomInfo.EmojiEntry - 603, // 273: tutorial.ResPlayroomInfo.DressSet:type_name -> tutorial.ResPlayroomInfo.DressSetEntry + 601, // 269: tutorial.ResPlayroomInfo.Playroom:type_name -> tutorial.ResPlayroomInfo.PlayroomEntry + 602, // 270: tutorial.ResPlayroomInfo.Items:type_name -> tutorial.ResPlayroomInfo.ItemsEntry + 603, // 271: tutorial.ResPlayroomInfo.flip:type_name -> tutorial.ResPlayroomInfo.FlipEntry + 604, // 272: tutorial.ResPlayroomInfo.Emoji:type_name -> tutorial.ResPlayroomInfo.EmojiEntry + 605, // 273: tutorial.ResPlayroomInfo.DressSet:type_name -> tutorial.ResPlayroomInfo.DressSetEntry 2, // 274: tutorial.ResPlayroomFlip.Code:type_name -> tutorial.RES_CODE 2, // 275: tutorial.ResPlayroomGuide.Code:type_name -> tutorial.RES_CODE 2, // 276: tutorial.ResPlayroomFlipReward.Code:type_name -> tutorial.RES_CODE 2, // 277: tutorial.ResPlayroomGame.Code:type_name -> tutorial.RES_CODE - 604, // 278: tutorial.ResPlayroomGame.Items:type_name -> tutorial.ResPlayroomGame.ItemsEntry + 606, // 278: tutorial.ResPlayroomGame.Items:type_name -> tutorial.ResPlayroomGame.ItemsEntry 171, // 279: tutorial.ResPlayroomGameShowReward.Items:type_name -> tutorial.ItemInfo 2, // 280: tutorial.ResPlayroomInteract.Code:type_name -> tutorial.RES_CODE - 605, // 281: tutorial.ReqPlayroomSetRoom.Playroom:type_name -> tutorial.ReqPlayroomSetRoom.PlayroomEntry + 607, // 281: tutorial.ReqPlayroomSetRoom.Playroom:type_name -> tutorial.ReqPlayroomSetRoom.PlayroomEntry 2, // 282: tutorial.ResPlayroomSetRoom.Code:type_name -> tutorial.RES_CODE 2, // 283: tutorial.ResPlayroomSelectReward.Code:type_name -> tutorial.RES_CODE 2, // 284: tutorial.ResPlayroomLose.Code:type_name -> tutorial.RES_CODE @@ -34253,20 +34375,20 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 2, // 309: tutorial.ResCatnipGrandReward.Code:type_name -> tutorial.RES_CODE 2, // 310: tutorial.ResCatnipEmoji.Code:type_name -> tutorial.RES_CODE 171, // 311: tutorial.MiningCfg.itemCost:type_name -> tutorial.ItemInfo - 606, // 312: tutorial.MiningCfg.Gem:type_name -> tutorial.MiningCfg.GemEntry - 607, // 313: tutorial.MiningCfg.Jackpot:type_name -> tutorial.MiningCfg.JackpotEntry - 608, // 314: tutorial.MiningCfg.Pass:type_name -> tutorial.MiningCfg.PassEntry + 608, // 312: tutorial.MiningCfg.Gem:type_name -> tutorial.MiningCfg.GemEntry + 609, // 313: tutorial.MiningCfg.Jackpot:type_name -> tutorial.MiningCfg.JackpotEntry + 610, // 314: tutorial.MiningCfg.Pass:type_name -> tutorial.MiningCfg.PassEntry 171, // 315: tutorial.MiningCfgJackpot.Items:type_name -> tutorial.ItemInfo 171, // 316: tutorial.MiningCfgPass.Items:type_name -> tutorial.ItemInfo 521, // 317: tutorial.ReqActivityCfgReload.List:type_name -> tutorial.ActivityCfg 530, // 318: tutorial.ResUserDetail.info:type_name -> tutorial.ResUserDetailInfo 529, // 319: tutorial.UserDetailOrderInfo.Chess:type_name -> tutorial.UserDetailOrderInfoChess 529, // 320: tutorial.UserDetailOrderInfo.ChessId:type_name -> tutorial.UserDetailOrderInfoChess - 609, // 321: tutorial.ResUserDetailInfo.ChessMap:type_name -> tutorial.ResUserDetailInfo.ChessMapEntry + 611, // 321: tutorial.ResUserDetailInfo.ChessMap:type_name -> tutorial.ResUserDetailInfo.ChessMapEntry 238, // 322: tutorial.ResUserDetailInfo.ActLog:type_name -> tutorial.ActLog 527, // 323: tutorial.ResUserDetailInfo.FriendList:type_name -> tutorial.UserDetailFriendInfo 528, // 324: tutorial.ResUserDetailInfo.Order:type_name -> tutorial.UserDetailOrderInfo - 610, // 325: tutorial.ResUserDetailInfo.ChessBuffer:type_name -> tutorial.ResUserDetailInfo.ChessBufferEntry + 612, // 325: tutorial.ResUserDetailInfo.ChessBuffer:type_name -> tutorial.ResUserDetailInfo.ChessBufferEntry 175, // 326: tutorial.ResGuideTask.TaskEntry.value:type_name -> tutorial.GuideTask 181, // 327: tutorial.ResDailyTask.WeekRewardEntry.value:type_name -> tutorial.DailyWeek 182, // 328: tutorial.ResDailyTask.DailyTaskEntry.value:type_name -> tutorial.DailyTask @@ -34295,16 +34417,18 @@ var file_proto_Gameapi_proto_depIdxs = []int32{ 518, // 351: tutorial.Backend.BanPlayer:input_type -> tutorial.ReqAdminBan 514, // 352: tutorial.Backend.ReloadMail:input_type -> tutorial.ReqReloadServerMail 516, // 353: tutorial.Backend.ServerReload:input_type -> tutorial.ReqReload - 522, // 354: tutorial.Backend.ReloadActivity:output_type -> tutorial.ResActivityCfgReload - 524, // 355: tutorial.Backend.OrderShipping:output_type -> tutorial.ResOrderShipping - 526, // 356: tutorial.Backend.UserDetail:output_type -> tutorial.ResUserDetail - 531, // 357: tutorial.Backend.ServerInfo:output_type -> tutorial.ResServerInfo - 532, // 358: tutorial.Backend.PlayerGm:output_type -> tutorial.ResAdminGm - 533, // 359: tutorial.Backend.BanPlayer:output_type -> tutorial.ResBackend - 533, // 360: tutorial.Backend.ReloadMail:output_type -> tutorial.ResBackend - 533, // 361: tutorial.Backend.ServerReload:output_type -> tutorial.ResBackend - 354, // [354:362] is the sub-list for method output_type - 346, // [346:354] is the sub-list for method input_type + 534, // 354: tutorial.Backend.MiniGame:input_type -> tutorial.ReqMiniGame + 522, // 355: tutorial.Backend.ReloadActivity:output_type -> tutorial.ResActivityCfgReload + 524, // 356: tutorial.Backend.OrderShipping:output_type -> tutorial.ResOrderShipping + 526, // 357: tutorial.Backend.UserDetail:output_type -> tutorial.ResUserDetail + 531, // 358: tutorial.Backend.ServerInfo:output_type -> tutorial.ResServerInfo + 532, // 359: tutorial.Backend.PlayerGm:output_type -> tutorial.ResAdminGm + 533, // 360: tutorial.Backend.BanPlayer:output_type -> tutorial.ResBackend + 533, // 361: tutorial.Backend.ReloadMail:output_type -> tutorial.ResBackend + 533, // 362: tutorial.Backend.ServerReload:output_type -> tutorial.ResBackend + 535, // 363: tutorial.Backend.MiniGame:output_type -> tutorial.ResMiniGame + 355, // [355:364] is the sub-list for method output_type + 346, // [346:355] is the sub-list for method input_type 346, // [346:346] is the sub-list for extension type_name 346, // [346:346] is the sub-list for extension extendee 0, // [0:346] is the sub-list for field type_name @@ -34321,7 +34445,7 @@ func file_proto_Gameapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_Gameapi_proto_rawDesc), len(file_proto_Gameapi_proto_rawDesc)), NumEnums: 14, - NumMessages: 597, + NumMessages: 599, NumExtensions: 0, NumServices: 1, }, diff --git a/msg/Gameapi_grpc.pb.go b/msg/Gameapi_grpc.pb.go index b2432f6..1c1149f 100644 --- a/msg/Gameapi_grpc.pb.go +++ b/msg/Gameapi_grpc.pb.go @@ -27,6 +27,7 @@ const ( Backend_BanPlayer_FullMethodName = "/tutorial.Backend/BanPlayer" Backend_ReloadMail_FullMethodName = "/tutorial.Backend/ReloadMail" Backend_ServerReload_FullMethodName = "/tutorial.Backend/ServerReload" + Backend_MiniGame_FullMethodName = "/tutorial.Backend/MiniGame" ) // BackendClient is the client API for Backend service. @@ -41,6 +42,7 @@ type BackendClient interface { BanPlayer(ctx context.Context, in *ReqAdminBan, opts ...grpc.CallOption) (*ResBackend, error) ReloadMail(ctx context.Context, in *ReqReloadServerMail, opts ...grpc.CallOption) (*ResBackend, error) ServerReload(ctx context.Context, in *ReqReload, opts ...grpc.CallOption) (*ResBackend, error) + MiniGame(ctx context.Context, in *ReqMiniGame, opts ...grpc.CallOption) (*ResMiniGame, error) } type backendClient struct { @@ -131,6 +133,16 @@ func (c *backendClient) ServerReload(ctx context.Context, in *ReqReload, opts .. return out, nil } +func (c *backendClient) MiniGame(ctx context.Context, in *ReqMiniGame, opts ...grpc.CallOption) (*ResMiniGame, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResMiniGame) + err := c.cc.Invoke(ctx, Backend_MiniGame_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // BackendServer is the server API for Backend service. // All implementations must embed UnimplementedBackendServer // for forward compatibility. @@ -143,6 +155,7 @@ type BackendServer interface { BanPlayer(context.Context, *ReqAdminBan) (*ResBackend, error) ReloadMail(context.Context, *ReqReloadServerMail) (*ResBackend, error) ServerReload(context.Context, *ReqReload) (*ResBackend, error) + MiniGame(context.Context, *ReqMiniGame) (*ResMiniGame, error) mustEmbedUnimplementedBackendServer() } @@ -177,6 +190,9 @@ func (UnimplementedBackendServer) ReloadMail(context.Context, *ReqReloadServerMa func (UnimplementedBackendServer) ServerReload(context.Context, *ReqReload) (*ResBackend, error) { return nil, status.Error(codes.Unimplemented, "method ServerReload not implemented") } +func (UnimplementedBackendServer) MiniGame(context.Context, *ReqMiniGame) (*ResMiniGame, error) { + return nil, status.Error(codes.Unimplemented, "method MiniGame not implemented") +} func (UnimplementedBackendServer) mustEmbedUnimplementedBackendServer() {} func (UnimplementedBackendServer) testEmbeddedByValue() {} @@ -342,6 +358,24 @@ func _Backend_ServerReload_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Backend_MiniGame_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReqMiniGame) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackendServer).MiniGame(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Backend_MiniGame_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackendServer).MiniGame(ctx, req.(*ReqMiniGame)) + } + return interceptor(ctx, in, info, handler) +} + // Backend_ServiceDesc is the grpc.ServiceDesc for Backend service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -381,6 +415,10 @@ var Backend_ServiceDesc = grpc.ServiceDesc{ MethodName: "ServerReload", Handler: _Backend_ServerReload_Handler, }, + { + MethodName: "MiniGame", + Handler: _Backend_MiniGame_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "proto/Gameapi.proto", diff --git a/sdk/ship/main.go b/sdk/ship/main.go index b344aad..73224da 100644 --- a/sdk/ship/main.go +++ b/sdk/ship/main.go @@ -3,6 +3,7 @@ package main import ( "backend/common" shipcommon "backend/sdk/ship/common" + minigame "backend/sdk/ship/model/mini_game" "backend/sdk/ship/model/test" "backend/sdk/ship/model/tuyou" "backend/util" @@ -94,6 +95,8 @@ func main() { // 充值发货 ChargeApi.POST("test/charge", test.Charge) ChargeApi.POST("tuyou/charge", tuyou.Charge) + //小游戏奖励 + ChargeApi.POST("tuyou/reward", minigame.Reward) } server := &http.Server{ diff --git a/sdk/ship/model/mini_game/mini_game.go b/sdk/ship/model/mini_game/mini_game.go new file mode 100644 index 0000000..9fafc3c --- /dev/null +++ b/sdk/ship/model/mini_game/mini_game.go @@ -0,0 +1,101 @@ +package minigame + +import ( + "backend/client" + "backend/msg" + "crypto/md5" + "fmt" + "reflect" + "sort" + "strings" + + "github.com/gin-gonic/gin" +) + +type RewardRequest struct { + AppId int `json:"appId" form:"appId" binding:"required" description:"cp应用ID"` + ServerId int `json:"serverId" form:"serverId" binding:"required" description:"cp服务器ID"` + UserID int64 `json:"userId" form:"userId" binding:"required" description:"用户uid"` + GameID int32 `json:"gameId" form:"gameId" binding:"required" description:"小游戏ID"` + TimeStamp int64 `json:"timeStamp" form:"timeStamp" binding:"required" description:"时间戳,单位毫秒"` + Score int32 `json:"score" form:"score" binding:"required" description:"游戏得分"` + Code string `json:"code" form:"code" binding:"required" description:"回调签名"` +} + +const ( + APP_KEY = "8001bd25832553c39d4b443f56480841" +) + +func Reward(c *gin.Context) { + var req RewardRequest + if err := c.ShouldBind(&req); err != nil { + c.JSON(400, gin.H{"error": err.Error()}) + return + } + expectedCode := req.Sign() + if expectedCode != req.Code { + c.JSON(400, gin.H{"error": "invalid code"}) + return + } + res, err := client.MiniGame(req.AppId, req.ServerId, &msg.ReqMiniGame{ + Uid: req.UserID, + Id: req.GameID, + Score: req.Score, + }) + if err != nil { + c.JSON(500, gin.H{"error": err.Error()}) + return + } + c.JSON(200, gin.H{"reward": res}) +} + +func (r *RewardRequest) Sign() string { + // 收集参数到 map[key]=string(value) + params := make(map[string]string) + val := reflect.ValueOf(*r) + typ := reflect.TypeOf(*r) + for i := 0; i < typ.NumField(); i++ { + field := typ.Field(i) + // 使用 json tag 作为键名,若为空则 fallback 到字段名 + tag := field.Tag.Get("json") + key := strings.Split(tag, ",")[0] + if key == "" { + key = field.Name + } + // 排除 code + if key == "code" { + continue + } + fv := val.Field(i) + var s string + if fv.Kind() == reflect.String { + s = fv.String() + } else { + s = fmt.Sprintf("%v", fv.Interface()) + } + params[key] = s + } + + // 排序键名 + keys := make([]string, 0, len(params)) + for k := range params { + keys = append(keys, k) + } + sort.Strings(keys) + + // 拼接签名源字符串 + var b strings.Builder + for i, k := range keys { + if i > 0 { + b.WriteByte('&') + } + b.WriteString(k) + b.WriteByte('=') + b.WriteString(params[k]) + } + checkstr := b.String() + checkstr = APP_KEY + checkstr + APP_KEY + // 计算 MD5 并返回小写十六进制字符串 + sum := md5.Sum([]byte(checkstr)) + return fmt.Sprintf("%x", sum) +} diff --git a/util/es.go b/util/es.go index 699ff5d..6384f05 100644 --- a/util/es.go +++ b/util/es.go @@ -420,8 +420,30 @@ func CountStatisticsHeat7Days(appId int, tz string) (*StatisticsHeatTrend, error }, "login": map[string]any{ "filter": map[string]any{ - "term": map[string]any{ - "game.#event_name.keyword": "Login_log", + "bool": map[string]any{ + "minimum_should_match": 1, + "should": []map[string]any{ + { + "term": map[string]any{ + "game.#event_name": "Login_log", + }, + }, + { + "term": map[string]any{ + "game.#event_name": "login_log", + }, + }, + { + "term": map[string]any{ + "game.#event_name": "login", + }, + }, + { + "term": map[string]any{ + "game.#event_name": "Login", + }, + }, + }, }, }, "aggs": map[string]any{ diff --git a/util/statistics.go b/util/statistics.go index c588376..748f025 100644 --- a/util/statistics.go +++ b/util/statistics.go @@ -131,6 +131,58 @@ func DayRemain(now int64, Day int, LogDb *Db) (int, error) { return len(DataList2), nil } +// GetYesterdaySecondRemainRateRealtime 实时计算昨日次留率(返回 0~1 比例值) +func GetYesterdaySecondRemainRateRealtime(AppId int) (float64, error) { + AppConfig, err := GetAppConfig(AppId) + if err != nil { + return 0, err + } + + LogDb := MPool.GetTopicDB(AppConfig.Topic) + if LogDb == nil { + return 0, fmt.Errorf("failed to get mysql database") + } + defer LogDb.Close() + + yesterdayStart, err := GetZeroTimestamp(AppConfig.Tz, -1) + if err != nil { + return 0, err + } + yesterdayEnd := yesterdayStart + 86399 + + todayStart, err := GetZeroTimestamp(AppConfig.Tz, 0) + if err != nil { + return 0, err + } + now := time.Now().Unix() + + var registerCount int + err = LogDb.Get(®isterCount, "SELECT count(distinct Uid) FROM log_login WHERE Event = 'register' AND Timestamp >= ? AND Timestamp <= ?", yesterdayStart, yesterdayEnd) + if err != nil { + return 0, fmt.Errorf("failed to get yesterday register count: %v", err) + } + if registerCount == 0 { + return 0, nil + } + + var secondRemainCount int + err = LogDb.Get(&secondRemainCount, ` + SELECT count(distinct l.Uid) + FROM log_login l + INNER JOIN ( + SELECT distinct Uid + FROM log_login + WHERE Event = 'register' AND Timestamp >= ? AND Timestamp <= ? + ) r ON l.Uid = r.Uid + WHERE l.Event = 'Login_log' AND l.Timestamp >= ? AND l.Timestamp <= ? + `, yesterdayStart, yesterdayEnd, todayStart, now) + if err != nil { + return 0, fmt.Errorf("failed to get yesterday second remain count: %v", err) + } + + return FloatDiv(secondRemainCount, registerCount, 4), nil +} + func Login(Now int64, LogDb *Db) int { if LogDb == nil { log.Println("failed to get mysql database")