rank.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. "github.com/mhaya/game/game_cluster/internal/third"
  12. mhayaLogger "github.com/mhaya/logger"
  13. "time"
  14. )
  15. type RankBase struct {
  16. ID int `json:"id" bson:"id"`
  17. Rank int `json:"rank" bson:"rank"`
  18. score int `json:"score" bson:"score"`
  19. Status int `json:"status" bson:"status"` //0无奖励1未领取2已领取
  20. ClaimTime int64 `json:"claimTime" bson:"claimTime"`
  21. Reward []data.ItemReward `json:"reward" bson:"reward"`
  22. }
  23. type RankReward map[int]*RankBase
  24. func NewRankReward() map[int]*RankBase {
  25. return make(map[int]*RankBase)
  26. }
  27. func (r RankReward) InitRank(uid string, tp int) {
  28. ret := data.RankConfig.GetAll()
  29. for _, v := range ret {
  30. if v.Type == tp {
  31. key := GetRankKey(v.ID, 1)
  32. rank := GetPlayerRank(key, uid)
  33. score := GetPlayerRankScore(key, uid)
  34. r[v.ID] = &RankBase{
  35. ID: v.ID,
  36. Rank: rank,
  37. score: score,
  38. Status: 0,
  39. ClaimTime: 0,
  40. Reward: data.RankRewardConfig.GetRewardByRank(v.ID, rank),
  41. }
  42. if len(r[v.ID].Reward) > 0 {
  43. r[v.ID].Status = 1
  44. }
  45. }
  46. }
  47. }
  48. func GetPlayBaseKey(uid string) string {
  49. return fmt.Sprintf("%v:%v", constant.PlayerBaseKey, uid)
  50. }
  51. func GetRankKey(id, tp int) string {
  52. ret, ok := data.RankConfig.Get(id)
  53. if !ok {
  54. return ""
  55. }
  56. key := fmt.Sprintf("%s", constant.RankKey)
  57. if ret.StartTime != "" && ret.EndTime != "" {
  58. stime, err := time.Parse(ret.StartTime, mhayaTime.DateTimeFormat)
  59. if err != nil {
  60. return ""
  61. }
  62. sTime := mhayaTime.CreateFromTimestamp(stime.Unix())
  63. if sTime.After(time.Now()) {
  64. return ""
  65. }
  66. etime, err := time.Parse(ret.EndTime, mhayaTime.DateTimeFormat)
  67. if err != nil {
  68. return ""
  69. }
  70. eTime := mhayaTime.CreateFromTimestamp(etime.Unix())
  71. if eTime.Before(time.Now()) {
  72. return ""
  73. }
  74. }
  75. switch ret.Type {
  76. case 1:
  77. if tp == 0 {
  78. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().Format(mhayaTime.DateFormat))
  79. } else {
  80. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().Add(-24*time.Hour).Format(mhayaTime.DateFormat))
  81. }
  82. /* //临时修改为小时榜
  83. if tp == 0 {
  84. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.CreateFromTime(mhayaTime.Now().Hour(), 0, 0).ToDateTimeFormat())
  85. } else {
  86. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.CreateFromTime(mhayaTime.Now().Add(-1*time.Hour).Hour(), 0, 0).ToDateTimeFormat())
  87. }*/
  88. case 2:
  89. if tp == 0 {
  90. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().StartOfWeek().Format(mhayaTime.DateFormat))
  91. } else {
  92. key = fmt.Sprintf("%s:%v:%v", key, id, mhayaTime.Now().StartOfWeek().Add(-7*24*time.Hour).Format(mhayaTime.DateFormat))
  93. }
  94. }
  95. return key
  96. }
  97. func SetRank(source, isRobot int, uid string, score int) error {
  98. ret := data.RankConfig.GetAll()
  99. ctx := context.Background()
  100. i := float64(2*1e12-time.Now().UnixMilli()) / 1e13
  101. for _, v := range ret {
  102. if v.Source == source {
  103. if v.IsBot == 0 && isRobot == 1 {
  104. continue
  105. }
  106. key := GetRankKey(v.ID, 0)
  107. err := mdb.RDB.ZIncrBy(ctx, key, float64(score)+i, uid).Err()
  108. if err != nil {
  109. return err
  110. }
  111. }
  112. }
  113. return nil
  114. }
  115. func GetPlayerRank(key, uid string) int {
  116. ctx := context.Background()
  117. rank, err := mdb.RDB.ZRevRank(ctx, key, uid).Result()
  118. if err != nil {
  119. return -1
  120. }
  121. return int(rank) + 1
  122. }
  123. func GetCountryRank(key, uid string) int {
  124. ctx := context.Background()
  125. rank, err := mdb.RDB.ZRevRank(ctx, key, uid).Result()
  126. if err != nil {
  127. return -1
  128. }
  129. return int(rank) + 1
  130. }
  131. func GetCountryRankScore(key, uid string) int64 {
  132. ctx := context.Background()
  133. score, err := mdb.RDB.ZScore(ctx, key, uid).Result()
  134. if err != nil {
  135. return 0
  136. }
  137. return int64(score)
  138. }
  139. func GetPlayerRankScore(key, uid string) int {
  140. ctx := context.Background()
  141. score, err := mdb.RDB.ZScore(ctx, key, uid).Result()
  142. if err != nil {
  143. return 0
  144. }
  145. return int(score)
  146. }
  147. func GetRankList(id, tp int) map[int]*param.PlayerBase {
  148. ret, ok := data.RankConfig.Get(id)
  149. if !ok {
  150. return nil
  151. }
  152. ctx := context.Background()
  153. key := GetRankKey(id, tp)
  154. ranks, err := mdb.RDB.ZRevRangeWithScores(ctx, key, 0, int64(ret.ShowTotal)-1).Result()
  155. if err != nil {
  156. return nil
  157. }
  158. rankList := make(map[int]*param.PlayerBase)
  159. for k, v := range ranks {
  160. uid := v.Member.(string)
  161. info := mdb.RDB.HGet(ctx, constant.PlayerBaseKey, uid).Val()
  162. var playerBase param.PlayerBase
  163. jsoniter.Unmarshal([]byte(info), &playerBase)
  164. rankList[k+1] = &param.PlayerBase{
  165. UserName: playerBase.UserName,
  166. UserNameMaybe: playerBase.UserNameMaybe,
  167. Avatar: playerBase.Avatar,
  168. OpenId: playerBase.OpenId,
  169. NickName: playerBase.NickName,
  170. Rank: k + 1,
  171. Score: int(v.Score),
  172. Reward: data.RankRewardConfig.GetRewardByRank(id, k+1),
  173. }
  174. }
  175. return rankList
  176. }
  177. func SetCountryRank(ip string, item *data.ItemReward) {
  178. country, err := third.GetCountryByIP(ip)
  179. if err != nil {
  180. mhayaLogger.Warnf("Login SetCountryRank error:%v", err)
  181. return
  182. }
  183. key := fmt.Sprintf("%s", constant.CountryRankKey)
  184. ctx := context.Background()
  185. i := float64(2*1e12-time.Now().UnixMilli()) / 1e13
  186. score := item.Amount
  187. mdb.RDB.ZIncrBy(ctx, key, float64(score)+i, country)
  188. }
  189. func GetCountryRankList(countryMap map[string]*data.ContryConfigRow) map[int]*param.CountryBase {
  190. ctx := context.Background()
  191. key := fmt.Sprintf("%s", constant.CountryRankKey)
  192. ranks, err := mdb.RDB.ZRevRangeWithScores(ctx, key, 0, int64(50)-1).Result()
  193. if err != nil {
  194. return nil
  195. }
  196. rankList := make(map[int]*param.CountryBase)
  197. for k, v := range ranks {
  198. uid := v.Member.(string)
  199. rankList[k+1] = &param.CountryBase{
  200. Country: countryMap[uid].NameII,
  201. Score: int64(v.Score),
  202. Rank: k + 1,
  203. Icon: countryMap[uid].Icon_flag,
  204. }
  205. }
  206. return rankList
  207. }