actor_account.go 6.5 KB

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