rank.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package models
  2. import (
  3. "context"
  4. "fmt"
  5. jsoniter "github.com/json-iterator/go"
  6. mhayaTime "github.com/mhaya/extend/time"
  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/param"
  11. "time"
  12. )
  13. type RankBase struct {
  14. ID int `json:"id" bson:"id"`
  15. Rank int `json:"rank" bson:"rank"`
  16. score int `json:"score" bson:"score"`
  17. Status int `json:"status" bson:"status"` //0无奖励1未领取2已领取
  18. ClaimTime int64 `json:"claimTime" bson:"claimTime"`
  19. Reward []data.ItemReward `json:"reward" bson:"reward"`
  20. }
  21. type RankReward map[int]*RankBase
  22. func NewRankReward() map[int]*RankBase {
  23. return make(map[int]*RankBase)
  24. }
  25. func (r RankReward) InitRank(uid string, tp int) {
  26. ret := data.RankConfig.GetAll()
  27. for _, v := range ret {
  28. if v.Type == tp {
  29. key := GetRankKey(v.ID, 1)
  30. rank := GetPlayerRank(key, uid)
  31. score := GetPlayerRankScore(key, uid)
  32. r[v.ID] = &RankBase{
  33. ID: v.ID,
  34. Rank: rank,
  35. score: score,
  36. Status: 0,
  37. ClaimTime: 0,
  38. Reward: data.RankRewardConfig.GetRewardByRank(v.ID, rank),
  39. }
  40. if len(r[v.ID].Reward) > 0 {
  41. r[v.ID].Status = 1
  42. }
  43. }
  44. }
  45. }
  46. func GetPlayBaseKey(uid string) string {
  47. return fmt.Sprintf("%v:%v", constant.PlayerBaseKey, uid)
  48. }
  49. func GetRankKey(id, tp int) string {
  50. ret, ok := data.RankConfig.Get(id)
  51. if !ok {
  52. return ""
  53. }
  54. key := fmt.Sprintf("%s", constant.RankKey)
  55. if ret.StartTime != "" && ret.EndTime != "" {
  56. stime, err := time.Parse(ret.StartTime, mhayaTime.DateTimeFormat)
  57. if err != nil {
  58. return ""
  59. }
  60. sTime := mhayaTime.CreateFromTimestamp(stime.Unix())
  61. if sTime.After(time.Now()) {
  62. return ""
  63. }
  64. etime, err := time.Parse(ret.EndTime, mhayaTime.DateTimeFormat)
  65. if err != nil {
  66. return ""
  67. }
  68. eTime := mhayaTime.CreateFromTimestamp(etime.Unix())
  69. if eTime.Before(time.Now()) {
  70. return ""
  71. }
  72. }
  73. switch ret.Type {
  74. case 1:
  75. if tp == 0 {
  76. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().Format(mhayaTime.DateFormat))
  77. } else {
  78. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().Add(-24*time.Hour).Format(mhayaTime.DateFormat))
  79. }
  80. /* //临时修改为小时榜
  81. if tp == 0 {
  82. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.CreateFromTime(mhayaTime.Now().Hour(), 0, 0).ToDateTimeFormat())
  83. } else {
  84. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.CreateFromTime(mhayaTime.Now().Add(-1*time.Hour).Hour(), 0, 0).ToDateTimeFormat())
  85. }*/
  86. case 2:
  87. if tp == 0 {
  88. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().StartOfWeek().Format(mhayaTime.DateFormat))
  89. } else {
  90. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().StartOfWeek().Add(-7*24*time.Hour).Format(mhayaTime.DateFormat))
  91. }
  92. }
  93. return key
  94. }
  95. func SetRank(source, isRobot int, uid string, score int) error {
  96. ret := data.RankConfig.GetAll()
  97. ctx := context.Background()
  98. i := float64(2*1e12-time.Now().UnixMilli()) / 1e13
  99. for _, v := range ret {
  100. if v.Source == source {
  101. if v.IsBot == 0 && isRobot == 1 {
  102. continue
  103. }
  104. key := GetRankKey(v.ID, 0)
  105. err := mdb.RDB.ZIncrBy(ctx, key, float64(score)+i, uid).Err()
  106. if err != nil {
  107. return err
  108. }
  109. }
  110. }
  111. return nil
  112. }
  113. func GetPlayerRank(key, uid string) int {
  114. ctx := context.Background()
  115. rank, err := mdb.RDB.ZRevRank(ctx, key, uid).Result()
  116. if err != nil {
  117. return -1
  118. }
  119. return int(rank) + 1
  120. }
  121. func GetPlayerRankScore(key, uid string) int {
  122. ctx := context.Background()
  123. score, err := mdb.RDB.ZScore(ctx, key, uid).Result()
  124. if err != nil {
  125. return 0
  126. }
  127. return int(score)
  128. }
  129. func GetRankList(id, tp int) map[int]*param.PlayerBase {
  130. ret, ok := data.RankConfig.Get(id)
  131. if !ok {
  132. return nil
  133. }
  134. ctx := context.Background()
  135. key := GetRankKey(id, tp)
  136. ranks, err := mdb.RDB.ZRevRangeWithScores(ctx, key, 0, int64(ret.ShowTotal)-1).Result()
  137. if err != nil {
  138. return nil
  139. }
  140. rankList := make(map[int]*param.PlayerBase)
  141. for k, v := range ranks {
  142. uid := v.Member.(string)
  143. info := mdb.RDB.HGet(ctx, constant.PlayerBaseKey, uid).Val()
  144. var playerBase param.PlayerBase
  145. jsoniter.Unmarshal([]byte(info), &playerBase)
  146. rankList[k+1] = &param.PlayerBase{
  147. UserName: playerBase.UserName,
  148. UserNameMaybe: playerBase.UserNameMaybe,
  149. Avatar: playerBase.Avatar,
  150. OpenId: playerBase.OpenId,
  151. NickName: playerBase.NickName,
  152. Rank: k + 1,
  153. Score: int(v.Score),
  154. Reward: data.RankRewardConfig.GetRewardByRank(id, k+1),
  155. }
  156. }
  157. return rankList
  158. }