actor_account.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package account
  2. import (
  3. "context"
  4. mhayaTime "github.com/mhaya/extend/time"
  5. cutils "github.com/mhaya/extend/utils"
  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/internal/param"
  12. cactor "github.com/mhaya/net/actor"
  13. "go.mongodb.org/mongo-driver/bson"
  14. "go.mongodb.org/mongo-driver/mongo/options"
  15. "strings"
  16. "time"
  17. )
  18. type (
  19. ActorAccount struct {
  20. cactor.Base
  21. time int64
  22. serverLoad map[string]string
  23. account models.Account
  24. }
  25. )
  26. func (p *ActorAccount) AliasID() string {
  27. return "account"
  28. }
  29. // OnInit center为后端节点,不直接与客户端通信,所以注册了一些remote函数,供RPC调用
  30. func (p *ActorAccount) OnInit() {
  31. p.Remote().Register("registerAccount", p.registerOrLoinAccount)
  32. p.Timer().Add(time.Minute, p.Stat)
  33. p.Timer().Add(time.Minute, p.playerLevelStat)
  34. p.Timer().AddFixedHour(23, 59, 59, p.Stat)
  35. }
  36. func (p *ActorAccount) Stat() {
  37. daily := mhayaTime.Now().DailyTOTimeStamp()
  38. platformConfig := data.PlatformConfig.GatMap()
  39. channelConfig := data.ChannelConfig.GatMap()
  40. for _, v := range platformConfig {
  41. for _, v2 := range channelConfig {
  42. p.dailyStat(v.Name, v2.Name, daily)
  43. time.Sleep(time.Second)
  44. }
  45. }
  46. }
  47. func (p *ActorAccount) playerLevelStat() {
  48. platformConfig := data.PlatformConfig.GatMap()
  49. channelConfig := data.ChannelConfig.GatMap()
  50. for _, v := range platformConfig {
  51. for _, v2 := range channelConfig {
  52. p.levelStat(v.Name, v2.Name)
  53. }
  54. }
  55. }
  56. func (p *ActorAccount) levelStat(platform, channel string) {
  57. level := make(map[string]int)
  58. ret, err := models.GetAllTotalPlayerRecord(platform, channel)
  59. if err != nil {
  60. return
  61. }
  62. for _, v := range ret {
  63. level[v] += 1
  64. }
  65. var stat models.PlayerLevelStat
  66. stat.Platform = platform
  67. stat.Channel = channel
  68. stat.ServerLevel = level
  69. mdb.MDB.Collection(constant.CNamePlayerLevelStat).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
  70. }
  71. func (p *ActorAccount) dailyStat(platform, channel string, daily int64) {
  72. var dailyRecord models.DailyRecord
  73. dailyRecord.Daily = daily
  74. dailyRecord.Platform = platform
  75. dailyRecord.Channel = channel
  76. dailyRecord.Registered = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewRegistered)
  77. dailyRecord.NewLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewLogin)
  78. dailyRecord.OldLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldLogin)
  79. dailyRecord.LoggedIn = dailyRecord.NewLogin + dailyRecord.OldLogin
  80. dailyRecord.NewActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewActive)
  81. dailyRecord.OldActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldActive)
  82. dailyRecord.ActiveUsers = dailyRecord.NewActive + dailyRecord.NewActive
  83. point, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordTotalPoints)
  84. if err == nil {
  85. dailyRecord.TotalPoints = point
  86. }
  87. u, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUProduced)
  88. if err == nil {
  89. dailyRecord.UProduced = cutils.QuoInt64ByRatioToFloat64(u, constant.MoneyRatio)
  90. }
  91. uCashOut, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUCashout)
  92. if err == nil {
  93. dailyRecord.UCashout = cutils.QuoInt64ByRatioToFloat64(uCashOut, constant.MoneyRatio)
  94. }
  95. dailyRecord.CreatedAt = mhayaTime.Now().Unix()
  96. dailyRecord.UpdatedAt = mhayaTime.Now().Unix()
  97. mdb.MDB.Collection(constant.CNamePlayerDailyRecord).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel, "daily": daily}, bson.M{"$set": &dailyRecord}, options.Update().SetUpsert(true))
  98. }
  99. // registerDevAccount 注册开发者帐号
  100. func (p *ActorAccount) registerOrLoinAccount(req *param.LoginReq) (*param.LoginResp, int32) {
  101. if strings.TrimSpace(req.OpenID) == "" || strings.TrimSpace(req.IP) == "" || strings.TrimSpace(req.Platform) == "" || strings.TrimSpace(req.Channel) == "" {
  102. return nil, code.Error
  103. }
  104. account, err := p.account.AccountRegisterOrLogin(req)
  105. if err > 0 {
  106. return nil, code.Error
  107. }
  108. return &param.LoginResp{
  109. UserName: account.UserName,
  110. OpenId: account.OpenId,
  111. }, code.OK
  112. }