playerMange.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package service
  2. import (
  3. "context"
  4. "time"
  5. mhayaTime "github.com/mhaya/extend/time"
  6. "github.com/mhaya/game/game_cluster/internal/code"
  7. "github.com/mhaya/game/game_cluster/internal/constant"
  8. "github.com/mhaya/game/game_cluster/internal/data"
  9. "github.com/mhaya/game/game_cluster/internal/mdb"
  10. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  11. "github.com/mhaya/game/game_cluster/nodes/webadmin/common"
  12. "github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
  13. mhayaLogger "github.com/mhaya/logger"
  14. "go.mongodb.org/mongo-driver/bson"
  15. "go.mongodb.org/mongo-driver/mongo"
  16. "go.mongodb.org/mongo-driver/mongo/options"
  17. )
  18. type PlayerManage struct {
  19. db *mongo.Database
  20. }
  21. func NewPlayerManage() *PlayerManage {
  22. return &PlayerManage{
  23. db: mdb.MDB,
  24. }
  25. }
  26. // 获取玩家列表
  27. func (a *PlayerManage) List(ctx context.Context, req entity.PlayerListReq) (*entity.PlayerListResp, *code.Result) {
  28. page, pageSize := checkPageParam(req.Page, req.Size)
  29. // 构建查询条件
  30. filter := bson.M{}
  31. if req.UserName != "" {
  32. filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
  33. }
  34. if req.NickName != "" {
  35. filter["nickName"] = bson.M{"$regex": escapeRegex(req.NickName), "$options": "i"}
  36. }
  37. if req.OpenId != "" {
  38. filter["openId"] = req.OpenId
  39. }
  40. if req.Pid != "" {
  41. filter["pid"] = req.Pid
  42. }
  43. if req.XID != "" {
  44. filter["xID"] = req.XID
  45. }
  46. if req.TonWall != "" {
  47. filter["tonWall"] = req.TonWall
  48. }
  49. if req.Email != "" {
  50. filter["email"] = req.Email
  51. }
  52. if req.LevelMin > 0 && req.LevelMax > 0 && req.LevelMin <= req.LevelMax {
  53. filter["level"] = bson.M{
  54. "$gte": req.LevelMin,
  55. "$lte": req.LevelMax,
  56. }
  57. }
  58. if req.Status > 0 {
  59. filter["status"] = req.Status
  60. }
  61. if req.LoginIP != "" {
  62. filter["loginIP"] = req.LoginIP
  63. }
  64. if req.JoinTimeMin > 0 && req.JoinTimeMax > 0 && req.JoinTimeMin <= req.JoinTimeMax {
  65. filter["joinTime"] = bson.M{
  66. "$gte": req.JoinTimeMin,
  67. "$lte": req.JoinTimeMax,
  68. }
  69. }
  70. // 设置分页选项
  71. skip := (page - 1) * pageSize
  72. limit := pageSize
  73. findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
  74. // 执行查询
  75. cursor, err := a.db.Collection(constant.CNamePlayer).Find(ctx, filter, findOptions)
  76. if err != nil {
  77. mhayaLogger.Warnf("List Find error:%v", err)
  78. return nil, common.NewResult(code.InternalError)
  79. }
  80. defer func() {
  81. if closeErr := cursor.Close(ctx); closeErr != nil {
  82. mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
  83. }
  84. }()
  85. // 解析结果
  86. details := make([]*entity.PlayerListDetail, 0)
  87. for cursor.Next(ctx) {
  88. var detail entity.PlayerListDetail
  89. if err := cursor.Decode(&detail); err != nil {
  90. mhayaLogger.Warnf("List Decode error:%v", err)
  91. return nil, common.NewResult(code.InternalError)
  92. }
  93. details = append(details, &detail)
  94. }
  95. if err := cursor.Err(); err != nil {
  96. mhayaLogger.Warnf("List cursor error:%v", err)
  97. return nil, common.NewResult(code.InternalError)
  98. }
  99. count, codeResult := a.GetPlayerTotalCount()
  100. if codeResult != nil {
  101. mhayaLogger.Warnf("List GetPlayerTotalCount codeResult:%v", codeResult)
  102. return nil, codeResult
  103. }
  104. return &entity.PlayerListResp{
  105. Details: details,
  106. Total: count,
  107. }, nil
  108. }
  109. func (a *PlayerManage) GetPlayerTotalCount() (int64, *code.Result) {
  110. count := 0
  111. playerServerLoadStats, codeResult := NewAdmin().GetServerStatus(context.Background())
  112. if codeResult != nil {
  113. return 0, codeResult
  114. }
  115. for _, v := range playerServerLoadStats {
  116. count += int(v.TotalUser)
  117. }
  118. return int64(count), nil
  119. }
  120. // 获取玩家详情
  121. func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, *code.Result) {
  122. var player models.Player
  123. err := a.db.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.UserName}).Decode(&player)
  124. if err != nil {
  125. mhayaLogger.Warnf("PlayerInfo cursor error:%v", err)
  126. return nil, common.NewResult(code.InternalError)
  127. }
  128. return &entity.PlayerInfoResp{
  129. UserName: player.UserName,
  130. OpenId: player.OpenId,
  131. UserNameMaybe: player.UserNameMaybe,
  132. NickName: player.NickName,
  133. Pid: player.Pid,
  134. XID: player.XID,
  135. TonWall: player.TonWall,
  136. Email: player.Email,
  137. Level: player.Level,
  138. Status: player.Status,
  139. LoginTime: player.LoginTime,
  140. LoginIP: player.LoginIP,
  141. JoinIP: player.JoinIP,
  142. JoinTime: player.JoinTime,
  143. Avatar: player.Avatar,
  144. IsRobot: player.IsRobot,
  145. IsLeader: player.IsLeader,
  146. IsVip: player.IsVip,
  147. Successions: player.Successions,
  148. MaxSuccessions: player.MaxSuccessions,
  149. PrevTime: player.PrevTime,
  150. UpdateTime: player.UpdateTime,
  151. IsDrawShare: player.Share.IsDrawShare,
  152. DrawShareTime: player.Share.DrawShareTime,
  153. FirstReward: player.FirstReward,
  154. }, nil
  155. }
  156. // 获取玩家中奖记录(默认查询最近三天)
  157. func (a *PlayerManage) RewardList(ctx context.Context, req entity.RewardListReq) (*entity.RewardListResp, *code.Result) {
  158. page, pageSize := checkPageParam(req.Page, req.Size)
  159. // 构建查询条件
  160. filter := bson.M{}
  161. if req.UserName != "" {
  162. filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
  163. }
  164. startTime := mhayaTime.Now().StartOfDay().Unix()
  165. endTime := mhayaTime.Now().EndOfDay().Add(3 * 24 * time.Hour).Unix()
  166. if req.StartTime > 0 && req.StartTime < req.EndTime {
  167. startTime = req.StartTime
  168. }
  169. if req.EndTime > 0 && req.EndTime <= endTime {
  170. endTime = req.EndTime
  171. }
  172. filter["createTime"] = bson.M{
  173. "$gte": startTime,
  174. "$lte": endTime,
  175. }
  176. // 设置分页选项
  177. skip := (page - 1) * pageSize
  178. limit := pageSize
  179. findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
  180. collection := a.db.Collection(constant.CNamePlayerReward)
  181. // 获取总数total
  182. count, err := collection.CountDocuments(ctx, filter)
  183. if err != nil {
  184. mhayaLogger.Warnf("RewardList count error:%v", err)
  185. return nil, common.NewResult(code.InternalError)
  186. }
  187. // 执行查询
  188. cursor, err := collection.Find(ctx, filter, findOptions)
  189. if err != nil {
  190. mhayaLogger.Warnf("RewardList Find error:%v", err)
  191. return nil, common.NewResult(code.InternalError)
  192. }
  193. defer func() {
  194. if closeErr := cursor.Close(ctx); closeErr != nil {
  195. mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
  196. }
  197. }()
  198. // 解析结果
  199. results := make([]*entity.RewardListDetail, 0)
  200. for cursor.Next(ctx) {
  201. var result entity.RewardListDetail
  202. if err := cursor.Decode(&result); err != nil {
  203. mhayaLogger.Warnf("RewardList Decode error:%v", err)
  204. return nil, common.NewResult(code.InternalError)
  205. }
  206. results = append(results, &result)
  207. }
  208. if err := cursor.Err(); err != nil {
  209. mhayaLogger.Warnf("RewardList cursor error:%v", err)
  210. return nil, common.NewResult(code.InternalError)
  211. }
  212. for _, result := range results {
  213. for _, v := range result.AddReward {
  214. cfg, exist := data.ItemConfig.Get(v.ItemID)
  215. if exist {
  216. v.ItemName = cfg.ItemKey
  217. }
  218. }
  219. }
  220. return &entity.RewardListResp{
  221. Details: results,
  222. Total: count,
  223. }, nil
  224. }