|
@@ -8,6 +8,7 @@ import (
|
|
|
"github.com/mhaya/game/game_cluster/internal/code"
|
|
|
"github.com/mhaya/game/game_cluster/internal/constant"
|
|
|
"github.com/mhaya/game/game_cluster/internal/mdb"
|
|
|
+ "github.com/mhaya/game/game_cluster/internal/mdb/eventmodels"
|
|
|
"github.com/mhaya/game/game_cluster/internal/mdb/models"
|
|
|
"github.com/mhaya/game/game_cluster/nodes/webadmin/common"
|
|
|
"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
|
|
@@ -15,6 +16,7 @@ import (
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
|
+ "gorm.io/gorm"
|
|
|
)
|
|
|
|
|
|
type PlayerManage struct {
|
|
@@ -31,155 +33,395 @@ func NewPlayerManage() *PlayerManage {
|
|
|
func (a *PlayerManage) List(ctx context.Context, req entity.PlayerListReq) (*entity.PlayerListResp, *code.Result) {
|
|
|
page, pageSize := checkPageParam(req.Page, req.Size)
|
|
|
|
|
|
- // 构建查询条件
|
|
|
- filter := bson.M{}
|
|
|
- if req.UserName != "" {
|
|
|
- filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
|
|
|
- }
|
|
|
- if req.NickName != "" {
|
|
|
- filter["nickName"] = bson.M{"$regex": escapeRegex(req.NickName), "$options": "i"}
|
|
|
- }
|
|
|
- if req.OpenId != "" {
|
|
|
- filter["openId"] = req.OpenId
|
|
|
- }
|
|
|
- if req.Pid != "" {
|
|
|
- filter["pid"] = req.Pid
|
|
|
- }
|
|
|
- if req.XID != "" {
|
|
|
- filter["xID"] = req.XID
|
|
|
- }
|
|
|
- if req.TonWall != "" {
|
|
|
- filter["tonWall"] = req.TonWall
|
|
|
- }
|
|
|
- if req.Email != "" {
|
|
|
- filter["email"] = req.Email
|
|
|
+ var registerRecords []*eventmodels.UserRegisterEventContent
|
|
|
+
|
|
|
+ where := &eventmodels.UserRegisterEventContent{
|
|
|
+ UserBasic: eventmodels.UserBasic{
|
|
|
+ UserId: req.UserName,
|
|
|
+ TgId: req.OpenId,
|
|
|
+ XId: req.XID,
|
|
|
+ ParentUserId: req.Pid,
|
|
|
+ TonWall: req.TonWall,
|
|
|
+ Email: req.Email,
|
|
|
+ UserStatus: req.Status,
|
|
|
+ },
|
|
|
}
|
|
|
+ db := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).Order("create_at")
|
|
|
+
|
|
|
if req.LevelMin > 0 && req.LevelMax == 0 {
|
|
|
- filter["level"] = bson.M{
|
|
|
- "$gte": req.LevelMin,
|
|
|
- "$lte": 1000, // 等级最大值
|
|
|
- }
|
|
|
+ db = db.Where("level >= ? and level <= ?", req.LevelMin, 1000) // 等级最大值 暂定1000
|
|
|
}
|
|
|
+
|
|
|
if req.LevelMin > 0 && req.LevelMax > 0 && req.LevelMin <= req.LevelMax {
|
|
|
- filter["level"] = bson.M{
|
|
|
- "$gte": req.LevelMin,
|
|
|
- "$lte": req.LevelMax,
|
|
|
- }
|
|
|
- }
|
|
|
- if req.Status > 0 {
|
|
|
- filter["status"] = req.Status
|
|
|
- }
|
|
|
- if req.LoginIP != "" {
|
|
|
- filter["loginIP"] = req.LoginIP
|
|
|
+ db = db.Where("level >= ? and level <= ?", req.LevelMin, req.LevelMax)
|
|
|
}
|
|
|
+
|
|
|
if req.JoinTimeMin > 0 && req.JoinTimeMax > 0 && req.JoinTimeMin <= req.JoinTimeMax {
|
|
|
- filter["joinTime"] = bson.M{
|
|
|
- "$gte": req.JoinTimeMin,
|
|
|
- "$lte": req.JoinTimeMax,
|
|
|
- }
|
|
|
+ db = db.Where("create_at >= ? and create_at <= ?", req.JoinTimeMin, req.JoinTimeMax)
|
|
|
}
|
|
|
|
|
|
- // 设置分页选项
|
|
|
- skip := (page - 1) * pageSize
|
|
|
- limit := pageSize
|
|
|
- findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
|
|
|
-
|
|
|
- // 执行查询
|
|
|
- cursor, err := a.db.Collection(constant.CNamePlayer).Find(ctx, filter, findOptions)
|
|
|
- if err != nil {
|
|
|
+ pages := Paginate(db, page, pageSize)
|
|
|
+ err := db.Scopes(pages.Limit).Find(®isterRecords).Error
|
|
|
+ if err != nil && err != gorm.ErrRecordNotFound {
|
|
|
mhayaLogger.Warnf("List Find error:%v", err)
|
|
|
return nil, common.NewResult(code.InternalError)
|
|
|
}
|
|
|
- defer func() {
|
|
|
- if closeErr := cursor.Close(ctx); closeErr != nil {
|
|
|
- mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
|
|
|
+
|
|
|
+ var results []*entity.PlayerListDetail
|
|
|
+ for _, v := range registerRecords {
|
|
|
+ // 获取最新的用户信息更新记录
|
|
|
+ var updateRecord *eventmodels.UserUpdateInfoEventContent
|
|
|
+ updateWhere := &eventmodels.UserUpdateInfoEventContent{
|
|
|
+ UserBasic: eventmodels.UserBasic{UserId: v.UserName, TgId: v.TgId},
|
|
|
+ }
|
|
|
+ err := mdb.LogstashDB.Model(&eventmodels.UserUpdateInfoEventContent{}).Where(updateWhere).Order("create_at desc").First(&updateRecord).Error
|
|
|
+ if err != nil && err != gorm.ErrRecordNotFound {
|
|
|
+ mhayaLogger.Warnf("List First updateRecord error:%v", err)
|
|
|
+ return nil, common.NewResult(code.InternalError)
|
|
|
}
|
|
|
- }()
|
|
|
|
|
|
- // 解析结果
|
|
|
- details := make([]*entity.PlayerListDetail, 0)
|
|
|
- for cursor.Next(ctx) {
|
|
|
- var detail entity.PlayerListDetail
|
|
|
- if err := cursor.Decode(&detail); err != nil {
|
|
|
- mhayaLogger.Warnf("List Decode error:%v", err)
|
|
|
+ // 获取最新的用户登录记录
|
|
|
+ var loginRecord *eventmodels.UserLoginEventContent
|
|
|
+ loginWhere := &eventmodels.UserLoginEventContent{
|
|
|
+ UserBasic: eventmodels.UserBasic{UserId: v.UserName, TgId: v.TgId},
|
|
|
+ }
|
|
|
+ err = mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Where(loginWhere).Order("create_at desc").First(&loginRecord).Error
|
|
|
+ if err != nil && err != gorm.ErrRecordNotFound {
|
|
|
+ mhayaLogger.Warnf("List First loginRecord error:%v", err)
|
|
|
return nil, common.NewResult(code.InternalError)
|
|
|
}
|
|
|
- details = append(details, &detail)
|
|
|
- }
|
|
|
- if err := cursor.Err(); err != nil {
|
|
|
- mhayaLogger.Warnf("List cursor error:%v", err)
|
|
|
- return nil, common.NewResult(code.InternalError)
|
|
|
- }
|
|
|
|
|
|
- count, codeResult := a.GetPlayerTotalCount()
|
|
|
- if codeResult != nil {
|
|
|
- mhayaLogger.Warnf("List GetPlayerTotalCount codeResult:%v", codeResult)
|
|
|
- return nil, codeResult
|
|
|
+ results = append(results, &entity.PlayerListDetail{
|
|
|
+ UserName: v.UserId,
|
|
|
+ OpenId: func() string {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.TgId
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.TgId
|
|
|
+ }(),
|
|
|
+ NickName: func() string {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.UserName
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.UserName
|
|
|
+ }(),
|
|
|
+ Pid: func() string {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.ParentUserId
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.ParentUserId
|
|
|
+ }(),
|
|
|
+ XID: func() string {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.XId
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.XId
|
|
|
+ }(),
|
|
|
+ TonWall: func() string {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.TonWall
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.TonWall
|
|
|
+ }(),
|
|
|
+ Email: func() string {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.Email
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.Email
|
|
|
+ }(),
|
|
|
+ Level: func() int {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.Level
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.Level
|
|
|
+ }(),
|
|
|
+ Status: func() int {
|
|
|
+ if updateRecord == nil {
|
|
|
+ return v.UserStatus
|
|
|
+ }
|
|
|
+
|
|
|
+ return updateRecord.UserStatus
|
|
|
+ }(),
|
|
|
+ LoginTime: func() int64 {
|
|
|
+ if loginRecord != nil {
|
|
|
+ return loginRecord.CreateAt
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ LoginIP: func() string {
|
|
|
+ if loginRecord != nil {
|
|
|
+ return loginRecord.Ip
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ JoinIP: v.Ip,
|
|
|
+ JoinTime: v.CreateAt,
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
return &entity.PlayerListResp{
|
|
|
- Details: details,
|
|
|
- Total: count,
|
|
|
+ Details: results,
|
|
|
+ Total: pages.Count,
|
|
|
}, nil
|
|
|
}
|
|
|
|
|
|
+// 获取的是注册的总人数
|
|
|
func (a *PlayerManage) GetPlayerTotalCount() (int64, *code.Result) {
|
|
|
- count := 0
|
|
|
- playerServerLoadStats, codeResult := NewAdmin().GetServerStatus(context.Background())
|
|
|
- if codeResult != nil {
|
|
|
- return 0, codeResult
|
|
|
+ where := &eventmodels.UserRegisterEventContent{
|
|
|
+ EventBasic: eventmodels.EventBasic{
|
|
|
+ Status: 0,
|
|
|
+ },
|
|
|
}
|
|
|
+ db := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).Order("create_at")
|
|
|
|
|
|
- for _, v := range playerServerLoadStats {
|
|
|
- count += int(v.TotalUser)
|
|
|
+ var count int64
|
|
|
+ err := db.Count(&count).Error
|
|
|
+ if err != nil {
|
|
|
+ mhayaLogger.Warnf("GetPlayerTotalCount Count error:%v", err)
|
|
|
+ return 0, common.NewResult(code.InternalError)
|
|
|
}
|
|
|
|
|
|
- return int64(count), nil
|
|
|
+ return count, nil
|
|
|
+}
|
|
|
+
|
|
|
+// 获取的是登录过的总人数 根据user_id去重
|
|
|
+func (a *PlayerManage) GetLoginedPlayerTotalCount() (int64, *code.Result) {
|
|
|
+ where := &eventmodels.UserLoginEventContent{
|
|
|
+ EventBasic: eventmodels.EventBasic{
|
|
|
+ Status: 0,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ db := mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Distinct("user_id").Where(where)
|
|
|
+
|
|
|
+ var count int64
|
|
|
+ err := db.Count(&count).Error
|
|
|
+ if err != nil {
|
|
|
+ mhayaLogger.Warnf("GetLoginedPlayerTotalCount Count error:%v", err)
|
|
|
+ return 0, common.NewResult(code.InternalError)
|
|
|
+ }
|
|
|
+
|
|
|
+ return count, nil
|
|
|
}
|
|
|
|
|
|
// 获取玩家详情
|
|
|
func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, *code.Result) {
|
|
|
- var player models.Player
|
|
|
- err := a.db.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.UserName}).Decode(&player)
|
|
|
- if err != nil {
|
|
|
- mhayaLogger.Warnf("PlayerInfo cursor error:%v", err)
|
|
|
+ // 获取最新的用户信息更新记录
|
|
|
+ var updateRecord *eventmodels.UserUpdateInfoEventContent
|
|
|
+ updateWhere := &eventmodels.UserUpdateInfoEventContent{
|
|
|
+ UserBasic: eventmodels.UserBasic{UserId: req.UserName},
|
|
|
+ }
|
|
|
+ err := mdb.LogstashDB.Model(&eventmodels.UserUpdateInfoEventContent{}).Where(updateWhere).Order("create_at desc").First(&updateRecord).Error
|
|
|
+ if err != nil && err != gorm.ErrRecordNotFound {
|
|
|
+ mhayaLogger.Warnf("PlayerInfo First updateRecord error:%v", err)
|
|
|
+ return nil, common.NewResult(code.InternalError)
|
|
|
+ }
|
|
|
+
|
|
|
+ var registerRecord *eventmodels.UserRegisterEventContent
|
|
|
+ if updateRecord == nil {
|
|
|
+ where := &eventmodels.UserRegisterEventContent{
|
|
|
+ UserBasic: eventmodels.UserBasic{UserId: req.UserName},
|
|
|
+ }
|
|
|
+ err := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).First(®isterRecord).Error
|
|
|
+ if err != nil && err != gorm.ErrRecordNotFound {
|
|
|
+ mhayaLogger.Warnf("PlayerInfo First registerRecord error:%v", err)
|
|
|
+ return nil, common.NewResult(code.InternalError)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取最新的用户登录记录
|
|
|
+ var loginRecord *eventmodels.UserLoginEventContent
|
|
|
+ loginWhere := &eventmodels.UserLoginEventContent{
|
|
|
+ UserBasic: eventmodels.UserBasic{UserId: req.UserName},
|
|
|
+ }
|
|
|
+ err = mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Where(loginWhere).Order("create_at desc").First(&loginRecord).Error
|
|
|
+ if err != nil && err != gorm.ErrRecordNotFound {
|
|
|
+ mhayaLogger.Warnf("PlayerInfo First loginRecord error:%v", err)
|
|
|
return nil, common.NewResult(code.InternalError)
|
|
|
}
|
|
|
|
|
|
return &entity.PlayerInfoResp{
|
|
|
- UserName: player.UserName,
|
|
|
- OpenId: player.OpenId,
|
|
|
- UserNameMaybe: player.UserNameMaybe,
|
|
|
- NickName: player.NickName,
|
|
|
- Pid: player.Pid,
|
|
|
- XID: player.XID,
|
|
|
- TonWall: player.TonWall,
|
|
|
- Email: player.Email,
|
|
|
- Level: player.Level,
|
|
|
- Status: player.Status,
|
|
|
- LoginTime: player.LoginTime,
|
|
|
- LoginIP: player.LoginIP,
|
|
|
- JoinIP: player.JoinIP,
|
|
|
- JoinTime: player.JoinTime,
|
|
|
- Avatar: player.Avatar,
|
|
|
- IsRobot: player.IsRobot,
|
|
|
- IsLeader: player.IsLeader,
|
|
|
- IsVip: player.IsVip,
|
|
|
- Successions: player.Successions,
|
|
|
- MaxSuccessions: player.MaxSuccessions,
|
|
|
- PrevTime: player.PrevTime,
|
|
|
- UpdateTime: player.UpdateTime,
|
|
|
- IsDrawShare: player.Share.IsDrawShare,
|
|
|
- DrawShareTime: player.Share.DrawShareTime,
|
|
|
- FirstReward: player.FirstReward,
|
|
|
- Item: player.Item,
|
|
|
- SinIn: player.SinIn,
|
|
|
- DailyTask: player.DailyTask,
|
|
|
- AchieveTask: player.AchieveTask,
|
|
|
- RankReward: player.RankReward,
|
|
|
- Invite: player.Invite,
|
|
|
- InviteReward: player.InviteReward,
|
|
|
- Roll: player.Roll,
|
|
|
+ UserName: func() string {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.UserId
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.UserId
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ OpenId: func() string {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.TgId
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.TgId
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ NickName: func() string {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.UserName
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.UserName
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ Pid: func() string {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.ParentUserId
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.ParentUserId
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ XID: func() string {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.XId
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.XId
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ TonWall: func() string {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.TonWall
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.TonWall
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ Email: func() string {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.Email
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.Email
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ Level: func() int {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.Level
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.Level
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ Status: func() int {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.UserStatus
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.UserStatus
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ LoginTime: func() int64 {
|
|
|
+ if loginRecord != nil {
|
|
|
+ return loginRecord.CreateAt
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ LoginIP: func() string {
|
|
|
+ if loginRecord != nil {
|
|
|
+ return loginRecord.Ip
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ JoinIP: func() string {
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.Ip
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""
|
|
|
+ }(),
|
|
|
+ JoinTime: func() int64 {
|
|
|
+ if registerRecord != nil {
|
|
|
+ return registerRecord.CreateAt
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ Avatar: "",
|
|
|
+ IsRobot: func() int {
|
|
|
+ if updateRecord != nil && updateRecord.IsRobot {
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+
|
|
|
+ if registerRecord != nil && registerRecord.IsRobot {
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ IsLeader: func() int {
|
|
|
+ if updateRecord != nil && updateRecord.IsLeader {
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ IsVip: func() int {
|
|
|
+ if updateRecord != nil && updateRecord.IsVip {
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ Successions: 0, // TODO
|
|
|
+ MaxSuccessions: 0, // TODO
|
|
|
+ PrevTime: func() int64 {
|
|
|
+ if loginRecord != nil {
|
|
|
+ return loginRecord.CreateAt
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ UpdateTime: func() int64 {
|
|
|
+ if updateRecord != nil {
|
|
|
+ return updateRecord.CreateAt
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0
|
|
|
+ }(),
|
|
|
+ IsDrawShare: 0,
|
|
|
+ DrawShareTime: 0,
|
|
|
+ FirstReward: 0,
|
|
|
+ // TODO 其他玩家信息
|
|
|
}, nil
|
|
|
}
|
|
|
|