actor_account.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. "github.com/mhaya/game/game_cluster/internal/third"
  13. cactor "github.com/mhaya/net/actor"
  14. "go.mongodb.org/mongo-driver/bson"
  15. "go.mongodb.org/mongo-driver/mongo/options"
  16. "strings"
  17. "time"
  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. }
  39. func (p *ActorAccount) Stat() {
  40. daily := mhayaTime.Now().DailyTOTimeStamp()
  41. var dailyRecord models.DailyRecord
  42. dailyRecord.Daily = daily
  43. platformConfig := data.PlatformConfig.GatMap()
  44. channelConfig := data.ChannelConfig.GatMap()
  45. for _, v := range platformConfig {
  46. for _, v2 := range channelConfig {
  47. p.dailyStat(v.Name, v2.Name, daily)
  48. }
  49. }
  50. }
  51. func (p *ActorAccount) playerLevelStat() {
  52. platformConfig := data.PlatformConfig.GatMap()
  53. channelConfig := data.ChannelConfig.GatMap()
  54. for _, v := range platformConfig {
  55. for _, v2 := range channelConfig {
  56. p.levelStat(v.Name, v2.Name)
  57. }
  58. }
  59. }
  60. func (p *ActorAccount) PlayerIpStat() {
  61. daily := mhayaTime.Now().DailyTOTimeStamp()
  62. platformConfig := data.PlatformConfig.GatMap()
  63. channelConfig := data.ChannelConfig.GatMap()
  64. for _, v := range platformConfig {
  65. for _, v2 := range channelConfig {
  66. p.ipStat(v.Name, v2.Name, daily)
  67. }
  68. }
  69. }
  70. func (p *ActorAccount) load() {
  71. m, err := mdb.RDB.HGetAll(context.Background(), constant.ServerLoadHKey).Result()
  72. if err != nil {
  73. return
  74. }
  75. var stat models.PlayerServerLoadStat
  76. stat.Name = "load"
  77. stat.Load = m
  78. stat.TotalUser = p.userStat()
  79. stat.UpdateTime = mhayaTime.Now().Unix()
  80. mdb.MDB.Collection(constant.CNameServerLoadStat).UpdateOne(context.Background(), bson.M{"name": "load"}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
  81. }
  82. func (p *ActorAccount) userStat() int64 {
  83. var num int64
  84. platformConfig := data.PlatformConfig.GatMap()
  85. channelConfig := data.ChannelConfig.GatMap()
  86. for _, v := range platformConfig {
  87. for _, v2 := range channelConfig {
  88. num += models.GetTotalPlayerRecordLen(v.Name, v2.Name)
  89. }
  90. }
  91. return num
  92. }
  93. func (p *ActorAccount) ipStat(platform, channel string, daily int64) {
  94. var ipMap = make(map[string]int)
  95. ret, err := models.GetAllDailyRecordNewUserRegister(platform, channel, models.DailyRecordNewRegistered)
  96. if err != nil {
  97. return
  98. }
  99. for _, v := range ret {
  100. c, _ := third.GetCountryByIP(v)
  101. ipMap[c] += 1
  102. }
  103. var stat models.PlayerCountryStat
  104. stat.Daily = daily
  105. stat.Platform = platform
  106. stat.Channel = channel
  107. stat.PlayerRegisterCountry = ipMap
  108. stat.UpdateTime = mhayaTime.Now().Unix()
  109. mdb.MDB.Collection(constant.CNamePlayerCountryByIPStat).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel, "daily": daily}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
  110. }
  111. func (p *ActorAccount) levelStat(platform, channel string) {
  112. level := make(map[string]int)
  113. ret, err := models.GetAllTotalPlayerRecord(platform, channel)
  114. if err != nil {
  115. return
  116. }
  117. for _, v := range ret {
  118. level[v] += 1
  119. }
  120. var stat models.PlayerLevelStat
  121. stat.Platform = platform
  122. stat.Channel = channel
  123. stat.ServerLevel = level
  124. stat.UpdateTime = mhayaTime.Now().Unix()
  125. mdb.MDB.Collection(constant.CNamePlayerLevelStat).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
  126. }
  127. func (p *ActorAccount) dailyStat(platform, channel string, daily int64) *models.DailyRecord {
  128. var dailyRecord models.DailyRecord
  129. dailyRecord.Daily = daily
  130. dailyRecord.Platform = platform
  131. dailyRecord.Channel = channel
  132. dailyRecord.Registered = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewRegistered)
  133. dailyRecord.NewLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewLogin)
  134. dailyRecord.OldLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldLogin)
  135. dailyRecord.LoggedIn = dailyRecord.NewLogin + dailyRecord.OldLogin
  136. dailyRecord.NewActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewActive)
  137. dailyRecord.OldActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldActive)
  138. dailyRecord.ActiveUsers = dailyRecord.NewActive + dailyRecord.NewActive
  139. point, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordTotalPoints)
  140. if err == nil {
  141. dailyRecord.TotalPoints = point
  142. }
  143. u, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUProduced)
  144. if err == nil {
  145. dailyRecord.UProduced = cutils.QuoInt64ByRatioToFloat64(u, constant.MoneyRatio)
  146. }
  147. uCashOut, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUCashout)
  148. if err == nil {
  149. dailyRecord.UCashout = cutils.QuoInt64ByRatioToFloat64(uCashOut, constant.MoneyRatio)
  150. }
  151. dailyRecord.CreatedAt = mhayaTime.Now().Unix()
  152. dailyRecord.UpdatedAt = mhayaTime.Now().Unix()
  153. mdb.MDB.Collection(constant.CNamePlayerDailyRecord).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel, "daily": daily}, bson.M{"$set": &dailyRecord}, options.Update().SetUpsert(true))
  154. return &dailyRecord
  155. }
  156. // registerDevAccount 注册开发者帐号
  157. func (p *ActorAccount) registerOrLoinAccount(req *param.LoginReq) (*param.LoginResp, int32) {
  158. if strings.TrimSpace(req.OpenID) == "" || strings.TrimSpace(req.IP) == "" || strings.TrimSpace(req.Platform) == "" || strings.TrimSpace(req.Channel) == "" {
  159. return nil, code.Error
  160. }
  161. account, err := p.account.AccountRegisterOrLogin(req)
  162. if err > 0 {
  163. return nil, code.Error
  164. }
  165. return &param.LoginResp{
  166. UserName: account.UserName,
  167. OpenId: account.OpenId,
  168. }, code.OK
  169. }