actor_account.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package account
  2. import (
  3. "context"
  4. "strings"
  5. "time"
  6. mhayaTime "github.com/mhaya/extend/time"
  7. cutils "github.com/mhaya/extend/utils"
  8. "github.com/mhaya/game/game_cluster/internal/code"
  9. "github.com/mhaya/game/game_cluster/internal/constant"
  10. "github.com/mhaya/game/game_cluster/internal/data"
  11. "github.com/mhaya/game/game_cluster/internal/mdb"
  12. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  13. "github.com/mhaya/game/game_cluster/internal/param"
  14. "github.com/mhaya/game/game_cluster/internal/third"
  15. cactor "github.com/mhaya/net/actor"
  16. "go.mongodb.org/mongo-driver/bson"
  17. "go.mongodb.org/mongo-driver/mongo/options"
  18. )
  19. type (
  20. ActorAccount struct {
  21. cactor.Base
  22. time int64
  23. serverLoad map[string]string
  24. account models.Account
  25. }
  26. )
  27. func (p *ActorAccount) AliasID() string {
  28. return "account"
  29. }
  30. // OnInit center为后端节点,不直接与客户端通信,所以注册了一些remote函数,供RPC调用
  31. func (p *ActorAccount) OnInit() {
  32. p.Remote().Register("registerAccount", p.registerOrLoinAccount)
  33. p.Timer().Add(5*time.Second, p.load)
  34. p.Timer().Add(time.Minute, p.Stat)
  35. p.Timer().Add(1*time.Minute, p.PlayerIpStat)
  36. p.Timer().Add(time.Minute, p.playerLevelStat)
  37. p.Timer().AddFixedHour(23, 59, 59, p.Stat)
  38. // p.Timer().AddOnce(30*time.Second, RunToMongoDB)
  39. }
  40. func (p *ActorAccount) Stat() {
  41. daily := mhayaTime.Now().DailyTOTimeStamp()
  42. var dailyRecord models.DailyRecord
  43. dailyRecord.Daily = daily
  44. platformConfig := data.PlatformConfig.GatMap()
  45. channelConfig := data.ChannelConfig.GatMap()
  46. for _, v := range platformConfig {
  47. for _, v2 := range channelConfig {
  48. p.dailyStat(v.Name, v2.Name, daily)
  49. }
  50. }
  51. }
  52. func (p *ActorAccount) playerLevelStat() {
  53. platformConfig := data.PlatformConfig.GatMap()
  54. channelConfig := data.ChannelConfig.GatMap()
  55. for _, v := range platformConfig {
  56. for _, v2 := range channelConfig {
  57. p.levelStat(v.Name, v2.Name)
  58. }
  59. }
  60. }
  61. func (p *ActorAccount) PlayerIpStat() {
  62. daily := mhayaTime.Now().DailyTOTimeStamp()
  63. platformConfig := data.PlatformConfig.GatMap()
  64. channelConfig := data.ChannelConfig.GatMap()
  65. for _, v := range platformConfig {
  66. for _, v2 := range channelConfig {
  67. p.ipStat(v.Name, v2.Name, daily)
  68. }
  69. }
  70. }
  71. func (p *ActorAccount) load() {
  72. m, err := mdb.RDB.HGetAll(context.Background(), constant.ServerLoadHKey).Result()
  73. if err != nil {
  74. return
  75. }
  76. var stat models.PlayerServerLoadStat
  77. stat.Name = "load"
  78. stat.Load = m
  79. stat.TotalUser = p.userStat()
  80. stat.UpdateTime = mhayaTime.Now().Unix()
  81. mdb.MDB.Collection(constant.CNameServerLoadStat).UpdateOne(context.Background(), bson.M{"name": "load"}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
  82. }
  83. func (p *ActorAccount) userStat() int64 {
  84. var num int64
  85. platformConfig := data.PlatformConfig.GatMap()
  86. channelConfig := data.ChannelConfig.GatMap()
  87. for _, v := range platformConfig {
  88. for _, v2 := range channelConfig {
  89. num += models.GetTotalPlayerRecordLen(v.Name, v2.Name)
  90. }
  91. }
  92. return num
  93. }
  94. func (p *ActorAccount) ipStat(platform, channel string, daily int64) {
  95. var ipMap = make(map[string]int)
  96. ret, err := models.GetAllDailyRecordNewUserRegister(platform, channel, models.DailyRecordNewRegistered)
  97. if err != nil {
  98. return
  99. }
  100. for _, v := range ret {
  101. c, _ := third.GetCountryByIP(v)
  102. ipMap[c] += 1
  103. }
  104. var stat models.PlayerCountryStat
  105. stat.Daily = daily
  106. stat.Platform = platform
  107. stat.Channel = channel
  108. stat.PlayerRegisterCountry = ipMap
  109. stat.UpdateTime = mhayaTime.Now().Unix()
  110. mdb.MDB.Collection(constant.CNamePlayerCountryByIPStat).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel, "daily": daily}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
  111. }
  112. func (p *ActorAccount) levelStat(platform, channel string) {
  113. level := make(map[string]int)
  114. ret, err := models.GetAllTotalPlayerRecord(platform, channel)
  115. if err != nil {
  116. return
  117. }
  118. for _, v := range ret {
  119. level[v] += 1
  120. }
  121. var stat models.PlayerLevelStat
  122. stat.Platform = platform
  123. stat.Channel = channel
  124. stat.ServerLevel = level
  125. stat.UpdateTime = mhayaTime.Now().Unix()
  126. mdb.MDB.Collection(constant.CNamePlayerLevelStat).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
  127. }
  128. func (p *ActorAccount) dailyStat(platform, channel string, daily int64) *models.DailyRecord {
  129. var dailyRecord models.DailyRecord
  130. dailyRecord.Daily = daily
  131. dailyRecord.Platform = platform
  132. dailyRecord.Channel = channel
  133. dailyRecord.Registered = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewRegistered)
  134. dailyRecord.NewLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewLogin)
  135. dailyRecord.OldLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldLogin)
  136. dailyRecord.LoggedIn = dailyRecord.NewLogin + dailyRecord.OldLogin
  137. dailyRecord.NewActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewActive)
  138. dailyRecord.OldActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldActive)
  139. dailyRecord.ActiveUsers = dailyRecord.NewActive + dailyRecord.NewActive
  140. point, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordTotalPoints)
  141. if err == nil {
  142. dailyRecord.TotalPoints = point
  143. }
  144. u, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUProduced)
  145. if err == nil {
  146. dailyRecord.UProduced = cutils.QuoInt64ByRatioToFloat64(u, constant.MoneyRatio)
  147. }
  148. uCashOut, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUCashout)
  149. if err == nil {
  150. dailyRecord.UCashout = cutils.QuoInt64ByRatioToFloat64(uCashOut, constant.MoneyRatio)
  151. }
  152. dailyRecord.CreatedAt = mhayaTime.Now().Unix()
  153. dailyRecord.UpdatedAt = mhayaTime.Now().Unix()
  154. mdb.MDB.Collection(constant.CNamePlayerDailyRecord).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel, "daily": daily}, bson.M{"$set": &dailyRecord}, options.Update().SetUpsert(true))
  155. return &dailyRecord
  156. }
  157. // registerDevAccount 注册开发者帐号
  158. func (p *ActorAccount) registerOrLoinAccount(req *param.LoginReq) (*param.LoginResp, int32) {
  159. if strings.TrimSpace(req.OpenID) == "" || strings.TrimSpace(req.IP) == "" || strings.TrimSpace(req.Platform) == "" || strings.TrimSpace(req.Channel) == "" {
  160. return nil, code.Error
  161. }
  162. account, err := p.account.AccountRegisterOrLogin(req)
  163. if err > 0 {
  164. return nil, code.Error
  165. }
  166. return &param.LoginResp{
  167. UserName: account.UserName,
  168. OpenId: account.OpenId,
  169. }, code.OK
  170. }