From df3c4d353eaddff1ed3528de4dd9f5b8037ffaa9 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 23 Sep 2024 16:43:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AB=9E=E6=8A=80=E9=A6=86?= =?UTF-8?q?=E8=8E=B7=E5=A5=96=E8=AE=B0=E5=BD=95=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbproxy/mq/c_customlog.go | 24 ++ dbproxy/svc/l_customaward.go | 50 +++ gamesrv/base/logchannel.go | 1 + gamesrv/tienlen/scenepolicy_tienlen.go | 9 + model/customlog.go | 48 +++ model/gameparam.go | 4 + mq/keyconf.go | 3 +- protocol/rank/rank.pb.go | 426 ++++++++++++++++++++++--- protocol/rank/rank.proto | 29 ++ ranksrv/action_gatesrv.go | 47 +++ ranksrv/com/listmgr.go | 3 + ranksrv/rank/customaward.go | 24 ++ 12 files changed, 623 insertions(+), 45 deletions(-) create mode 100644 dbproxy/svc/l_customaward.go create mode 100644 ranksrv/rank/customaward.go diff --git a/dbproxy/mq/c_customlog.go b/dbproxy/mq/c_customlog.go index 4ed99c3..60af0ba 100644 --- a/dbproxy/mq/c_customlog.go +++ b/dbproxy/mq/c_customlog.go @@ -12,6 +12,7 @@ import ( ) func init() { + // 竞技馆对局记录 mq.RegisterSubscriber(mq.DBCustomLog, func(e broker.Event) (err error) { msg := e.Message() if msg != nil { @@ -33,4 +34,27 @@ func init() { } return nil }, broker.Queue(mq.DBCustomLog), broker.DisableAutoAck(), rabbitmq.DurableQueue()) + + // 竞技馆奖励记录 + mq.RegisterSubscriber(mq.DBCustomLogAward, func(e broker.Event) (err error) { + msg := e.Message() + if msg != nil { + defer func() { + e.Ack() + }() + + var log model.CustomLogAward + err = json.Unmarshal(msg.Body, &log) + if err != nil { + return + } + + c := svc.DbCustomLogAwardCollection(log.Platform) + if c != nil { + err = c.Insert(log) + } + return + } + return nil + }, broker.Queue(mq.DBCustomLogAward), broker.DisableAutoAck(), rabbitmq.DurableQueue()) } diff --git a/dbproxy/svc/l_customaward.go b/dbproxy/svc/l_customaward.go new file mode 100644 index 0000000..77c1f2d --- /dev/null +++ b/dbproxy/svc/l_customaward.go @@ -0,0 +1,50 @@ +package svc + +import ( + "errors" + "net/rpc" + + "github.com/globalsign/mgo" + "go.mongodb.org/mongo-driver/bson" + + "mongo.games.com/game/dbproxy/mongo" + "mongo.games.com/game/model" +) + +var ErrCustomLogAwardNotFound = errors.New("CustomLogAward not found") + +func DbCustomLogAwardCollection(plt string) *mongo.Collection { + s := mongo.MgoSessionMgrSington.GetPltMgoSession(plt, model.DbCustomLogAwardDBName) + if s != nil { + d, first := s.DB().C(model.DbCustomLogAwardCollName) + if first { + d.EnsureIndex(mgo.Index{Key: []string{"cycleid"}, Background: true, Sparse: true}) + d.EnsureIndex(mgo.Index{Key: []string{"-startts", "cycleid"}, Background: true, Sparse: true}) + d.EnsureIndex(mgo.Index{Key: []string{"startts"}, Background: true, Sparse: true}) + d.EnsureIndex(mgo.Index{Key: []string{"endts"}, Background: true, Sparse: true}) + d.EnsureIndex(mgo.Index{Key: []string{"-endts"}, Background: true, Sparse: true}) + d.EnsureIndex(mgo.Index{Key: []string{"snid"}, Background: true, Sparse: true}) + } + return d + } + return nil +} + +type DBCustomLogAwardSvc struct { +} + +func (this *DBCustomLogAwardSvc) Find(req *model.CustomLogAwardFindReq, res *model.CustomLogAwardFindRes) error { + c := DbCustomLogAwardCollection(req.Platform) + if c == nil { + return ErrCustomLogAwardNotFound + } + + if err := c.Find(bson.M{"startts": bson.M{"$gte": req.StartTs, "$lte": req.EndTs}}).Sort("startts").All(&res.List); err != nil { + return err + } + return nil +} + +func init() { + rpc.Register(new(DBCustomLogAwardSvc)) +} diff --git a/gamesrv/base/logchannel.go b/gamesrv/base/logchannel.go index de78540..7a997ab 100644 --- a/gamesrv/base/logchannel.go +++ b/gamesrv/base/logchannel.go @@ -58,4 +58,5 @@ func init() { LogChannelSingleton.RegisterLogCName(model.FriendRecordLogCollName, &model.FriendRecord{}) LogChannelSingleton.RegisterLogCName(model.ItemLogCollName, &model.ItemLog{}) LogChannelSingleton.RegisterLogCName(mq.DBCustomLog, &model.CustomLog{}) + LogChannelSingleton.RegisterLogCName(mq.DBCustomLogAward, &model.CustomLogAward{}) } diff --git a/gamesrv/tienlen/scenepolicy_tienlen.go b/gamesrv/tienlen/scenepolicy_tienlen.go index ec7455a..2e3dec9 100644 --- a/gamesrv/tienlen/scenepolicy_tienlen.go +++ b/gamesrv/tienlen/scenepolicy_tienlen.go @@ -2641,6 +2641,15 @@ func (this *SceneBilledStateTienLen) OnEnter(s *base.Scene) { GameId: int64(sceneEx.GameId), GameFreeId: int64(sceneEx.GetGameFreeId()), }) + base.LogChannelSingleton.WriteLog(&model.CustomLogAward{ + Platform: p.Platform, + CycleId: sceneEx.CycleID, + SnId: p.SnId, + Name: p.GetName(), + Awards: items, + StartTs: sceneEx.GameStartTime.Unix(), + EndTs: time.Now().Unix(), + }) sceneEx.PlayerAward[p.SnId] = &items } } diff --git a/model/customlog.go b/model/customlog.go index 1b1f66b..9b7b93e 100644 --- a/model/customlog.go +++ b/model/customlog.go @@ -1,8 +1,17 @@ package model +import ( + "time" + + "mongo.games.com/goserver/core/logger" +) + var ( DbCustomLogDBName = "log" DbCustomLogCollName = "log_custom" + + DbCustomLogAwardDBName = "log" + DbCustomLogAwardCollName = "log_customaward" ) type PlayerInfo struct { @@ -34,3 +43,42 @@ type CustomLog struct { StartTs, EndTs int64 // 开始,结束时间 State int32 // 0正常结束 1后台中途解散 } + +// CustomLogAward 竞技馆玩家奖励记录 +type CustomLogAward struct { + Platform string `bson:"-"` + CycleId string // 本轮id,多局游戏属于同一轮 + SnId int32 + Name string + Awards []*Item + StartTs, EndTs int64 // 开始,结束时间 +} + +type CustomLogAwardFindReq struct { + Platform string + StartTs int64 + EndTs int64 +} + +type CustomLogAwardFindRes struct { + List []*CustomLogAward +} + +func CustomLogAwardFind(plt string, startTs, endTs int64) ([]*CustomLogAward, error) { + if rpcCli == nil { + logger.Logger.Error("model.CustomLogAwardFind rpcCli == nil") + return nil, nil + } + + req := &CustomLogAwardFindReq{ + Platform: plt, + StartTs: startTs, + EndTs: endTs, + } + res := &CustomLogAwardFindRes{} + if err := rpcCli.CallWithTimeout("DBCustomLogAwardSvc.Find", req, &res, time.Second*30); err != nil { + logger.Logger.Warn("DBCustomLogAwardSvc.Find error:", err) + return nil, err + } + return res.List, nil +} diff --git a/model/gameparam.go b/model/gameparam.go index fb99669..ff7e31a 100644 --- a/model/gameparam.go +++ b/model/gameparam.go @@ -84,6 +84,7 @@ type GameParam struct { PermitInitScore int64 // 赛季通行证初始积分 GuideStepMaxNum int32 // 新手引导步骤最大值 GuideTs int64 // 新手引导时间戳,小于这个时间的玩家不显示新手引导 + CustomAwardUpdateTime int // 竞技馆奖励更新时间 } var GameParamPath = "../data/gameparam.json" @@ -217,4 +218,7 @@ func InitGameParam() { if GameParamData.GuideTs == 0 { GameParamData.GuideTs = 1724623200 } + if GameParamData.CustomAwardUpdateTime == 0 { + GameParamData.CustomAwardUpdateTime = 60 + } } diff --git a/mq/keyconf.go b/mq/keyconf.go index 87943a5..23bf85a 100644 --- a/mq/keyconf.go +++ b/mq/keyconf.go @@ -23,5 +23,6 @@ const ( const ( DBVipGiftLog = "db_vipgift" - DBCustomLog = "db_customlog" // 房卡场对局记录 + DBCustomLog = "db_customlog" // 房卡场对局记录 + DBCustomLogAward = "db_customlog_award" // 房卡场对局奖励 ) diff --git a/protocol/rank/rank.pb.go b/protocol/rank/rank.pb.go index 74f50d1..ebb138c 100644 --- a/protocol/rank/rank.pb.go +++ b/protocol/rank/rank.pb.go @@ -45,6 +45,9 @@ const ( //赛季通行证排行榜 Rank_PACKET_RANK_CSPermit Rank = 10012 Rank_PACKET_RANK_SCPermit Rank = 10013 + // 竞技馆获奖记录 + Rank_PACKET_CSRoomAward Rank = 10014 + Rank_PACKET_SCRoomAward Rank = 10015 ) // Enum value maps for Rank. @@ -65,6 +68,8 @@ var ( 10011: "PACKET_RANK_SCLevel", 10012: "PACKET_RANK_CSPermit", 10013: "PACKET_RANK_SCPermit", + 10014: "PACKET_CSRoomAward", + 10015: "PACKET_SCRoomAward", } Rank_value = map[string]int32{ "PACKET_RANK_ZERO": 0, @@ -82,6 +87,8 @@ var ( "PACKET_RANK_SCLevel": 10011, "PACKET_RANK_CSPermit": 10012, "PACKET_RANK_SCPermit": 10013, + "PACKET_CSRoomAward": 10014, + "PACKET_SCRoomAward": 10015, } ) @@ -1789,6 +1796,260 @@ func (x *SCPermit) GetRankMaxNum() int32 { return 0 } +//PACKET_CSRoomAward +type CSRoomAward struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Skip int32 `protobuf:"varint,1,opt,name=Skip,proto3" json:"Skip,omitempty"` // 偏移量 + Limit int32 `protobuf:"varint,2,opt,name=Limit,proto3" json:"Limit,omitempty"` // 请求数量 +} + +func (x *CSRoomAward) Reset() { + *x = CSRoomAward{} + if protoimpl.UnsafeEnabled { + mi := &file_rank_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CSRoomAward) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSRoomAward) ProtoMessage() {} + +func (x *CSRoomAward) ProtoReflect() protoreflect.Message { + mi := &file_rank_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CSRoomAward.ProtoReflect.Descriptor instead. +func (*CSRoomAward) Descriptor() ([]byte, []int) { + return file_rank_proto_rawDescGZIP(), []int{22} +} + +func (x *CSRoomAward) GetSkip() int32 { + if x != nil { + return x.Skip + } + return 0 +} + +func (x *CSRoomAward) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +type Item struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 道具id + N int64 `protobuf:"varint,2,opt,name=N,proto3" json:"N,omitempty"` // 道具数量 +} + +func (x *Item) Reset() { + *x = Item{} + if protoimpl.UnsafeEnabled { + mi := &file_rank_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Item) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Item) ProtoMessage() {} + +func (x *Item) ProtoReflect() protoreflect.Message { + mi := &file_rank_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Item.ProtoReflect.Descriptor instead. +func (*Item) Descriptor() ([]byte, []int) { + return file_rank_proto_rawDescGZIP(), []int{23} +} + +func (x *Item) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Item) GetN() int64 { + if x != nil { + return x.N + } + return 0 +} + +type UserAward struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` // 玩家id + Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` // 昵称 + Awards []*Item `protobuf:"bytes,3,rep,name=Awards,proto3" json:"Awards,omitempty"` // 奖品 + Ts int64 `protobuf:"varint,4,opt,name=Ts,proto3" json:"Ts,omitempty"` // 获得时间 +} + +func (x *UserAward) Reset() { + *x = UserAward{} + if protoimpl.UnsafeEnabled { + mi := &file_rank_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserAward) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserAward) ProtoMessage() {} + +func (x *UserAward) ProtoReflect() protoreflect.Message { + mi := &file_rank_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserAward.ProtoReflect.Descriptor instead. +func (*UserAward) Descriptor() ([]byte, []int) { + return file_rank_proto_rawDescGZIP(), []int{24} +} + +func (x *UserAward) GetSnid() int32 { + if x != nil { + return x.Snid + } + return 0 +} + +func (x *UserAward) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UserAward) GetAwards() []*Item { + if x != nil { + return x.Awards + } + return nil +} + +func (x *UserAward) GetTs() int64 { + if x != nil { + return x.Ts + } + return 0 +} + +//PACKET_SCRoomAward +type SCRoomAward struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + List []*UserAward `protobuf:"bytes,1,rep,name=List,proto3" json:"List,omitempty"` + Skip int32 `protobuf:"varint,2,opt,name=Skip,proto3" json:"Skip,omitempty"` // 偏移量 + Limit int32 `protobuf:"varint,3,opt,name=Limit,proto3" json:"Limit,omitempty"` // 每页数量 + Total int32 `protobuf:"varint,4,opt,name=Total,proto3" json:"Total,omitempty"` // 总数量 +} + +func (x *SCRoomAward) Reset() { + *x = SCRoomAward{} + if protoimpl.UnsafeEnabled { + mi := &file_rank_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCRoomAward) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCRoomAward) ProtoMessage() {} + +func (x *SCRoomAward) ProtoReflect() protoreflect.Message { + mi := &file_rank_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCRoomAward.ProtoReflect.Descriptor instead. +func (*SCRoomAward) Descriptor() ([]byte, []int) { + return file_rank_proto_rawDescGZIP(), []int{25} +} + +func (x *SCRoomAward) GetList() []*UserAward { + if x != nil { + return x.List + } + return nil +} + +func (x *SCRoomAward) GetSkip() int32 { + if x != nil { + return x.Skip + } + return 0 +} + +func (x *SCRoomAward) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *SCRoomAward) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + var File_rank_proto protoreflect.FileDescriptor var file_rank_proto_rawDesc = []byte{ @@ -1954,44 +2215,67 @@ var file_rank_proto_rawDesc = []byte{ 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x45, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x61, 0x6e, 0x6b, 0x4d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x52, 0x61, 0x6e, 0x6b, 0x4d, 0x61, 0x78, - 0x4e, 0x75, 0x6d, 0x2a, 0x94, 0x03, 0x0a, 0x04, 0x52, 0x61, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x10, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x5a, 0x45, 0x52, 0x4f, - 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, - 0x4b, 0x5f, 0x43, 0x53, 0x52, 0x61, 0x6e, 0x6b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x10, 0x90, 0x4e, - 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, - 0x53, 0x43, 0x52, 0x61, 0x6e, 0x6b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x10, 0x91, 0x4e, 0x12, 0x17, - 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, - 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x92, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x93, 0x4e, + 0x4e, 0x75, 0x6d, 0x22, 0x37, 0x0a, 0x0b, 0x43, 0x53, 0x52, 0x6f, 0x6f, 0x6d, 0x41, 0x77, 0x61, + 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x24, 0x0a, 0x04, + 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x49, 0x64, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x01, 0x4e, 0x22, 0x67, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x41, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, + 0x6e, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x41, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x72, 0x61, 0x6e, 0x6b, 0x2e, 0x49, + 0x74, 0x65, 0x6d, 0x52, 0x06, 0x41, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x54, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x54, 0x73, 0x22, 0x72, 0x0a, 0x0b, 0x53, + 0x43, 0x52, 0x6f, 0x6f, 0x6d, 0x41, 0x77, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x69, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x61, 0x6e, 0x6b, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x41, 0x77, 0x61, 0x72, 0x64, 0x52, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, + 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x2a, + 0xc6, 0x03, 0x0a, 0x04, 0x52, 0x61, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x1c, + 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, + 0x52, 0x61, 0x6e, 0x6b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x10, 0x90, 0x4e, 0x12, 0x1c, 0x0a, 0x17, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x52, 0x61, + 0x6e, 0x6b, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x10, 0x91, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, 0x43, 0x6f, 0x69, 0x6e, + 0x10, 0x92, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, + 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x93, 0x4e, 0x12, 0x19, 0x0a, 0x14, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x10, 0x94, 0x4e, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x10, + 0x95, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x10, 0x96, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x4c, 0x6f, + 0x67, 0x10, 0x97, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, + 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, 0x57, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x98, 0x4e, + 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, + 0x53, 0x43, 0x57, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x99, 0x4e, 0x12, 0x18, 0x0a, 0x13, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x10, 0x9a, 0x4e, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x10, 0x9b, 0x4e, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, - 0x43, 0x53, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x10, 0x94, 0x4e, 0x12, 0x19, 0x0a, 0x14, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x10, 0x95, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x10, 0x96, 0x4e, 0x12, - 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x10, 0x97, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, 0x57, 0x69, 0x6e, 0x43, 0x6f, 0x69, - 0x6e, 0x10, 0x98, 0x4e, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, - 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x57, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x99, 0x4e, - 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, - 0x43, 0x53, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x10, 0x9a, 0x4e, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x10, 0x9b, 0x4e, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, - 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x53, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x10, 0x9c, 0x4e, 0x12, - 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, - 0x43, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x10, 0x9d, 0x4e, 0x2a, 0x8d, 0x01, 0x0a, 0x0a, 0x52, - 0x61, 0x6e, 0x6b, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x14, - 0x0a, 0x10, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x57, 0x65, 0x65, 0x6b, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x10, 0x03, 0x12, - 0x15, 0x0a, 0x11, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x55, 0x70, - 0x57, 0x65, 0x65, 0x6b, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4d, 0x61, 0x78, 0x10, 0x05, 0x42, 0x24, 0x5a, 0x22, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, - 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x72, 0x61, 0x6e, 0x6b, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x53, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x10, 0x9c, 0x4e, 0x12, 0x19, 0x0a, 0x14, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x53, 0x43, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x74, 0x10, 0x9d, 0x4e, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x52, 0x6f, 0x6f, 0x6d, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0x9e, 0x4e, 0x12, + 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x52, 0x6f, 0x6f, 0x6d, + 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0x9f, 0x4e, 0x2a, 0x8d, 0x01, 0x0a, 0x0a, 0x52, 0x61, 0x6e, + 0x6b, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x57, 0x65, 0x65, 0x6b, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x10, 0x03, 0x12, 0x15, 0x0a, + 0x11, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x55, 0x70, 0x57, 0x65, + 0x65, 0x6b, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x5f, 0x4d, 0x61, 0x78, 0x10, 0x05, 0x42, 0x24, 0x5a, 0x22, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x72, 0x61, 0x6e, 0x6b, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2007,7 +2291,7 @@ func file_rank_proto_rawDescGZIP() []byte { } var file_rank_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_rank_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_rank_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_rank_proto_goTypes = []interface{}{ (Rank)(0), // 0: rank.Rank (RankInvite)(0), // 1: rank.RankInvite @@ -2033,6 +2317,10 @@ var file_rank_proto_goTypes = []interface{}{ (*CSPermit)(nil), // 21: rank.CSPermit (*PermitRank)(nil), // 22: rank.PermitRank (*SCPermit)(nil), // 23: rank.SCPermit + (*CSRoomAward)(nil), // 24: rank.CSRoomAward + (*Item)(nil), // 25: rank.Item + (*UserAward)(nil), // 26: rank.UserAward + (*SCRoomAward)(nil), // 27: rank.SCRoomAward } var file_rank_proto_depIdxs = []int32{ 3, // 0: rank.SCRankMatch.Ranks:type_name -> rank.SeasonRank @@ -2048,11 +2336,13 @@ var file_rank_proto_depIdxs = []int32{ 19, // 10: rank.SCPlayerLevelRank.Me:type_name -> rank.PlayerLevelRankInfo 22, // 11: rank.SCPermit.Ranks:type_name -> rank.PermitRank 22, // 12: rank.SCPermit.Me:type_name -> rank.PermitRank - 13, // [13:13] is the sub-list for method output_type - 13, // [13:13] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 25, // 13: rank.UserAward.Awards:type_name -> rank.Item + 26, // 14: rank.SCRoomAward.List:type_name -> rank.UserAward + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_rank_proto_init() } @@ -2325,6 +2615,54 @@ func file_rank_proto_init() { return nil } } + file_rank_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CSRoomAward); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rank_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Item); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rank_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserAward); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rank_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCRoomAward); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -2332,7 +2670,7 @@ func file_rank_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rank_proto_rawDesc, NumEnums: 2, - NumMessages: 22, + NumMessages: 26, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/rank/rank.proto b/protocol/rank/rank.proto index 2793184..30af151 100644 --- a/protocol/rank/rank.proto +++ b/protocol/rank/rank.proto @@ -25,6 +25,9 @@ enum Rank{ //赛季通行证排行榜 PACKET_RANK_CSPermit = 10012; PACKET_RANK_SCPermit = 10013; + // 竞技馆获奖记录 + PACKET_CSRoomAward = 10014; + PACKET_SCRoomAward = 10015; } // 排位榜 @@ -207,4 +210,30 @@ message SCPermit{ int32 Skip = 3; // 偏移量 bool IsEndNum = 4; int32 RankMaxNum = 5; // 排行榜最大上限 +} + +//PACKET_CSRoomAward +message CSRoomAward{ + int32 Skip = 1; // 偏移量 + int32 Limit = 2; // 请求数量 +} + +message Item{ + int32 Id = 1; // 道具id + int64 N = 2; // 道具数量 +} + +message UserAward{ + int32 Snid = 1; // 玩家id + string Name = 2; // 昵称 + repeated Item Awards = 3; // 奖品 + int64 Ts = 4; // 获得时间 +} + +//PACKET_SCRoomAward +message SCRoomAward{ + repeated UserAward List = 1; + int32 Skip = 2; // 偏移量 + int32 Limit = 3; // 每页数量 + int32 Total = 4; // 总数量 } \ No newline at end of file diff --git a/ranksrv/action_gatesrv.go b/ranksrv/action_gatesrv.go index 0f1114e..e35d054 100644 --- a/ranksrv/action_gatesrv.go +++ b/ranksrv/action_gatesrv.go @@ -28,6 +28,8 @@ func init() { com.Register(int(rankproto.Rank_PACKET_RANK_CSLevel), rankproto.CSPlayerLevelRank{}, CSPlayerLevelRank) // 赛季通行证积分排行 com.Register(int(rankproto.Rank_PACKET_RANK_CSPermit), rankproto.CSPermit{}, CSPermit) + // 竞技馆获奖记录 + com.Register(int(rankproto.Rank_PACKET_CSRoomAward), rankproto.CSRoomAward{}, CSRoomAward) } func CSRankMatch(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error { @@ -545,3 +547,48 @@ func CSPermit(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data i }) return nil } + +func CSRoomAward(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error { + logger.Logger.Trace("CSRoomAward data:", data) + msg, ok := data.(*rankproto.CSRoomAward) + if !ok { + return nil + } + + rank.CustomAwardMgrInstance.Take(d.Platform, 0, func(list []*model.CustomLogAward, err error) { + if err != nil { + logger.Logger.Errorf("CSRoomAward error: %v", err) + return + } + + start, end := com.SkipLimitToStartEnd(msg.GetSkip(), msg.GetLimit(), len(list)) + + var ranks []*rankproto.UserAward + if end > start && int(start) < len(list) { + for _, v := range list[start:end] { + r := &rankproto.UserAward{ + Snid: v.SnId, + Name: v.Name, + Ts: v.EndTs, + } + for _, vv := range v.Awards { + r.Awards = append(r.Awards, &rankproto.Item{ + Id: vv.ItemId, + N: vv.ItemNum, + }) + } + ranks = append(ranks, r) + } + } + + pack := &rankproto.SCRoomAward{ + List: ranks, + Skip: start, + Limit: msg.GetLimit(), + Total: int32(len(list)), + } + common.SendToGate(sid, int(rankproto.Rank_PACKET_SCRoomAward), pack, s) + logger.Logger.Tracef("SCRoomAward: %v", pack) + }) + return nil +} diff --git a/ranksrv/com/listmgr.go b/ranksrv/com/listmgr.go index 511254c..14d818e 100644 --- a/ranksrv/com/listmgr.go +++ b/ranksrv/com/listmgr.go @@ -8,6 +8,9 @@ import ( "mongo.games.com/goserver/core/task" ) +// NewListMgr 创建一个列表管理器 +// cacheTime 缓存时间,单位秒 +// loadFunc 加载函数 func NewListMgr[T any](cacheTime func() int64, loadFunc func(platform string, index int32) ([]T, error)) *ListMgr[T] { return &ListMgr[T]{ platform: make(map[string]map[int32]*DataItem[T]), diff --git a/ranksrv/rank/customaward.go b/ranksrv/rank/customaward.go new file mode 100644 index 0000000..0cfc9d4 --- /dev/null +++ b/ranksrv/rank/customaward.go @@ -0,0 +1,24 @@ +package rank + +import ( + "time" + + "github.com/jinzhu/now" + "mongo.games.com/goserver/core/logger" + + "mongo.games.com/game/model" + "mongo.games.com/game/ranksrv/com" +) + +var CustomAwardMgrInstance = com.NewListMgr[*model.CustomLogAward]( + func() int64 { + return int64(model.GameParamData.CustomAwardUpdateTime) + }, + func(platform string, index int32) ([]*model.CustomLogAward, error) { + // 当天数据 + startTs := now.BeginningOfDay().Unix() + endTs := startTs + 24*int64(time.Hour.Seconds()) + logger.Logger.Tracef("load custom award platform:%s startTs:%v endTs:%v", platform, startTs, endTs) + ret, err := model.CustomLogAwardFind(platform, startTs, endTs) + return ret, err + })