account.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package models
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/go-redis/redis/v8"
  6. jsoniter "github.com/json-iterator/go"
  7. mhayaTime "github.com/mhaya/extend/time"
  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/guid"
  12. "github.com/mhaya/game/game_cluster/internal/mdb"
  13. "github.com/mhaya/game/game_cluster/internal/param"
  14. initdata "github.com/mhaya/game/game_cluster/internal/third/tg_sign"
  15. "github.com/mhaya/game/game_cluster/internal/token"
  16. clog "github.com/mhaya/logger"
  17. "go.mongodb.org/mongo-driver/bson"
  18. "go.mongodb.org/mongo-driver/mongo"
  19. "sort"
  20. "time"
  21. )
  22. type Account struct {
  23. UserName string `json:"username" bson:"userName"`
  24. Platform string `json:"platform" bson:"platform"`
  25. Account string `json:"account" bson:"account"`
  26. Channel string `json:"channel" bson:"channel"`
  27. IsPremium bool `json:"isPremium" bson:"isPremium"`
  28. LoginIp string `json:"loginIp" bson:"loginIp"`
  29. OpenId string `json:"openId" bson:"openId"`
  30. JoinIp string `json:"joinip" bson:"JoinIp"`
  31. JoinTime int64 `json:"jointime" bson:"JoinTime"`
  32. }
  33. type HomeData struct {
  34. Item ItemBasePack `json:"item"` //道具
  35. FirstItem FirstReward `json:"firstItem"` //首次登录奖励
  36. RocketLv RocketLvProgress `json:"rocketLvProgress"` //币安进度
  37. Dirty bool `json:"dirty" //是否关注tg`
  38. TotalIcorme int64 `json:"totalIcorme"`
  39. BtUserName string `json:"btUserName"` //机器人名字
  40. ChatIDName string `json:"chatIDName"` //频道名字
  41. Avatar string `json:"avatar"` //头像地址
  42. QuickLink string `json:"quickLink"` //快捷方式链接
  43. InviteStatus int `json:"inviteStatus"`
  44. }
  45. type RocketLvProgress struct {
  46. Max int `json:"max"`
  47. Cur int `json:"cur"`
  48. }
  49. func (ac *Account) AccountRegisterOrLogin(req *param.LoginReq) (*Account, int32) {
  50. var account Account
  51. ctx := context.Background()
  52. acc, err := mdb.RDB.Get(ctx, fmt.Sprintf("%v:%v", constant.CNameAccount, req.OpenID)).Bytes()
  53. if err != nil && err != redis.Nil {
  54. clog.Debugf("[Account] AccountRegisterOrLogin error: %v", err)
  55. }
  56. findFilter := bson.M{"openId": req.OpenID}
  57. if len(acc) == 0 {
  58. err = mdb.MDB.Collection(constant.CNameAccount).FindOne(context.Background(), findFilter).Decode(&account)
  59. if err != nil && err != mongo.ErrNoDocuments {
  60. clog.Errorf("Failed to AccountRegisterOrLogin select err request: %v err = %v", req, err.Error())
  61. return nil, code.LoginError
  62. }
  63. } else {
  64. err = jsoniter.Unmarshal(acc, &account)
  65. if err != nil {
  66. clog.Debugf("[Account] unmarshal AccountRegisterOrLogin data error: %v", err)
  67. return nil, code.LoginError
  68. }
  69. }
  70. // todo 测试代码
  71. curLvID, _ := mdb.RDB.Get(context.Background(), constant.RocketLvKey).Int()
  72. if curLvID < 100 {
  73. curLvID = 100
  74. mdb.RDB.Set(context.Background(), constant.RocketLvKey, curLvID, 0)
  75. }
  76. user := initdata.GetUserInfo(req.Sign)
  77. //设置IP 规则
  78. num, ok := SetPlayerBlacklistIpRecord(req.IP, req.OpenID)
  79. if ok {
  80. clog.Errorf("Failed to SetPlayerBlacklistIpRecord err request: %v,num:%v", req, num)
  81. return nil, code.LoginError
  82. }
  83. if account.OpenId != "" {
  84. if account.Platform == "on" {
  85. //统计新注册
  86. SetAppointDailyRecordNewUserRegisterHash(req.Platform, req.Channel, account.UserName, account.JoinIp, mhayaTime.CreateFromTimestamp(account.JoinTime).Unix(), DailyRecordNewRegistered)
  87. }
  88. if (len(user.Username) > 0 && account.Account != user.Username) || user.IsPremium != account.IsPremium || req.IP != account.LoginIp || account.Platform != req.Platform {
  89. account.Account = user.Username
  90. account.IsPremium = user.IsPremium
  91. account.LoginIp = req.IP
  92. account.Platform = req.Platform
  93. mdb.MDB.Collection(constant.CNameAccount).UpdateOne(context.Background(), findFilter, bson.M{"$set": bson.M{"platform": req.Platform, "account": user.Username, "isPremium": user.IsPremium, "loginIp": req.IP}})
  94. jsonData, _ := jsoniter.Marshal(&account)
  95. err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.CNameAccount, account.OpenId), jsonData, time.Hour*3*24).Err()
  96. }
  97. return &account, code.OK
  98. }
  99. devAccountTable := &Account{
  100. UserName: guid.Next(),
  101. OpenId: req.OpenID,
  102. Platform: req.Platform,
  103. Channel: req.Channel,
  104. Account: user.Username,
  105. IsPremium: user.IsPremium,
  106. LoginIp: req.IP,
  107. JoinIp: req.IP,
  108. JoinTime: mhayaTime.Now().Unix(),
  109. }
  110. _, err = mdb.MDB.Collection(constant.CNameAccount).InsertOne(context.Background(), devAccountTable)
  111. if err != nil {
  112. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  113. return nil, code.LoginError
  114. }
  115. player := NewPlayer(token.New(req.Pid, req.OpenID, devAccountTable.UserName, "", "", ""))
  116. jsonData, _ := jsoniter.Marshal(&devAccountTable)
  117. err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.CNameAccount, devAccountTable.OpenId), jsonData, time.Hour*3*24).Err()
  118. jsonData, err = jsoniter.Marshal(&player)
  119. if err != nil {
  120. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  121. return nil, code.LoginError
  122. }
  123. err = mdb.RDB.Set(ctx, fmt.Sprintf("%v:%v", constant.CNamePlayer, req.OpenID), jsonData, time.Hour*3*24).Err()
  124. if err != nil {
  125. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  126. return nil, code.LoginError
  127. }
  128. //统计新注册
  129. SetDailyRecordNewUserRegisterHash(req.Platform, req.Channel, devAccountTable.UserName, req.IP, DailyRecordNewRegistered)
  130. // 新用户触发币安升级逻辑
  131. // 当前级别
  132. lvID, _ := mdb.RDB.Get(context.Background(), constant.RocketLvKey).Int()
  133. // 当前用户数
  134. userNum, _ := mdb.MDB.Collection(constant.CNamePlayer).CountDocuments(context.Background(), bson.M{})
  135. roConfig := data.RocketLvConfig.GetAll()
  136. // 当前经验
  137. var curExperience int64
  138. // 当前升级所需经验
  139. var curLvNeed int64
  140. keys := []int{}
  141. for _, row := range roConfig {
  142. keys = append(keys, row.ID)
  143. }
  144. sort.Ints(keys)
  145. for _, id := range keys {
  146. lvRow := roConfig[id]
  147. if id == lvID {
  148. curLvNeed = int64(lvRow.LvNeed)
  149. break
  150. }
  151. curExperience += int64(lvRow.LvNeed)
  152. }
  153. //curLvID, _ := mdb.RDB.Get(context.Background(), constant.RocketLvKey).Int()
  154. //if curLvID < 100 {
  155. // curLvID = 100
  156. //}
  157. if userNum-curExperience >= curLvNeed {
  158. // 触发升级
  159. // 并发控制
  160. if lvID == curLvID {
  161. mdb.RDB.Set(context.Background(), constant.RocketLvKey, curLvID+1, 0)
  162. }
  163. }
  164. return devAccountTable, code.OK
  165. }