This commit is contained in:
hahwu 2026-05-28 14:39:23 +08:00
parent 43630729be
commit 444d593400
10 changed files with 529 additions and 296 deletions

View File

@ -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],
)
}

View File

@ -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.

View File

@ -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()

View File

@ -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)

View File

@ -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,
},

View File

@ -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",

View File

@ -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{

View File

@ -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)
}

View File

@ -420,8 +420,30 @@ func CountStatisticsHeat7Days(appId int, tz string) (*StatisticsHeatTrend, error
},
"login": map[string]any{
"filter": map[string]any{
"bool": map[string]any{
"minimum_should_match": 1,
"should": []map[string]any{
{
"term": map[string]any{
"game.#event_name.keyword": "Login_log",
"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{

View File

@ -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(&registerCount, "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")